On Sat, Jan 29, 2022 at 8:13 PM Jonathan Meijer <jonny.mei...@gmail.com>
wrote:

> Thank you to both for your replies.
>

My pleasure to help!


> After reading and rereading the documentation, I'm getting a much better
> understanding of how (and how not) to use Tapestry.
>

Tapestry does have some concepts you need to understand well to use the
framework well.


> I'm trying to integrate with Cayenne without using the outdated integration
> module, and so far it's going well and I figured out my way around the
> coercion. Since my background is in WebObjects, I had to get used to this
> completely different paradigm.
>

Interesting! As far as I remember, WebObjects was an inspiration for
Tapestry in the beginning.


>
> Jonathan
>
> On Thu, Jan 27, 2022, 16:26 Thiago H. de Paula Figueiredo <
> thiag...@gmail.com> wrote:
>
> > On Fri, Jan 21, 2022 at 12:56 AM Jonathan Meijer <jonny.mei...@gmail.com
> >
> > wrote:
> >
> > > Hi,
> > >
> >
> > Hi!
> >
> >
> > > New Tapestry user here, started with a bootstrapped 5.7.3 and
> > > experimenting.
> > >
> >
> > Welcome to Tapestry! We just released 5.8.0, by the way.
> >
> >
> > >   <t:actionlink t:id="delete" context="test">Delete</t:actionlink>
> > >
> >
> > I suggest using EventLink instead of ActionLink. Very similar, but easier
> > and more elegant to use.
> >
> > <t:eventlink event="delete" context="test">Delete</t:eventlink>
> >
> > Object onDelete(...) { ... }
> >
> >
> > >   What am I doing wrong?  There is really no room for error, the Blah
> > class
> > > is defined right there in the same class and the current row object has
> > > absolutely no reason to be converted to String.
> > >
> >
> > You passed an instance of Blah as the context of an ActionLink. This
> > component needs to know how to convert Blah to a string to be put in the
> > link's URL and how to do the conversion back so Tapestry can provide the
> > Blah instance to be passed to the event handler method when you click the
> > link. This is done by implementing the ValueEncoder instance for your
> class
> > then contributing it to the ValueEncoderSource service. Internally, when
> a
> > ValueEncoder isn't found for a given type, Tapestry tries to fallback on
> > using a coercion from String to type and type to String from the
> > TypeCoercer service. That's why I'm suggesting ValueEncoder and Voker is
> > suggesting a coercion and both solutions are valid. :) I just prefer the
> > ValueEncoder route in this case because it's specific for URLs (including
> > page activation context, event handler parameters, etc) and TypeCoercer
> is
> > more general-purpose conversions, specially for component and page
> > parameters (for example, Grid's source parameter receives a
> GridDataSource
> > but you can pass a List to it).
> >
> > Example of ValueEncoder usage:
> >
> > public class BlahValueEncoder implements ValueEncoder<Blah> {
> >     public String toClient(Blah value) {
> >         (...)
> >     }
> >
> >     public Blah toValue(String clientValue)
> >     {
> >         (...)
> >     }
> > }
> >
> > In AppModule:
> >
> >     public static void
> > contributeValueEncoderSource(MappedConfiguration<Class, Object>
> > configuration) {
> >         configuration.add(Blah.class, new BlahValueEncoder()); // or,
> with
> > dependency injection: configuration.addInstance(Object.class,
> > BlahValueEncoder.class);
> >     }
> >
> >
> >
> > >
> > > Kindly help,
> > >
> > > Jonathan
> > >
> >
> >
> > --
> > Thiago
> >
>


-- 
Thiago

Reply via email to