ゴミ箱.net

汚物は消毒

[webgen]テンプレートを入れ子にする

このページの情報はwebgen 1.4.0をもとにしています。

webgenでは、テンプレートを入れ子にして適用することができる。

たとえば、各ページがヘッダ領域、サイドメニュー領域、本文領域という3つの領域に分かれたウェブサイトを考える。
ページはAからDまで4ページあり、本文領域はページごとにすべて内容が異なる。
サイドメニュー領域は2種類あり、ページA、BではサイドメニューX、ページC、DではサイドメニューYが表示される。
ヘッダ領域はすべてのページでまったく同じ。
その際、同じことを2回記述することはできるだけ避けたい。
そのような場合にテンプレートをどう作ればよいか?


単純に考えると、ページA、B用のテンプレートXとページC、D用のテンプレートYを作ればよい。
テンプレートXにはヘッダ領域の内容とサイドメニューXの内容を記述する。
テンプレートYにはヘッダ領域の内容とサイドメニューYの内容を記述する。

テンプレートX、Yのファイル名をそれぞれx.template、y.templateとすると、ページA、Bにおいてメタ情報を以下のとおり設定する。

---
template: x.template
---
(ここにページの内容を書く)

また、ページC、Dにおいてメタ情報を以下のとおり設定する。
---
template: y.template
---
(ここにページの内容を書く)

そして、具体的なテンプレートの内容は以下のようになるだろう。
テンプレートX
<html>
<head>
(略)
</head>
<body>
<div id="header">
(ここにヘッダ領域の内容を書く)
</div>
<div id="sideMenu">
(ここにサイドメニューXの内容を書く)
</div>
<div id="main">
<webgen:block name="content" />
</div>
</body>
</html>

テンプレートY
<html>
<head>
(略)
</head>
<body>
<div id="header">
(ここにヘッダ領域の内容を書く)
</div>
<div id="sideMenu">
(ここにサイドメニューYの内容を書く)
</div>
<div id="main">
<webgen:block name="content" />
</div>
</body>
</html>

とりあえずこれでページを作成することはできるだろう。
だが、同じヘッダ領域の内容を2箇所に記述せねばならないので煩わしい。それに、ヘッダ領域の内容を変えたくなったときにテンプレートXとテンプレートYの両方を書き換えなければならなくなり、管理がしづらい。
可能ならばヘッダ領域を記述する箇所は1箇所だけしたほうが何かと都合がよい。DRYの原則だ。

そのような場合は、新しいテンプレートZを作成してそこにヘッダ領域を記述するようにし、テンプレートX、YのそれぞれにテンプレートZを入れ子で適用すればよい。

以下の説明ではテンプレートZのファイル名をz.templateとする。
テンプレートX、Yのそれぞれをメタ情報ブロックとコンテンツブロックに分けて記述する。
メタ情報ブロックで属性templateにテンプレートZのファイル名z.templateを指定する。またコンテンツブロックにはテンプレートに固有の部分のみを記述する。
具体的には以下のとおりになるだろう。
テンプレートX
---
template: z.template
---
<div id="sideMenu">
(ここにサイドメニューXの内容を書く)
</div>
<div id="main">
<webgen:block name="content" />
</div>

テンプレートY
---
template: z.template
---
<div id="sideMenu">
(ここにサイドメニューYの内容を書く)
</div>
<div id="main">
<webgen:block name="content" />
</div>

そして、テンプレートZでHTML全体を記述し、すべてのページに共通の内容および、テンプレートXおよびYを埋め込む箇所にタグ<webgen:block>を記述する。
<html>
<head>
(略)
</head>
<body>
<div id="header">
(ここにヘッダ領域の内容を書く)
</div>
<webgen:block name="content" />
</body>
</html>

このようにテンプレートを入れ子で適用することにより、記述の重複を最小限にすることができる。

このとき各ページに対してテンプレートは以下のように連鎖的に適用される。
ページA→テンプレートX→テンプレートZ
ページB→テンプレートX→テンプレートZ
ページC→テンプレートY→テンプレートZ
ページD→テンプレートY→テンプレートZ

注意点として、ページおよびテンプレートでは{属性名:}という記述でページのメタ情報の属性を参照することができるが、連鎖の最初にあるページで定義したメタ情報のみ参照することができる。テンプレートX、Yのような連鎖の途中のテンプレートでメタ情報を定義してもそれを参照することはできない。

また、上では触れなかったが、テンプレートのメタ情報ブロックにおいて属性templateを設定しない場合、同じフォルダのdefault.templateを設定したものとみなされる。(ソースフォルダの深い階層にある場合は、同じフォルダにdefault.templateがなければ、ひとつ上のフォルダのdefault.template、それもなければもうひとつ上のフォルダのdefault.template、…、ソースフォルダ直下のdefault.templateのように順にテンプレートファイルを探す。ただし自分自身がテンプレートとして適用されることはない。たとえばソースフォルダ直下のdefault.templateにはどのテンプレートファイルも適用されない。)
この挙動が妨げになる場合、たとえばあるテンプレートだけで完全なHTMLファイルを生成したい場合は、明示的にメタ情報ブロックで属性templateにnullを指定する必要がある。
---
template: null
---
(略)
スポンサーサイト

PageTop

コメント


管理者にだけ表示を許可する