I wrote a small custom menu component that includes or doesn't include an
anchor href based on the href of the current page.

I wonder if the block approach suggested here would be cleaner? I use the
following idiom:

<t:if test="different" xmlns:t="
http://tapestry.apache.org/schema/tapestry_5_0_0.xsd";>
        <t:body/>
    <t:parameter name="else">
        <t:pageLink page="${targetAnchorHref}"><t:body/></t:pageLink>
    </t:parameter>
</t:if>

to render this pseudo-dynamically (notice that 'about' has no anchor tag):

<ul>
  <li><a href="home">home</a></li>
  <li><a href="contact">contact</a></li>
*  <li>about</li>
*</ul>


The JAVA:

public class CondLink
{
    @Property
    @Parameter(required=true, defaultPrefix="literal")
    private String currentAnchorHref;

    @Property
    @Parameter(required=true, defaultPrefix="literal")
    private String targetAnchorHref;

    public boolean isDifferent()
    {
        return this.currentAnchorHref.equals(this.targetAnchorHref);
    }
}


The ConditionalLink.tml:

<t:if test="different" xmlns:t="
http://tapestry.apache.org/schema/tapestry_5_0_0.xsd";>
        <t:body/>
    <t:parameter name="else">
        <t:pageLink page="${targetAnchorHref}"><t:body/></t:pageLink>
    </t:parameter>
</t:if>


The LAYOUT - HtmlShell.tml:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
<html xmlns="http://www.w3.org/1999/xhtml"; xmlns:t="
http://tapestry.apache.org/schema/tapestry_5_0_0.xsd";>
...
        <div id="header">
            <ul class="horizRight">
                <li><t:condLink currentAnchorHref="${currentAnchorHref}"
targetAnchorHref="${message:viewNotes-anchorHref}">${message:viewNotes-anchorLabel}</t:condLink></li>
                <li><t:condLink currentAnchorHref="${currentAnchorHref}"
targetAnchorHref="${message:addNote-anchorHref}">${message:addNote-anchorLabel}</t:condLink></li>
                <li><t:condLink currentAnchorHref="${currentAnchorHref}"
targetAnchorHref="${message:home-anchorHref}">${message:home-anchorLabel}</t:condLink></li>
            </ul>
...
</html>


The PAGE: index.tml

<t:htmlShell currentAnchorHref="${message:self-anchorHref}"
currentHeadTitle="${message:self-headTitle}"
currentBodyTitle="${message:self-bodyTitle}" xmlns:t="
http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"; xml:space="preserve">
    <ul class="horizLeft">
       <li><t:pageLink
page="${message:add-anchorHref}">${message:add-anchorLabel}</t:pageLink></li>

       <li><t:pageLink
page="${message:view-anchorHref}">${message:view-anchorLabel}</t:pageLink></li>
    </ul>
</t:htmlShell>


On Thu, Oct 2, 2008 at 9:19 AM, Ulrich Stärk <[EMAIL PROTECTED]> wrote:

> That's a really nice solution. Have to keep that in mind.
>
> Uli
>
> Am Do, 2.10.2008, 15:49, schrieb Filip S. Adamsen:
> > Hi,
> >
> > Define Blocks containing the different states you need and use a
> > Delegate to render the block you need based on an expression. This way
> > you can do the whole if-then-else/switch stuff in your page class.
> >
> > Template:
> >
> >    <t:block t:name="block1">...</t:block>
> >    <t:block t:name="block2">...</t:block>
> >
> >    <t:delegate t:to="activeblock">
> >
> > Class:
> >
> >    @Inject
> >    private ComponentResources resources;
> >
> >    public Block getActiveBlock() {
> >      String blockId = ...;
> >      return resources.getBlock(blockId);
> >    }
> >
> > It's also possible to have the blocks on another page, in that case you
> > can get the page through ComponentSource#getPage, get its
> > ComponentResources, and go from there.
> >
> > http://tapestry.apache.org/tapestry5/guide/templates.html (see <block>)
> >
> http://tapestry.apache.org/tapestry5/apidocs/org/apache/tapestry5/Block.html
> >
> http://tapestry.apache.org/tapestry5/tapestry-core/ref/org/apache/tapestry5/corelib/components/Delegate.html
> >
> http://tapestry.apache.org/tapestry5/apidocs/org/apache/tapestry5/ComponentResourcesCommon.html#getBlock(java.lang.String)<http://tapestry.apache.org/tapestry5/apidocs/org/apache/tapestry5/ComponentResourcesCommon.html#getBlock%28java.lang.String%29>
> >
> http://tapestry.apache.org/tapestry5/apidocs/org/apache/tapestry5/services/ComponentSource.html#getPage(java.lang.Class)<http://tapestry.apache.org/tapestry5/apidocs/org/apache/tapestry5/services/ComponentSource.html#getPage%28java.lang.Class%29>
> >
> > -Filip
> >
> > On 2008-10-02 14:39, János Jarecsni wrote:
> >> Hi Uli,
> >>
> >> thanks, I did not know about these. However, what if I have to switch
> >> between more states? If seems to be awkward in that case (if embedding
> >> is
> >> possible at all).
> >>
> >> Thanks
> >> Janos
> >>
> >> 2008/10/1 Ulrich Stärk <[EMAIL PROTECTED]>
> >>
> >>> Have a look at the If
> >>> (
> >>>
> http://tapestry.apache.org/tapestry5/tapestry-core/ref/org/apache/tapestry5/corelib/components/If.html
> >>> )
> >>> and Zone
> >>> (
> >>>
> http://tapestry.apache.org/tapestry5/tapestry-core/ref/org/apache/tapestry5/corelib/components/Zone.html
> >>> )
> >>> components.
> >>>
> >>> Uli
> >>>
> >>> Am Mi, 1.10.2008, 17:06, schrieb János Jarecsni:
> >>>> Hi guys,
> >>>>
> >>>> is there a way to change the template (piece of the template) which
> >>>> gets
> >>>> generated, depending on state? Here is what I mean:
> >>>> Given a component C, its C.tml looks like the following:
> >>>>
> >>>> <html>blabla...
> >>>>
> >>>> //if (loggedIn)
> >>>> Logged in
> >>>> //else
> >>>> Not Logged in
> >>>>
> >>>> </html>
> >>>>
> >>>> Of course I know this concrete problem can be solved using expansion.
> >>>> But
> >>>> I'm now after replacing large chunks of the template depending on
> >>>> state.
> >>>> It
> >>>> is easy to do so in a JSP page for example.
> >>>>
> >>>> Thanks in advance,
> >>>> janos
> >>>>
> >>>
> >>>
> >>> ---------------------------------------------------------------------
> >>> 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]
>
>

Reply via email to