Twig の使い方 - シンプルなチートシート的メモ 2 - テンプレートの分割
前回の続き。
テンプレートファイルを分割統治する方法。地方分権ない限り日本の発展は無し。
継承
parent.twig
---- BASE ---- {% block title %}テスト{% endblock %} {% block content %}{% endblock %} ---- END BASE ----
child.twig
{% extends "parent.twig" %} {% block title parent() ~ ' - (CHILD TITLE)' %} {% block content %} (CHILD CONTENTS) {% endblock %}
<? /* ---- BASE ---- テスト - (CHILD TITLE) (CHILD CONTENTS) ---- END BASE ---- */ echo $twig->render('child.twig');
Smarty やってりゃ馴染み深いはず。parent 側で大枠のはめ込み場所を block で用意しておいて child 側でその block を上書きしていく。
include
include1.twig
---- INCLUDE 1 ---- local: {{ local }} global: {{ global }} ---- END INCLUDE 1 ----
include2.twig
---- INCLUDE 2 ---- local: {{ local }} global: {{ global }} ---- END INCLUDE 2 ----
include.twig
{# ---- INCLUDE 1 ---- local: LOCAL global: GLOBAL ---- END INCLUDE 1 ---- local: #} {% set global = 'GLOBAL' %} {% include 'include1.twig' with { 'local': 'LOCAL' } %} local: {{ local }} {# ONLY: ---- INCLUDE 2 ---- local: LOCAL global: ---- END INCLUDE 2 ---- #} {% set global = 'GLOBAL' %} {% include 'include2.twig' with { 'local': 'LOCAL' } only %}
別のテンプレートを持ってきて、そのテンプレートだけに見える値を with で渡せる。
呼び出し側のテンプレートで回っている値を呼んだテンプレート側に渡したくない場合は only を付ければ良し。
三項演算子を使って呼び出しテンプレートを打ち分けるとかやるとテンプレートをシンプルなものに出来るかもしれない。
{# ---- INCLUDE 1 ---- local: global: GLOBAL ---- END INCLUDE 1 ---- #} {% set include = 1 %} {% include include ? 'include1.twig' : 'include2.twig' %}
embed
extends は親の block を上書きして使うが、こいつは子から呼んだ孫の block を上書きする。
include だとブロックで区切ったり出来ないから include ファイルだらけになっちゃう。extends みたいに使いたい。extends を拡張して endextends で閉じれるようにするか。いや、それだとわけわからんな。名前を分けよう。しゃーなしやね。
おそらくこんな感じで産み落とされちゃったやつ。しどろもどろ感がすごい。
しどろもどろすぎて公式の AA で書かれた図も壊れている始末。
https://twig.symfony.com/doc/2.x/tags/embed.htmltwig.symfony.com
embed.twig
{% block embed1 %} EMBED 1 DEFAULT {% endblock %} {% block embed2 %} EMBED 2 DEFAULT {% endblock %}
先の extends で使った child.twig をちょっと拝借。
child.twig
{% extends "parent.twig" %} {% block title parent() ~ ' - (CHILD TITLE)' %} {% block content %} (CHILD CONTENTS) {% embed 'embed.twig' %} {% block embed1 %} EMBED 1 OVERWRITE {% endblock %} {% endembed %} {% endblock %}
<? /* ---- BASE ---- テスト - (CHILD TITLE) (CHILD CONTENTS) EMBED 1 OVERWRITE EMBED 2 DEFAULT ---- END BASE ---- */ echo $twig->render('child.twig');
macro
マクロス。
macros.twig
{% macro test(a1, a2) %} a1: {{ a1 }}, a2: {{ a2|default('a2 default') }} {% endmacro %}
フィルター default でデフォルト値が指定可能。
macro.twig
{% import 'macros.twig' as m %} {# a1: , a2: a2 default #} {{ m.test() }} {# a1: ARG1, a2: a2 default #} {{ m.test('ARG1') }} {# a1: ARG1, a2: ARG2 #} {{ m.test('ARG1', 'ARG2') }} {# a1: <p>ARG1</p>, a2: ARG2 #} {{ m.test('<p>ARG1</p>', 'ARG2') }}
import .. as .. で名前を閉じ込めてインポート。
macro を外部ファイルじゃなくてその場で作って使う場合
{% macro test2(a) %} {{ a }} {% endmacro %} {% import _self as m2 %} {# hoge #} {{ m2.test2('hoge') }}
_self でインポートしてから使う。