DH,

For anything the least bit complicated, I do it in Java.

@Inject
BeanModelSource _bms;

@Cached
public BeanModel getBeanModel(){
        BeanModel model = _bms.create(User.class, false, _bms);
        model.include("username");
        model.add("location").sortable(true); 
        return model;
}


It has the side-benefit of keeping your templates cleaner - especially as
the lists to include / exclude get longer.

Also, have you tried using @NonVisual to hide what you want to hide?  I
haven't really used it, but it might suit your needs.

Jonathan


> -----Original Message-----
> From: ningdh [mailto:[EMAIL PROTECTED]
> Sent: Sunday, April 20, 2008 11:21 AM
> To: Tapestry users
> Subject: Re: T5: Is there a simple way to display property of embedded
> instance in Grid?
> 
> Thank you, Tobias and Jonathan, especially for Tobias's detailed work.
> 
> I find include and add can't use together, because properties of 'add'
> will be flushed and cleared by 'include' later, and this can be traced
> from source code of BeanModelUtils. For example, I want to show 'username'
> and 'city' of the user, so I write: include="username" add="location_city"
> and add t:parameter to "location_city", but in the table I can only get
> 'username' column. But if I remove include section, all the user
> information and city will be shown.
> 
> Now I can use exclude and username to get what I need, but that would be
> annoying to write so much longer exclude expression.
> 
> So is it a known issue?
> 
> Thanks.
> DH
> ----- Original Message -----
> From: "Jonathan Barker" <[EMAIL PROTECTED]>
> To: "'Tapestry users'" <users@tapestry.apache.org>
> Sent: Saturday, April 19, 2008 11:26 AM
> Subject: RE: T5: Is there a simple way to display property of embedded
> instance in Grid?
> 
> 
> >
> >
> > I'll add to this and say that if you want sorting behavior, you can
> > implement Comparable and Comparator (I don't remember which you need - I
> > tend to implement both), and add "location" to your model.
> >
> > IIRC, you will need to build your model in code to say that the
> "location"
> > column is sortable.
> >
> >
> > Jonathan
> >
> >
> >> -----Original Message-----
> >> From: Tobias Wehrum [mailto:[EMAIL PROTECTED]
> >> Sent: Friday, April 18, 2008 5:20 AM
> >> To: Tapestry users
> >> Subject: Re: T5: Is there a simple way to display property of embedded
> >> instance in Grid?
> >>
> >> Hi DH,
> >>
> >> it would be:
> >>
> >> -----------------------------------------------------------------------
> >> <table t:type="grid" t:source="userSource" row="currentUser"
> >> add="location_city">
> >>     <t:parameter name="location_citycell">
> >> ${currentUser.location.city}
> >>     </t:parameter>
> >> </table>
> >> -----------------------------------------------------------------------
> >>
> >> (Note the "add" instead of include - you want to add something not
> already
> >> existing, not include something.)
> >>
> >> On your page you have to define
> >>
> >> -----------------------------------------------------------------------
> >> @Parameter
> >> User userSource;
> >> -----------------------------------------------------------------------
> >>
> >> to keep track of the current grid object.
> >> So much for the first method.
> >>
> >>
> >> If you want to have to have a Location always represented as a String
> >> containing its city toString():
> >>
> >> -----------------------------------------------------------------------
> >> class Location {
> >> // [...]
> >> public String toString() {
> >> return city;
> >> }
> >> }
> >> -----------------------------------------------------------------------
> >>
> >> Now you have to define a Translator for Tapestry (I use a template for
> all
> >> classes which implement toString()):
> >>
> >> -----------------------------------------------------------------------
> >> public class ModelTranslator<ModelClass> implements
> Translator<ModelClass>
> >> {
> >>
> >>    public Class<ModelClass> getType() {
> >>        return null;
> >>    }
> >>
> >>    public ModelClass parseClient(String arg0, Messages arg1)
> >>            throws ValidationException {
> >>        throw new ValidationException("ModelTranslator cannot
> >> implement parseClient()");
> >>    }
> >>
> >>    public String toClient(ModelClass arg0) {
> >>        return arg0.toString();
> >>    }
> >>
> >> }
> >> -----------------------------------------------------------------------
> >>
> >> Now you only have to announce your Translator in to your
> AppModule.java:
> >>
> >> -----------------------------------------------------------------------
> >>     @SuppressWarnings("unchecked")
> >>     public static void
> >> contributeDefaultDataTypeAnalyzer(MappedConfiguration<Class, String>
> >> configuration) {
> >>     configuration.add(User.class, "user");
> >>     }
> >>
> >>     @SuppressWarnings("unchecked") {
> >>     configuration.add("user", new ModelTranslator<User>());
> >>     }
> >> -----------------------------------------------------------------------
> >>
> >> ...and after doing this, you have to do exactly *nothing* to add it to
> >> your grid - it will do so per default. :)
> >>
> >> Tobias
> >>
> >>
> >> dhning schrieb:
> >>
> >> > Hi, Tobias
> >> >
> >> > Thanks for reply.
> >> >
> >> > I am newbie of customizing grid component.
> >> > I guess what you mean like this?:
> >> > <table t:type="grid" t:source="userSource" include="location_city">
> >> >     <t:parameter name="location_cityheader">
> >> >     </t:parameter>
> >> >     <t:parameter name="location_citycell">
> >> >     </t:parameter>
> >> > </table>
> >> >
> >> > But exception message still exists: "Bean editor model for User does
> not
> >> contain a property named 'location_city'".
> >> >
> >> > Thanks!
> >> >
> >> > DH
> >> >
> >> >
> >> > ----- Original Message -----
> >> > From: "Tobias Wehrum" <[EMAIL PROTECTED]>
> >> > To: "Tapestry users" <users@tapestry.apache.org>
> >> > Sent: Friday, April 18, 2008 4:20 PM
> >> > Subject: Re: T5: Is there a simple way to display property of
> embedded
> >> instance in Grid?
> >> >
> >> >
> >> >
> >> >> Hi DH,
> >> >>
> >> >> you can teach Location a standard way to be outputted by overwriting
> >> the
> >> >> toString() function of Location.
> >> >>
> >> >> Now you can output the String returned by toString() simply by
> >> including
> >> >> "location".
> >> >>
> >> >> If you want to output different properties of Location and not in
> one
> >> >> cell, I think you will have to add location_city, location_street
> etc
> >> >> and implement <t:parameter> blocks for it.
> >> >>
> >> >> Hope that helps,
> >> >> Tobias
> >> >>
> >> >> dhning schrieb:
> >> >>
> >> >>> Hi, All
> >> >>>
> >> >>> Case: A user own a location while the location is comprised of
> city,
> >> street...
> >> >>> public class User {
> >> >>>   private Location location;
> >> >>>   // setter & getter
> >> >>> }
> >> >>> public class Location {
> >> >>>   private String city;
> >> >>>  // setter & getter
> >> >>> }
> >> >>>
> >> >>> In the user list page, I want to display the city as one column in
> >> Grid.
> >> >>> But it doesn't work like this <table t:type="grid"
> >> t:source="userSource" include="location.city"></table>.
> >> >>> The exception message is "User does not contain a property named
> >> 'location.city'".
> >> >>>
> >> >>> Is there a simple way to implement such function?
> >> >>>
> >> >>> Thanks in advance.
> >> >>> DH
> >> >>>
> >> >> --------------------------------------------------------------------
> -
> >> >> To unsubscribe, e-mail: [EMAIL PROTECTED]
> >> >> For additional commands, e-mail: [EMAIL PROTECTED]
> >> >>
> >> >>
> >> > >
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: [EMAIL PROTECTED]
> >> For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to