目次
Requirements
Twig
htmlを生成する最後の部分はTwigテンプレートの役割になっている。
Home - Twig - The flexible, fast, and secure PHP template engine
キャッシュ
ECCUBE3(Symfony)側でキャッシュが効いているため、テンプレートに修正をしてFTPアップロードをしても、反映されない。反映をさせるためには、以下のような手段をとる。
- 管理画面からテンプレートを編集する
- デバッグモードを使う
- 管理画面からキャッシュを削除する
- 設定でキャッシュを抑制する
デバッグモードを使うのが一般的だが、顧客の確認を要するような場合に、顧客側では反映されない。設定でキャッシュを抑制してしまう方が実はトラブルなくていいかもしれない。
追記)PHPからキャッシュを削除する
Admin/Content/PageController/edit()
の中でキャッシュを削除している処理を見つけた。
// twig キャッシュの削除. $finder = Finder::create()->in($app['config']['root_dir'].'/app/cache/twig'); $fs->remove($finder);
なるほど、こういうやり方もあるのか。
継承
継承の機能があり、ECCUBE3ではdefault_frame.twig
をベースに追記していく形。
{% extends 'default_frame.twig' %}
変数の展開
Twig はController からrender()
で渡されてくる変数を受け取って、それを埋め込みながらHTMLを作成する。
{{ 変数名 }}
のようにして出力。PHP的には変数名->getName()
メソッドなどを呼び出しているので、エラーが出た場合はそうした解釈が必要。
配列の展開
Controller から配列some_array
を受け取った場合、配列内部の出力には以下のような書き方をする。
{{ attribute('変数名','some\_idx').some\_property }}
Twig テンプレートファイルの設置場所
オリジナル
src/Eccube/Resource/Template/
基本的には手を触れないファイル。app/template
にファイルをコピーすれば差し替えられるので、編集する際はapp/template
にコピーしてそちらを編集する。
修正用
app/template
テンプレート修正用のディレクトリ。オリジナルと同じディレクトリ構成で同名のファイルがあれば、オリジナルよりも優先して使われる。
もちろんプラグイン内のControllerからrender()
で指定して使うこともできる。
プラグイン用
app/plugin/Resource/template/
プラグインで提供するテンプレートの置き場所。主にプラグイン内のControllerからrender()で指定する。
プラグイン配布をしない前提であれば、修正用とプラグイン用が分散するのが面倒なので、修正用に全部統一した方がいい気がする。
プラグインのテンプレートをカスタマイズする。
EC-CUBE3.0プラグインのデザインをカスタマイズしてみよう - Qiita
{SomePluginCode}/
以下のテンプレートをapp/template/default/{SomePluginCode}/
にコピーする。
もしも{SomePluginCode}/default/foobar.twig
があった場合はapp/template/default/{SomePluginCode}/default/foobar.twig
という何か冗長な(defaultが2回)パスになってしまうがそれでいい。
余談
余談だが、以前使ったプラグインは、プラグイン本体のディレクトリ内app/Plugin/{プラグインコード}/View
ディレクトリにテンプレートが入っていて、インストールするとapp/template
ディレクトリにそれがコピーされていた。なるほど、app/template
が本物か…と更新したらあに図らんや、そちらはControllerから参照されておらず、app/Plugin/{プラグインコード}/View
から読み込まれていた。
じゃあ何のためにapp/template
にコピーしたのよ…。
Twigテンプレートに値を渡す
Twigテンプレートに値を渡す方法はいくつかある。ECCUBE3のControllerはrender()
を使っているのでそこに追記すれば簡単だが、コアコードに手を入れないでプラグインから渡すようにしようと思うとなかなか面倒。
テンプレート内で{{ dump() }}
してみるとapp
やBaseInfo
が渡されているので、そこにあるものは使うことができる。
render()
の中で渡す
基本。
テンプレートフックポイントや共通フックポイントで渡す
appからうけとる
ページにはパラメータとしてappが渡ってきているので、下記のように書けば商品情報にアクセスすることが可能です。
Twig拡張関数を作ってデザインをカスタマイズしてみよう - Qiita
Form/Extension
のbuildView()
で渡す
【EC-CUBE】プラグインでDBの値をtwigに渡す方法 - Qiita
$app['twig']->addGlobal()
でグローバル変数として渡す
EC-CUBE3カスタマイズ - ロゴブロックに入っているh1タグを動的に変更する方法
こちらは同様の方法で、SESSION情報をaddGlobalで渡している。
PHPテンプレートエンジンTwigでセッション情報を取得する(PHPフレームワークSlimを使って) | るとるのITぶろぐ
もちろんグローバルなので、どこで値を変えたか気をつける必要はある。
Twig内でフォームを修正する
Symfonyの方で修正するのが面倒な場合に、Twig内でfield optionを使って修正すると案外あっさり解決する場合もある(後でしっぺ返しを喰らう場合もあるが……)
How to Customize Form Rendering (Symfony Docs)