再利用可能な要素をテーマのテンプレートファイルで使い回す

多くの開発者は「車輪の再発明をしない」という用語をご存知でしょう。もしたくさんのファイルの中に同じコードがたくさん存在したら、その部分に変更があった場合、すべてのファイルを確認して更新しないと行けません。これが、PHPに include() という関数がある理由です。

concrete5も同様の機能を持っています。しかし、PHPの include() 関数は使用しません。なぜか?ひとつの理由は、concrete5は少し複雑な方法でファイルの保存位置を決めているからです。テーマのヘッダー部分を、別のファイルに切り分けて再利用したいとします。テーマをパッケージ化した場合、システムはpackagesディレクトリのなかのテーマのフォルダに、ヘッダー部分のファイルを探しに行きます。しかし、もしサイトのオーナーがそのファイルをapplicationディレクトリにコピーして変更を加えていたとするならば、システムはそちらのファイルを使用します。include() 関数ではこのようなことはできません。

では、concrete5で include() のようなことを行なうにはどうすればよいのでしょうか?答えは、\Concrete\Core\View\View クラスの inc() メソッドを使用します。Viewクラスのインスタンスはテーマで自動的に読み込まれて、次の変数に格納されています。

$view

まず、elements ディレクトリをテーマディレクトリの中に作成しましょう。

themes/urbanic/elements

urbanic 部分は、作成中のテーマのディレクトリ名に合わせてください。次に、elementsディレクトリに header.php と footer.php を作成してください。

次に、HTMLの先頭からページのヘッダー部分のHTMLをすべてコピーし、header.phpに移してください。移した範囲のHTMLは、default.php の中で次のコードに差し替えてください。

$view->inc('elements/header.php');

footer.php には、ページのフッター部分からHTMLの末尾までを移し、default.phpでは次のコードに差し替えます。

$view->inc('elements/footer.php');

inc() で読み込まれているファイルは、もとのテンプレートファイルとは違う階層に移りましたが、CSSや画像の読み込みはそのまま動きます。もちろん、Loader::element()もそのまま動きます。

これで、追加のページテンプレートを作成しても、同様に header.php と footer.php を読み込めるようになりました。

inc() で読み込むテンプレートに、変数を渡すこともできます。

$tab = 'tweets';
// 変数 $tab のデータをヘッダーに渡します。
$view->inc('elements/header.php', array('activeTab' => $tab));

この例では、header.php 内で $activeTab という変数で $tab の値(tweets)が使えるようになります。このテクニックは、メンテナンス性の高いconcrete5テーマを作成するのに役立つでしょう。

原文:Reusing Common Elements in Theme Template Files