XOOPSのテンプレートの読込方法の改善??
XOOPSの見た目のカストマイズの第一段階はテーマをカストマイズという事になりますが、それ以上進んだカストマイズを行おうとするとXOOPSモジュールのテンプレートの修正作業が必要となってきます。
テンプレートの修正には、管理者メニューにてdefaultテンプレートの複製を行った後に、それぞれのテンプレートを編集する事になります。
ところが、ここで落とし穴があります。
テーマをdefaultにした状態で、モジュールのアップデート作業などでテンプレートファイルが更新されると、その段階でカストマイズの為に編集した内容がすべてファイルの内容に更新されてしまうのです。(タイムスタンプ比較がされているので、編集日付がファイルの日付よりも新しいものは、そのまま残りますが)
これには前提があって、一般設定で、「themes/ ディレクトリからの自動アップデートを有効にする」がONになっている場合にのみこの更新が行われてしまうわけなんですけど、サイト構築時には試行錯誤を行うため、通常この設定をONにする場合が多いと思います。
サイトのカストマイズを行う以上テーマがdefaultのままっていうのは、あまり考えがたいかもしれませんけど、小生のようにモジュール開発を行っている場合には標準の状態でどう見えるかなどというチェックも気が向けば 行っているため、この仕様はかなり致命的です。
このあたりの事は、Ryujiさんのサイトにて知ったのですけど、これはかなり衝撃的でした。
さらに、困った事にはあまり知られていないかもしれませんけどXOOPSではテーマディレクトリにテンプレートファイルを置く事が出来ます。
具体的には、テーマディレクトリの下にtemplates/モジュール名というディレクトリを作成して、このディレクトリにmodules/モジュール名/templates下のファイルをコピーしてカストマイズしてやればその内容を反映するというものです。
これは、見た目はかなりテーマ毎のカストマイズに有効な手段だと思ったのですけど、これにも落とし穴が・・・
これも、実際は現在のテンプレートセットの内容を置き換えるという方法をとっており、それに更新日付チェックがからんでいるものですから、きっと思った通りの反映にはなってくれません。テーマの切替を自由にしてさらにテンプレートも連動して切り替わるってな具合にはならないようです。
そこで、このテンプレートの読込方法を少し変えてやる事にしました。
小生の把握している範囲で現在のテンプレートファイルの読込ロジックは、
- テンプレートのコンパイルキャッシュと、テンプレートソースとのタイムスタンプを比較し、テンプレートのコンパイルキャッシュが最新であればキャッシュ内容を元に表示する。
- キャッシュが最新でないときテンプレートソースの読込
- 「themes/ ディレクトリからの自動アップデートを有効にする」がoffであれば、常に現在のテンプレートセットに属するテンプレートソースをDBから読み込む
- 「themes/ ディレクトリからの自動アップデートを有効にする」がonの場合
- テーマがdefault以外ならテーマ名/templates/モジュール名下に該当テンプレートソースが存在し、現在のテンプレートセットに属するDB上のテンプレートソースの更新日付より新しければDBの内容を更新して読み込む
- テーマがdefaultの場合は、modules/モジュール名/templates/下に該当テンプレートソースが存在し、現在のテンプレートセットに属するDB上のテンプレートソースの更新日付より新しければDBの内容を更新して読み込む
- 上記以外の場合は、現在のテンプレートセットに属するテンプレートソースをDBから読み込む
ってな形になっていますが、小生のHackでは、
- テンプレートのコンパイルキャッシュと、テンプレートソースとのタイムスタンプを比較し、テンプレートのコンパイルキャッシュが最新であればキャッシュ内容を元に表示する。
- キャッシュが最新でないときテンプレートソースの読込
- 「themes/ ディレクトリからの自動アップデートを有効にする」がoff、または現在のテンプレートセットがdefault以外であれば、常に現在のテンプレートセットに属するテンプレートソースをDBから読み込む
- 「themes/ ディレクトリからの自動アップデートを有効にする」がonかつ現在のテンプレートセットがdefaultの場合
- テーマがdefault以外でテーマ名/templates/モジュール名下に該当テンプレートソースが存在する場合はそのファイルを読み込む(DBは更新しない)
- 上記条件に該当しないときは、modules/モジュール名/templates/下に該当テンプレートソースが存在するばあいは、そのファイルを読み込む、さらに現在のテンプレートセットに属するDB上のテンプレートソースの更新日付より新しければDBの内容を更新する
- 上記以外の場合はエラー
としています。
さらに、テンプレートのコンパイルキャッシュをテーマ別に管理出来るようにし、キャッシュの最新チェックが正常に動作する様にし、さらにはモジュール間で同じ名前のテンプレートファイル名を持っている場合に適切なモジュールのテンプレートを参照出来るように変更しています。
この変更によって複製可能なモジュールを開発するときの柔軟性が少し増えると思います。
このHackを適用した環境では、Templateのカストマイズを行うにあたっては、以下の2つのカストマイズ方針のうちのいずれかを選ぶ事になります。
- XOOPSのテンプレートセットを定義して、XOOPSの管理画面で編集する事を前提とする。
- 新たなテンプレートセットを定義せずに、ファイルベースでテンプレート編集を行う。
1番目の方法では、モジュールディレクトリ中のテンプレートファイルが更新されたとしても新たに定義したテンプレートセットの方にはまったく影響を与えないようになります。
但し、この場合は全てのテーマで一つのテンプレートを共有する事となります。
反対に、2番目の方法では基本的には、DBを参照せずにモジュールディレクトリもしくはテーマディレクトリ下のテンプレートファイルを直接参照し、最低限の互換性維持の為に現行テンプレートセットがdefaultの場合にのみDB上のテンプレートを更新するようになります。
この方法をとると、テーマ毎のテンプレートカストマイズなどデザインの幅がかなり増える事となります。
文章で書くと非常にややこしくなりますが、おそらくこの方が直感的でカストマイズのしやすい環境が構築出来ると考えています。
導入方法
1.元ファイルのバックアップ
header.php
footer.php
class/template.php
class/smarty/plugins/resource.db.php
2.ファイルのダウンロードと解凍
上記のファイルをダウンロードし解凍した後に、htmlディレクトリ下をXOOPSのファイルに上書きします。
変更履歴
- 2005/07/13 22:34 XOOPS 2.0.10JPに対応した最新版の0.3をリリース致しました。
- 2005/04/20 22:13 4月25日発売予定のGIJOE & matchan著「Customizing XOOPS」に当Hackをご紹介頂いたのを機会に、最新版の0.2aをリリース致しました。
- 2004/10/16 22:20 モジュールテンプレートが、templatesディレクトリのサブディレクトリに存在する場合に正常に動作しないバグが発見されましたので、0.1fをリリース致しました。
- 2004/10/16 10:45 template.phpに修正ミスが発見されましたので、0.1eをリリース致しました。
- 2004/10/15 22:55 default以外のテンプレートセットを使用している場合、そのテンプレートセットにテンプレートが含まれていないときにdefaultテンプレートセットを見に行く部分がうまく動作しておりませんでした。修正を行い0.1dをリリース致しました。このリリースより、class/template.phpも置き換えの対象に追加されましたので、元ファイルのバックアップをお願い致します(Thanks gondayu!)
- 2004/10/15 20:20 footer.phpにTYPEが発見されましたので修正し、0.1cをリリースしました。(Thanks domifara!)
- 2004/10/14 16:00 テンプレート参照元のモジュールを特定出来ないときにエラーになってしまう不具合を修正した0.1bをリリースしました。
- 2004/10/14 10:00 2004/10/14 深夜の初期リリース分はMulti Language Hackが適用されたファイルに対してHackしておりましたので、XOOPS2.0.7.3のファイルに対するHackに差し替えました
コメント
- テーマ/テンプレート開発に大変重宝しております。最新版を提供下さりどうもありがとうございます! -- konny