Got it. I will do in Java. I think @NonVisal is not so flexible, sometimes you want to hide this field here, but also you may want to show it there. If annotated with @NonVisal, it is always hidden by the BeanModel, and causes exception about 'not available property' if trying to access it.
Thanks! DH ----- Original Message ----- From: "Jonathan Barker" <[EMAIL PROTECTED]> To: "'Tapestry users'" <users@tapestry.apache.org> Sent: Monday, April 21, 2008 3:39 AM Subject: RE: T5: Is there a simple way to display property of embedded instance in Grid? > > 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] > >