CustomTagsInShell

If you (as in my case) want to put some HTML meta tags in your pages AFAIK the easiest solution is to provide a custom delegate to the Shell component which outputs the tags you need.

First you have to define a Shell component in the HTML template (most preferable in the one of a custom Border component):

<span jwcid="$content$">
<html jwcid="shell">
<body jwcid="@Body">
...

In the page specification (or component specification if you use a custom Border component) you have to add the following to bind the delegate bean to the Shell component:

<bean name="shellDelegate" class="ShellDelegate"/>

<component id="shell" type="Shell">
    <binding name="delegate" value="bean:shellDelegate"/>
</component>

An example ShellDelegate bean could look like:

import java.util.Locale;

import org.apache.tapestry.IMarkupWriter;
import org.apache.tapestry.IRender;
import org.apache.tapestry.IRequestCycle;

public class ShellDelegate implements IRender
{
        public void render(IMarkupWriter writer, IRequestCycle cycle)
        {
                addMetaTag(writer, "copyright", "YOUR_COPYRIGHT_NOTICE");
                addMetaTag(writer, "author", "YOUR_NAME");
                addMetaTag(writer, "robots", "Index,Follow");
                
                Locale locale = cycle.getEngine().getLocale();
                if (locale.getLanguage().equals(new Locale("de", "", "").getLanguage()))
                {
                        addMetaTag(writer, "description", "DESCRIPTION");
                        addMetaTag(writer, "keywords", "KEYWORDS" );
                }
        }

        private void addMetaTag(IMarkupWriter writer, String key, String value)
        {
                writer.beginEmpty("meta");
                writer.attribute("name", key);
                writer.attribute("content", value);
                writer.print("\n");
        }
}

There's another solution that does NOT require the creation of a custom delegate class.

<span jwcid="$content$">
<html jwcid="shell">
<head jwcid="remainingHead@Block">
  <meta name="copyright" content="YOUR_COPYRIGHT_NOTICE"/>
  <meta name="author" content="YOUR_NAME"/>
  <meta name="robots" content="Index,Follow"/>
  ...
  <link rel="SHORTCUT ICON" href="favicon.ico" />
</head>
<body jwcid="@Body">
...

and then in the page specification:

<component id="shell" type="Shell">
    <binding name="delegate" 
        value="new org.apache.tapestry.components.BlockRenderer(components.remainingHead)"/>
</component>

Or just do this:

<html jwcid="@Shell" title="ognl:title" stylesheet="asset:stylesheet" delegate="component:meta">
    <span jwcid="@If" condition="false">
        <span jwcid="meta@If" condition="true">
            <meta http-equiv="Pragma" content="no-cache" />
            <meta http-equiv="Cache-Control" content="no-cache" />
            <meta http-equiv="Expires" content="Mon, 06 Jan 1990 00:00:01 GMT" />
        </span>
    </span>
    ....

last edited 2007-06-30 13:28:31 by NickWestgate