[Seaside] trouble with submit buttons
Michel Bany
m.bany at wanadoo.fr
Fri Aug 5 09:16:35 CEST 2005
Julian Fitzell a écrit :
>
> How's it implemented, by the way, Michel? Just looking up the stack
> on the renderer?
>
No look-up of the stack, I made it explicit by adding a "tagStack" i-var
to WAHtmlDocument
and the following interface :
clearTagStack
isWithinTag:
popTag
pushTag:
and by changing a handfull of classes to use this interface.
I just tried it and found out that the distributed version of this
goodie (7.3.1) is broken.
I am attaching a less-broken version of the code, this may help the
Squeak implementers.
Not sure it works OK with canvas. Also, my code does not make the
feature configurable.
Enjoy,
Michel.
-------------- next part --------------
'From VisualWorks®, 7.3.1 of mercredi 20 avril 2005 on vendredi 5 août 2005 at 9:10:18'!
Smalltalk.Seaside defineClass: #WAHtmlDocument
superclass: #{Core.Object}
indexedType: #none
private: false
instanceVariableNames: 'root tagStack '
classInstanceVariableNames: ''
imports: ''
category: 'Seaside-Document'!
!Seaside.WAFormTag methodsFor: 'as yet unclassified'!
with: aBlock
self isWithinForm
ifFalse: [super with: aBlock]
ifTrue:
[canvas nest: aBlock.
isClosed := true]! !
!Seaside.WAFormTag methodsFor: 'stack operations'!
isWithinForm
^self document isWithinTag: self tag! !
!Seaside.WAHtmlCanvas methodsFor: 'as yet unclassified'!
tag: aString
aString = 'form' ifTrue: [^self form].
^self brush: (WAGenericTag tag: aString)! !
!Seaside.WAAbstractHtmlBuilder methodsFor: 'basic markup'!
tag: aString do: anObject
(aString = 'form' and: [self isWithinForm])
ifTrue:
[self error: 'Nested form'.
^self render: anObject].
self openTag: aString.
self render: anObject.
self closeTag: aString! !
!Seaside.WAAbstractHtmlBuilder methodsFor: 'stack operations'!
isWithinForm
^self document isWithinTag: 'form'! !
!Seaside.WAHtmlRenderer methodsFor: 'convenience'!
form: aBlock
self isWithinForm
ifTrue:
[attributeBuffer := nil.
^aBlock value].
self
formWithMethod: 'post'
action: context actionUrl urlString
do:
[self div:
[context actionUrl parameters keysAndValuesDo:
[:k :v |
self
inputWithType: 'hidden'
named: k
value: v].
aBlock value]]! !
!Seaside.WAHtmlDocument methodsFor: 'as yet unclassified'!
initializeWithRoot: aRoot
root := aRoot.
self clearTagStack! !
!Seaside.WAHtmlDocument methodsFor: 'stack operations'!
clearTagStack
tagStack := OrderedCollection new!
isWithinTag: aString
^tagStack includes: aString!
popTag
^tagStack removeLast!
pushTag: aString
tagStack add: aString! !
!Seaside.WAPrettyPrintedDocument methodsFor: 'as yet unclassified'!
closeTag: aString
indentLevel := indentLevel - 1.
indentCloseTags removeLast
ifTrue:
[html break.
indentLevel timesRepeat: [html space]].
(self shouldPrintCloseTagFor: aString)
ifTrue:
[html text: '</'.
html spanClass: (self cssClassFor: aString) with: [html text: aString].
html text: '>'].
self popTag!
initializeWithRenderer: aRenderer
html := aRenderer.
indentCloseTags := OrderedCollection with: false.
indentLevel := 0.
self clearTagStack!
openTag: aString attributes: anAttributes
html break.
indentLevel timesRepeat: [html space].
html text: '<'.
html spanClass: (self cssClassFor: aString) with: [html text: aString].
self attributes: anAttributes.
(self shouldPrintCloseTagFor: aString)
ifFalse:
[html
space;
text: '/'].
html text: '>'.
indentLevel := indentLevel + 1.
indentCloseTags
removeLast;
addLast: true;
addLast: false.
self pushTag: aString! !
!Seaside.WAHtmlStreamDocument methodsFor: 'as yet unclassified'!
closeTag: aString
self writeCloseTag: aString on: self bodyStream.
self popTag!
openTag: aString attributes: anAttributes
self
writeOpenTag: aString
attributes: anAttributes
on: self bodyStream.
self pushTag: aString! !
More information about the Seaside
mailing list