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] > >