再利用可能な要素をテーマのテンプレートファイルで使い回す
多くの開発者は「車輪の再発明をしない」という用語をご存知でしょう。もしたくさんのファイルの中に同じコードがたくさん存在したら、その部分に変更があった場合、すべてのファイルを確認して更新しないと行けません。これが、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テーマを作成するのに役立つでしょう。