特定の条件でのみCakephpのテンプレートディレクトリを変更したいという要望があり、わりと変態じみた実装をしたのでメモ。
cakephp/config/app.php
'App' => [
// ~中略~
'paths' => [
'plugins' => [ROOT . DS . 'plugins' . DS],
//GETパラメータhogeがある場合には/home/fuga/Template/からを優先してctpファイルを探す
'templates' => isset($_GET['hoge'])
? [DS . 'home' . DS . 'fuga' . DS . 'Template' . DS, APP . 'Template' . DS]
: [APP . 'Template' . DS],
'locales' => [APP . 'Locale' . DS],
],
],
設定項目templatesにはテンプレートディレクトリの絶対パスを配列で記述する。
このときに先に記述したディレクトリからマッチするctp(テンプレート)ファイルを探してくれる。
'templates' => [
DS . 'home' . DS . 'fuga' . DS . 'Template' . DS, # /home/fuga/Template/が優先される
APP . 'Template' . DS
]
なので特定条件の場合にのみ/home/fuga/Template/の中のctpを優先して見たい場合には、三項演算子で設定する配列を切り替える。
'templates' => (条件) ? [条件がtrueの場合の配列] : [条件がfalseの場合の配列]
- 設定ファイルの配列内で条件分岐をさせる
- さらに優先ディレクトリからテンプレート有無を判断するという条件分岐が起こる
と、なんだか書いていてモヤっとする気分になる実装でした。
コントローラ内でテンプレートディレクトリを絶対パスで指定する方法はあるのだろうか。
(シンボリックリンクを使った方法だとsvn管理に不都合が生じるためにボツとなった。)