Because We Love Happy Coding

フリーライターからエンジニアへ。発信力だけあり余ってる感じ

Twig テンプレート

目次

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() }}してみるとappBaseInfoが渡されているので、そこにあるものは使うことができる。

render()の中で渡す

基本。

テンプレートフックポイントや共通フックポイントで渡す

EC-CUBE 開発コミュニティ - フォーラム

Form/ExtensionbuildView()で渡す

【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)

参考記事