[Seaside] option/selected and s-exprs?

Ragnar Hojland Espinosa seaside@lists.squeakfoundation.org
Tue, 30 Jul 2002 20:28:28 +0200


On Tue, Jul 30, 2002 at 11:00:42AM -0700, Avi Bryant wrote:
> On Tue, 30 Jul 2002, Ragnar Hojland Espinosa wrote:
> 
> > I want to do something very simple.  I want to display a listbox of
> > companies, with the company with the id that matches with instance variable
> > companyID selected.
> 
> First, a note about this - I gather from your other posts that you're
> interacting a lot with SQL databases, and that companyID is a primary key.
> Seaside goes a lot smoother when you work with references to objects
> instead of primary keys - I would recommend looking into an OR mapping
> like Glorp, or rolling a simple on yourself.  But that's a side issue.

Thanks, I'll look into that.  I'm trying to get a decent app together in a
language I dont know, under an app server I don't know, and probabily without
knowing about tools i should be using either.  And sort of time pressed.  A nice
reciepe ;) 

> > addHandlers
> > (template elementName: 'ExMyComponent')
> > 	  onDisplay: [:d | self populate)
> 
> I don't really understand what this is doing here - the point of
> onDisplay: is to synchronize the parent's state with the child, but
> clearly that's not happening here (why are you calling "self populate" on
> the parent every time a particular child is displayed?).  If you want
> something to happen every time the page is shown, put it in #aboutToView.

Aha.  Okay thanks.  Yes, the form in this case was tagged as ExMyComponent
to fillit up. Out of curiosity, is there a particular problem with my workaround?  

> > html
> > "fragment of.."
> > (select (name '@c/companies'
> > 	(option name: 'companyID' value: '[c.companyid]' '[c.companyname]') ))
> 
> is "name" supposed to be an attribute of the select tag?  In which case it
> should be
> 
> (select name: '@c/companies'

Good catch.. that was a typo in my post.

> And you haven't made your option tag dynamic.  You could try this:
> 
> (select name: '@c/companies'
>   (option name: '@companyID'
>     '[c.companyName]'))

Yeah, same as above.  

> Except that by default it'll be trying to match the company ("c") with
> companyID, since that's what you're iterating over (option tags look at
> the top of the locals stack by default).  This would be an example of
> things going smoother when you use real object references...

Figured just up to there.. then it was time to pray to the seaside gods for
assistance ;)

> Since you're using primary keys, it's a bit messier.  Setting the value
> attribute to 'c.companyID' was the right idea, but as you point out,
> the [] syntax doesn't work inside attributes.  So you need to do it in
> addHandlers instead:
> 
> addHandlers
>   (template elementNamed: 'companyID')
>     onDisplay:
>        [:option |
>        option attributeAt: 'value' put: ((locals at: #c) companyID).
>        option defaultDisplayEvent]
> 
> I think that should work for you.

Thtat was it.  Since c is a Dictionary, it ended up looking as:

      option attributeAt: 'value' put: ((locals at: #c) at: 'companyid').

Nowwww.. could you explain what does (locals at: #c) and why do you need to
do the option defaultDisplayEvent so we clueless people don't have to play
monkey? :)

-- 
Ragnar Hojland - Project Manager
Linalco "Especialistas Linux y en Software Libre"
Tel: +34-91-5970074 Fax: +34-91-5970083