カスタムTwigタグを定義します(コピーアンドペースト方法)
とspacelessblock
を組み合わせたカスタムTwigタグを定義できます。次に、テンプレートで使用できます。これがあなたがそれを素早く汚い(コピーアンドペースト)方法で行う方法です。block
spaceless
{% spacelessblock xyz %}…{% endspacelessblock %}
新しいTwigノード
まず、クラスを定義しますTwig_Node_SpacelessBlock
(たとえば、Extension
バンドルのディレクトリで)。
class Twig_Node_SpacelessBlock extends \Twig_Node_Block
{
public function __construct($name, Twig_NodeInterface $body, $lineno, $tag = null)
{
parent::__construct(array('body' => $body), array('name' => $name), $lineno, $tag);
}
public function compile(Twig_Compiler $compiler)
{
// top part of Block.compile
$compiler
->addDebugInfo($this)
->write(sprintf("public function block_%s(\$context, array \$blocks = array())\n", $this->getAttribute('name')), "{\n")
->indent()
;
// the content of the body is treated like in Spaceless.compile
$compiler
->write("ob_start();\n")
->subcompile($this->getNode('body'))
->write("echo trim(preg_replace('/>\s+</', '><', ob_get_clean()));\n")
;
// bottom part of Block.compile
$compiler
->outdent()
->write("}\n\n")
;
}
}
新しいTwigトークンパーサー
新しいTwigノードは、Twigが{% spacelessblock xyz %}
テンプレートでを見つけるたびにどこかに構築する必要があります。そのためには、と呼ぶトークンパーサーが必要Twig_TokenParser_SpacelessBlock
です。基本的にコピーアンドペーストしTwig_TokenParser_Block
ます:
class Twig_TokenParser_SpacelessBlock extends \Twig_TokenParser
{
public function parse(Twig_Token $token)
{
// …
$this->parser->setBlock($name, $block = new Twig_Node_SpacelessBlock($name, new Twig_Node(array()), $lineno));
// …
}
public function decideBlockEnd(Twig_Token $token)
{
return $token->test('endspacelessblock');
}
public function getTag()
{
return 'spacelessblock';
}
}
Twigにそれについて教えてください
拡張クラスの場合:
class Extension extends \Twig_Extension
{
public function getTokenParsers()
{
return array(
new Twig_TokenParser_SpacelessBlock(),
);
}
}
symfonyにそれについて教えてください
まだ行っていない場合は、次を追加しますservices.yml
。
services:
# …
my.extension:
class: Acme\MyBundle\Extension\Extension
tags:
- { name: twig.extension }
より良い選択肢
プリプロセッサ
より良い方法は、プリプロセッサを使用して単純に置き換えることです。
{% spacelessblock xyz %}
…
{% endspacelessblock %}
に
{% block xyz %}{% spaceless %}
…
{% endspaceless %}{% endblock %}
これは、変更の可能性を含め、Twigプロジェクトですでに記述されているすべてのコードを再利用します。