You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Thomas Beckmann <th...@freiheit.com> on 2007/08/11 21:56:00 UTC
T5: accessing component variable
Hi,
I'm looking for a way to access a component variable the same way as a page
variable.
So for example when using a loop component I want to provide a setter and
getter of a component as the loop value instead of a setter and getter of the
page.
I want to implement a component that works as a loop but provides a list of
elements on it's own. I want to use this component on any page without the
need to implement a loop value on each page.
I tried value="component:someComponent.someMethod" but got an error telling
that there is no such component.
Any ideas?
Thanks
Thomas
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org
Re: T5: accessing component variable
Posted by Davor Hrg <hr...@gmail.com>.
component binding is meant only for retreiving a component,
you can add you own binding
http://wiki.apache.org/tapestry/Tapestry5HowToAddBindingPrefix
the impl that suites your need is probably this:
add to your app module:
public static void contributeBindingSource(
MappedConfiguration<String, BindingFactory> configuration,
BindingSource bindingSource)
{
configuration.add("cprop",new
ComponentPropBindingFactory(bindingSource));
}
create the binding factory: ComponentPropBindingFactory.java:
package test.tapestry.services;
import org.apache.tapestry.Binding;
import org.apache.tapestry.ComponentResources;
import org.apache.tapestry.TapestryConstants;
import org.apache.tapestry.ioc.Location;
import org.apache.tapestry.runtime.Component;
import org.apache.tapestry.services.BindingFactory;
import org.apache.tapestry.services.BindingSource;
/** The "cprop:" binding prefix, which allows access to a child component's
prop via
* normal prop: expression prefixed with component id.*/
public class ComponentPropBindingFactory implements BindingFactory
{
private final BindingSource _propBindingFactory;
public ComponentPropBindingFactory(BindingSource bindingSource){
_propBindingFactory = bindingSource;
}
public Binding newBinding(String description, ComponentResources
container, ComponentResources component,
String expression, Location location)
{
int idx=expression.indexOf(".");
ComponentResources propSource = null;
if(idx == -1)
throw new RuntimeException("Invalid expression:
'"+expression+"'. You must provide component id ");
else{
String componentId = expression.substring(0,idx);
expression = expression.substring(idx+1);
Component embeddedComponent = container.getEmbeddedComponent
(componentId);
if(embeddedComponent == null) throw new
RuntimeException("Component "+componentId+" not found");
propSource = embeddedComponent.getComponentResources();
}
return _propBindingFactory.newBinding(description, propSource,
component, TapestryConstants.PROP_BINDING_PREFIX, expression, location);
}
}
test it:
page class: ${class}<br/>
<t:loop id="loop" source="data" value="value">
${value}, loop class: ${cprop:loop.class}<br/>
</t:loop>
On 8/11/07, Thomas Beckmann <th...@freiheit.com> wrote:
>
>
> Our customer should be able to place a component in any of the available
> page
> templates. He has no access to the Page classes. The component works as a
> loop component but instead of providing a list of elements to the
> component,
> the user has to provide a query string and the component uses an injected
> service to get the list. The customer will write the body part of the loop
> on
> his own but he needs a loop variable to access the properties of the
> elements.
>
> For example:
>
> <t:ProductLoop
> t:id="cheapestProducts"
> t:query="cheapest products"
> t:value="product">
> <a class="small_pic" ><img src="${product.image}" /></a>
> </t:ProductLoop>
>
> One solution is to implement a setProduct() and getProduct() in every page
> but
> I'm looking for a solution that is independent of the page.
>
> Thomas
>
> Am Samstag, 11. August 2007 22:34 schrieb Davor Hrg:
> > please elaborate your use case a bit more,
> > maybe an alternative will be sufficient.
> >
> > Davor Hrg
> >
> > On 8/11/07, Thomas Beckmann <th...@freiheit.com> wrote:
> > > Hi,
> > >
> > > I'm looking for a way to access a component variable the same way as a
> > > page
> > > variable.
> > > So for example when using a loop component I want to provide a setter
> > > and getter of a component as the loop value instead of a setter and
> > > getter of the
> > > page.
> > > I want to implement a component that works as a loop but provides a
> list
> > > of
> > > elements on it's own. I want to use this component on any page without
> > > the need to implement a loop value on each page.
> > >
> > > I tried value="component:someComponent.someMethod" but got an error
> > > telling
> > > that there is no such component.
> > >
> > > Any ideas?
> > >
> > > Thanks
> > > Thomas
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> > > For additional commands, e-mail: users-help@tapestry.apache.org
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>
Re: T5: accessing component variable
Posted by Thomas Beckmann <th...@freiheit.com>.
Our customer should be able to place a component in any of the available page
templates. He has no access to the Page classes. The component works as a
loop component but instead of providing a list of elements to the component,
the user has to provide a query string and the component uses an injected
service to get the list. The customer will write the body part of the loop on
his own but he needs a loop variable to access the properties of the
elements.
For example:
<t:ProductLoop
t:id="cheapestProducts"
t:query="cheapest products"
t:value="product">
<a class="small_pic" ><img src="${product.image}" /></a>
</t:ProductLoop>
One solution is to implement a setProduct() and getProduct() in every page but
I'm looking for a solution that is independent of the page.
Thomas
Am Samstag, 11. August 2007 22:34 schrieb Davor Hrg:
> please elaborate your use case a bit more,
> maybe an alternative will be sufficient.
>
> Davor Hrg
>
> On 8/11/07, Thomas Beckmann <th...@freiheit.com> wrote:
> > Hi,
> >
> > I'm looking for a way to access a component variable the same way as a
> > page
> > variable.
> > So for example when using a loop component I want to provide a setter
> > and getter of a component as the loop value instead of a setter and
> > getter of the
> > page.
> > I want to implement a component that works as a loop but provides a list
> > of
> > elements on it's own. I want to use this component on any page without
> > the need to implement a loop value on each page.
> >
> > I tried value="component:someComponent.someMethod" but got an error
> > telling
> > that there is no such component.
> >
> > Any ideas?
> >
> > Thanks
> > Thomas
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> > For additional commands, e-mail: users-help@tapestry.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org
Re: T5: accessing component variable
Posted by Davor Hrg <hr...@gmail.com>.
please elaborate your use case a bit more,
maybe an alternative will be sufficient.
Davor Hrg
On 8/11/07, Thomas Beckmann <th...@freiheit.com> wrote:
>
> Hi,
>
> I'm looking for a way to access a component variable the same way as a
> page
> variable.
> So for example when using a loop component I want to provide a setter and
> getter of a component as the loop value instead of a setter and getter of
> the
> page.
> I want to implement a component that works as a loop but provides a list
> of
> elements on it's own. I want to use this component on any page without the
> need to implement a loop value on each page.
>
> I tried value="component:someComponent.someMethod" but got an error
> telling
> that there is no such component.
>
> Any ideas?
>
> Thanks
> Thomas
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>