Hi Luther, an alternative to contributing a DataTypeAnalyzer you could also use the annotation "DataType" on getters in your Entities so instead of doing
public static void contributeDefaultDataTypeAnalyzer MappedConfiguration<Class, String> configuration) { configuration.add(Category.class, "category"); } you could do public class User { ... @DataType("category") // DataType needn't be analyzed, because you // provide Tapestry with necessary information. public Category getCategory() { return this.category; } ... } lutherbaker schrieb: > Thanks Uli! > > > > Ulrich Stärk wrote: >> Luther Baker schrieb: >>> I have an entity that contains another entity - but this time, the >>> contained >>> entity table is quite finite - say, 10 rows. >>> >>> public class Category >>> { >>> private String name; >>> } >>> >>> public class User >>> { >>> private String firstName; >>> private String lastName; >>> private Category category; >>> } >>> >>> and in this case, I'd like to render firstName, lastName and a DROP DOWN >>> or >>> some type of picker from existing Categories. >>> >>> Would I need to create my own t:form ... and possibly use a t:BeanEditor >>> with a custom drop down/picker -- or is this type of idiom encapsulated >>> in a >>> Tapestry component already? >>> >>> Thanks much, >>> >>> -Luther >>> >> Indeed you'll have to create a BeanBlockContribution and contribute it to >> the BeanBlockSource >> service. This contribution tells tapestry where to look for the component, >> that is responsible for >> rendering your type. Additionally you'll have to contribute your type to >> the DefaultDataTypeAnalyzer >> service. That could look something along the lines of >> >> public static void contributeDefaultDataTypeAnalyzer( >> MappedConfiguration<Class, String> configuration) >> { >> configuration.add(Category.class, "category"); >> } >> >> public static void >> contributeBeanBlockSource(Configuration<BeanBlockContribution> >> configuration) >> { >> configuration.add(new BeanBlockContribution("category", >> "AppPropertyEditBlocks", "category", >> true)); >> } >> >> AppPropertyEditBlocks is the name of a page that contains a component with >> the id "category" that is >> responsible for rendering your category. In your case this would be a >> select component: >> >> @Environmental >> private PropertyEditContext context; >> >> @Component(parameters = >> { "value=context.propertyValue", "label=prop:context.label", >> "model=prop:categoryModel", "encoder=prop:categoryEncoder", >> "clientId=prop:context.propertyId", "validate=prop:validator" }) >> private Select category; >> >> @Inject >> private PropertyAccess propertyAccess; >> >> @SuppressWarnings({ "unused", "unchecked" }) >> public FieldValidator getValidator() >> { >> return context.getValidator(category); >> } >> >> public PropertyEditContext getContext() { return context; } >> >> public SelectModel<Category> getCategoryModel() >> { >> ... >> } >> >> public ValueEncoder<Category> getCategoryEncoder() >> { >> ... >> } >> with the corresponding .tml: >> >> <div xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"> >> <t:block t:id="category"> >> <t:label for="category" /> >> <t:select t:id="category" /> >> </t:block> >> </div> >> >> I believe that there is also some information about this on the wiki, >> check it out! >> >> HTH, >> >> Uli >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org >> For additional commands, e-mail: users-h...@tapestry.apache.org >> >> >> > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org