大概のテンプレートエンジンで、titleタグは共通のテンプレートに入っているかと思います。
そして、タイトルの中身はController内ではなく、後で指定したい事もあるかと思います。
そんな時は、表示しようとしているviewでsetしてやればいいだけみたいです。
view/index.volt
<html>
<head>
<title>{{ title | e }}</title>
</head>
<body>
{{ content() }}
</body>
</html>
view/controller/action.volt
{% set title = "タイトルです" %}
簡単ですねー
おまけ
他のvoltと変数を共有するってことは、安易な名前を付けるとかぶってしまうんじゃ?
と、思ったので、下記ソースで実行順を調べてみました。
view/index.volt
INDEX_TOP before:{{ title }}<br />
{% set title = "INDEX_TOP" %}
INDEX_TOP after:{{ title }}<br />
{{ partial("header") }}
{{ content() }}
{{ partial("footer") }}
INDEX_LAST before:{{ title }}<br />
{% set title = "INDEX_LAST" %}
INDEX_LAST after:{{ title }}<br />
view/header.volt
HEADER before:{{ title }}<br />
{% set title = "HEADER" %}
HEADER after:{{ title }}<br />
view/footer.volt
FOOTER before:{{ title }}<br />
{% set title = "FOOTER" %}
FOOTER after:{{ title }}<br />
view/partial.volt
PARTIAL before:{{ title }}<br />
{% set title = "PARTIAL" %}
PARTIAL after:{{ title }}<br />
view/controller/action.volt
CONTENTS_TOP before:{{ title }}<br />
{% set title = "CONTENTS_TOP" %}
CONTENTS_TOP after:{{ title }}<br />
{{ partial("partial") }}
CONTENTS_LAST before:{{ title }}<br />
{% set title = "CONTENTS_LAST" %}
CONTENTS_LAST after:{{ title }}<br />
で、結果は以下。
実行結果
INDEX_TOP before:CONTENT_LAST
INDEX_TOP after:INDEX_TOP
HEADER before:INDEX_TOP
HEADER after:HEADER
INDEX_LAST before:FOOTER
INDEX_LAST after:INDEX_LAST
CONTENTS_TOP before:
CONTENTS_TOP after:CONTENTS_TOP
PARTIAL before:CONTENTS_TOP
PARTIAL after:PARTIAL
CONTENTS_LAST before:PARTIAL
CONTENTS_LAST after:CONTENTS_LAST
FOOTER before:HEADER
FOOTER after:FOOTER
以下の順で実行されているようです。
- CONTENTS_TOP
- PARTIAL
- CONTENTS_LAST
- INDEX_TOP
- HEADER
- FOOTER
- INDEX_LAST
このことから、contents()を実行後、index.voltを実行といった所でしょうか。
partialに関しては記載されている順序で実行のようです。
ちなみにController内で設定したものは最優先のようで、上書きもできないみたいです。
デフォルトを設定したい場合はdefinedで調べて処理を変えるのがよさそうかも?
<title>
{% if title is defined %}
{{ title | e }}
{% else %}
デフォルトのタイトル
{% endif %}
</title>