Hi Thiago, Thank you for your reply.
Yes, I know that the correct subject would be “adding components dynamically to a page” and not the “create” term. I develop the solution bellow that works fine for me: <div class="row"> <t:loop source="widgets" value="widget"> <t:delegate to="dynamicWidget"/> </t:loop> <t:block t:id="widgetsDefinition"> <t:widgets.widgetTest1 t:id="widget1" /> <t:widgets.widgetTest2 t:id="widget2" /> </t:block> </div> And my .java: public Object getDynamicWidget(){ WidgetFacade widgetFacade = (WidgetFacade) componentSource.getComponent("Index:" + widget.getWidget().getComponentId()); Map<String, String> configuration = new HashMap<String, String>(); for(WidgetConfiguration conf : widget.getConfigurations()){ configuration.put(conf.getConfigurationKey(), conf.getConfigurationValue()); } widgetFacade.init(configuration); return widgetFacade; } I wanted to skip the block “widgetsDefinition” but it’s not possible. Thank you Best regards Carlos Montero > El 12/4/2018, a las 21:55, Thiago H. de Paula Figueiredo <thiag...@gmail.com> > escribió: > > On Thu, Apr 12, 2018 at 1:52 PM, Carlos Montero Canabal < > carlosmonterocana...@gmail.com> wrote: > >> Hi tapestry users, >> > > Hello! > > Being pedantic and accurate, the subject line of your e-mail is incorrect: > Tapestry 5 doesn't support adding components dynamically to a page or > component. The structure of pages and components are strictly static. You > need to declare a component in a template in order to use it. There are no > exceptions. > > On the other hand, you have all the freedom to run your templates in any > way you choose, with logic dictating what gets actually rendered. > > >> I’m developing a configurable dashboard page where a user can select >> different widgets to his own dashboard. I’m thinking on save on database >> the widgets with his configuration per user. I would like to do something >> like this: >> >> <t:loop source="widgets" value="widget"> >> <t:delegate to=“createWidget”/> >> </t:loop> >> >> And in my page class something like: >> >> public Block getCreateWidget(){ >> >> return componentSource.getComponent(widget.getComponentClassName()); >> <!-— This method “getComponent” by name/class doesn´t exists, only for >> logical page names —> >> } >> >> Where widget.getComponentClassName() returns, for example, >> "components/Widget1” or “my.package.components.Widget1". >> >> Do you know if it’s possible this approach on Tapestry5?? With pages it >> works fine (I do it multiple times for email rendering), but with >> components I don’t found a method o service… >> > > Using the Delegate component to dynamically choose which Block or component > instance to render is correct. On the other hand, the getCreateWidget() > method as described above won't work at all. > > What actually works is declaring <t:block>s in a page, using > ComponentSource.getPage() to get an instance of that page, which is > returned as a Component instance, then calling > getComponentResources().getBlock(String id) to get the Block instance to > pass to the Delegate component. That's exactly how the BeanModel-based > components, such as Grid, BeanEditor, BeanDisplay and BeanEditForm work. > > >> Thank you everyone >> >> Best regards >> >> Carlos Montero >> >> http://tapestry5.dev-util.com/ <http://tapestry5.dev-util.com/> >> >> >> > > > -- > Thiago