Edit me

プラグインではテンプレートを差し込む場合、イベントを通じて差し込みます。

テンプレートファイルの配置場所

テンプレートファイルは本体と同じくResourceディレクトリ配下に置きます。

[プラグインコード]
  ├── Resource
  │   └── template
  │           ├── admin
  │           │   └── XXXX.twig
  │           └── XXXX.twig

テンプレートイベント

EC-CUBE3.0.9からは既存画面に対して項目などの追加を行う場合、テンプレートイベントを利用します。

拡張を行いたい画面に対してイベントを指定するには、本体側のControllerにある

return $app->render('Shopping/complete.twig', array(

とtwigファイルを指定している部分がそのままイベント名となります。
event.ymlには、

Shopping/index.twig:
    - [onShoppingIndexRender, NORMAL]

とイベント名を指定します。管理画面の場合、

return $app->render('Order/index.twig', array(

とController側でtwigが指定されていた場合、
event.ymlには

Admin/Order/index.twig:
    - [onAdminOrderIndexRender, NORMAL]

Admin/をつける必要があります。

テンプレートイベントによる拡張

既存画面に対して拡張を行うにはテンプレートイベントに対する処理を実装する必要があります。 formを項目として追加したい場合、

  • XXXXEvent.php
public function onShoppingIndexRender(TemplateEvent $event)
{
    $parameters = $event->getParameters();
    $form = $parameters['form'];
    $parts = $app['twig']->getLoader()->getSource('[プラグインコード]/Resource/template/parts.twig');
    // twigコードに挿入
    // 要素箇所の取得
    $search = '<div id="xxxx">';
    $replace = $parts.$search;
    $source = str_replace($search, $replace, $event->getSource());
    $event->setSource($source);
}
  • parts.twig
<h2 class="heading02">ニックネームの入力</h2>
<div>
    {{ form_widget(form.nickname) }}
    {{ form_errors(form.nickname) }}
</div>

XXXXEvent.phpにparts.twigの内容も記述しても良いのですが、twigファイルとEvent部分を分離することで可読性がよくなります。

また、JavaSciptタグを追加したい場合、

  • XXXXEvent.php
public function onShoppingIndexRender(TemplateEvent $event)
{
    $source = $event->getSource();

    $tag = <<< EOT
{% block javascript %}
<script>
    $(function() {
        alert("hoge");
    });
</script>
{% endblock javascript %}
EOT;

    $event->setSource($source . $tag);
}

と記述すると追加可能です。

Tags: plugin