強まっていこう

あっちゃこっちゃへ強まっていくためのブログです。

Twig の使い方 - シンプルなチートシート的メモ 2 - テンプレートの分割

wolfbash.hateblo.jp

前回の続き。

テンプレートファイルを分割統治する方法。地方分権ない限り日本の発展は無し。

継承

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: &lt;p&gt;ARG1&lt;/p&gt;, 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 でインポートしてから使う。