page.tpl.php の見通しを良くするため、気になっていたPHPコードを2箇所を関数化しtamplate.php(プリプロセッサ)に移してみた。
template.php :
<?php /* MnM Design template */ /** * Override or insert PHPTemplate variables into the templates. */ function phptemplate_preprocess_page(&$vars) { /* * Setting hostname(site header title) and site logo image tag. */ global $base_url; $host_name = $_SERVER['HTTP_HOST']; $logo = theme_get_setting('logo'); $front = $base_url ."/". drupal_get_normal_path(variable_get('site_frontpage', 'node'));
$hostname_tag = '<p><a href="'. check_url($front) .'" title="'. $host_name .'">'.$host_name."</a></p>\n";
if ($logo) {
$hostname_tag = '<a href="'. check_url($front) .'" title="'. $host_name .'"><img src="' . check_url($logo) .'" alt="'. $host_name .'" width="48" height="48" /></a>' . $hostname_tag;
}
$vars['hostname_tag'] = $hostname_tag;
/*
* Setting node header title
*/
$vars['title_tag'] = '';
if ($vars['title']) {
$vars['title_tag'] = '<h2 class="title">' . $vars['title'] . "</h2>\n";
} elseif (drupal_is_front_page()) {
$vars['title_tag'] = "<h2 class=\"title\">Update & News</h2>\n";
}
/* Primarymenu hack. */
$_primary_links = $vars['primary_links'];
if ($_primary_links){
foreach ($_primary_links as $key => $value){
$default_alias = drupal_lookup_path('alias', $value['href'], 'ja');
if ($default_alias){
$vars['primary_links'][$key]['href'] = $default_alias;
}
}
}
}
さて、この template.php (プリプロセッサファイル)にはいろいろとお約束事がある。まず、冒頭の <?php PHP開始タグだが、公式のハンドブックによれば "終了タグは省略することが望ましい" となっている。 ?> は省略してくれということだが、なんとなく居心地が悪い。
つぎに関数の命名についても法則がある。関数についてはprefixとして、テーマ名またはテーマエンジンの名前を冠して、そのうしろに関数名をつなげる形になっている。当サイトのテーマならmnmdesign_hoge_function または phptemplate_hoge_function といった具合だ。これはPHPの性質上同名の関数があった場合にエラーが起きる可能性があるための配慮だろう。ハンドブックでは、Drupal6 からテーマの継承が可能になっているのでテーマ名固有の prefix よりはテーマエンジン名による prefix を推奨するとの事だ。
そして重要なのが、コアに含まれる関数と同名の関数を指定することでオーバーライドができるということだ。上の例でいうとphptemplate_preprocess_page() は template_preprocess_page() 関数をオーバーライドしている。この関数は簡単に言えば page.tpl.php などのテンプレートファイルに移る前の段階で、変数の設定や内部処理をおこなうことができる"場所"である。template_preprocess_page() やオーバーライド可能な内部関数についての詳細は公式のAPIハンドブック を参照してほしい。
コード的に高度なことは何もしてないのでPHPの分かる方であれば理解できると思う。単純にDrupla が用意してある機能を使いまわしているだけである。実際にやっていることは、page.tpl.php でやっていたHTMLコードの出力を、独自に設定した変数($hostname_tag と $title_tag)に代入しているだけだ。こうしておけば page.tpl.php 側で変数を読み出すだけで済む。
<?php print $hostname_tag; ?>
このような感じで一行で済む。
最後の方にある Primarymenu hack についてだが、多言語対応サイトで、各言語ごとにトップページを用意してある場合メニューやナビゲーションからトップページにリンクを張ると、リンクがそのページ固定になってしまうので少し都合が悪い事になる。たとえば使用言語が英語のユーザーがいたとしてメインメニューからのリンクが日本語トップページだった場合、そのメニューをクリックすると、メニューやインターフェースは英語なのにページのみ日本語のページが表示されてしまう。たとえそのページの翻訳ページがあっても、メニューからのリンクは内部 path として日本語トップページへリンクしているためだ。これはある意味では当然の仕様(使用言語が英語だからといって日本語のページを見ないとは限らない)である。だが、きちんと翻訳されたページがあるのにわざわざ多言語のページからリンクを踏みたいとおもう閲覧者がいるだろうか。
そのような理由で翻訳したページを持ってるページに対して張られたリンクメニューに関しては、閲覧者の言語に対応したページが表示されてほしいわけである。Primarymenu hack ではメインリンクのpath を参照してリンクpathを内部pathではなくエイリアスに設定しなおしている。ページの編集でURLエイリアスを各言語で共通のものを使用するように設定することでこの機能は実現する。
これまでのファイルとリソースをまとめてZipファイルで添付しておく。
実際に使用しているテーマを確認したい方は MnM Design を参照していただきたい。添付したテーマファイルについては、再配布やサイトでの公開はご遠慮願いたい。あくまでもテーマ作成の参考としてほしい。また、無いとは思うが、このテーマファイルを使用することで起きるあらゆる事象について管理人は一切責任を取らないので、あくまでも自己責任でお願いしたい。
必要に迫られていた最低限のテーマの製作はおこなえたので、ここで、テーマ作成はひとまず完了としたいと思う。Drupal の懐は思ったよりも深く、まだまだ底は見えそうに無い。今回も調べれば調べるほどあらたな機能や手法に気づき原稿を何度も書き直すことになった。今後はテーマ作成だけ出なくそのほかの機能や、拡張モジュール、初心者向けのチュートリアルといったコンテンツを地味にふやしていきたいと思っている。
MnM Design
Utano Schell
Recent comments