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]