Write Helpers For Wrapping Html Elements
Solution 1:
As you noticed, the above code does not work because the HTML Canvas emits the HTML right away. Brushes should never be stored anywhere, they are only valid a very short time. The same goes for the HTML canvas, it is very uncommon and a possible cause of bugs to store it somewhere.
The typical way to do this in Seaside is to create a helper method:
renderHorizontalLabel: aLabelRenderer andField: aFieldRenderer on: html
html div
class: 'control-group';with: [
html label
class: 'control-label';with: aLabelRenderable.
html div
class: 'controls';with: aFieldRenderer ]
The nice thing about the above code is that both aLabelRenderer
and aFieldRenderer
can be any object implementing #renderOn:
(String, Number, Block, WAPresenter, WAComponent, ...).
renderContentOn:htmlselfrenderHorizontalLabel:'Comment'andField: [
htmltextFieldvalue:comment;callback: [ :value|comment:=value ] ]
on:html.selfrenderHorizontalLabel:'Acknowledge'andField: [ self renderCheckbox: false on:html ]
on:html....
To generate the actual field you could create other methods that you then call from the block you pass in as aFieldRenderer
. This gives you the flexibility to arbitrarily compose the different parts. Have a look at the examples in Seaside, there are many users of this pattern.
Solution 2:
It looks like you want to use it like a Tag Brush, so I'd say you definitely want to go with the extending WACanvasTag approach - but only when you actually want to create a compound "tag" like in the horizontalTextField situation.
For other Bootstrap concepts - like row, container, etc, your best bet is to simply add extension methods to WAHtmlCanvas.
I've done this myself - here's my implementation of a Bootstrap NavBar tag:
WABrush subclass: #BSNavBar
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Bootstrap'
BSNavBar>>with: aBlock
superwith: [
canvas div class: 'navbar'; with: [
canvas div class: 'navbar-inner'; with: [
canvas container: aBlock]]].
closed := true
And here's how I've implemented "row" -
WAHtmlCanvas>>row
^self
div class: 'row'
WAHtmlCanvas>>row: aBlock
self row with: aBlock
In addition I added extension methods to WATagBrush to support span, offset and pull-right, as well as fluid containers:
WATagBrush>>offset: anInteger
self class: 'offset', anInteger asString
WATagBrush>>beFluid
self attributeAt: #class
put: (((self attributeAt: #class ifAbsent: [^self])
copyReplaceTokens: 'container'with: 'container-fluid')
copyReplaceTokens: 'row'with: 'row-fluid')
And finally, here's an example render method that uses some of the above:
renderContentOn:htmlhtml navBar: [
htmldivpullRight;with: [
selfsessionisLoggedInifTrue: [self renderUserMenuOn:html]
ifFalse: [self renderLoginBoxOn:html]]]
Post a Comment for "Write Helpers For Wrapping Html Elements"