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 でインポートしてから使う。