4

すべてのブロックコードをスペースレスでラップして、twig/htmlから空白を切り取る方法

たとえば今私は持っています:

{% block content %}

    <div class="box clearfix clearall">
        <div class="ct colcontainer">
            <div class="col-1">
                <div class="chars">
                    <table class="layout data-char">
                        <thead>

blabla

{% endblock %}

そして、symfonyがそれをレンダリングしようとするとき、私はそのsymfonyが見た

{% block content %}
{% spaceless %}
    <div class="box clearfix clearall">
        <div class="ct colcontainer">
            <div class="col-1">
                <div class="chars">
                    <table class="layout data-char">
                        <thead>

blabla
{% endspaceless %}
{% endblock %}
4

1 に答える 1

6

カスタムTwigタグを定義します(コピーアンドペースト方法)

spacelessblockを組み合わせたカスタムTwigタグを定義できます。次に、テンプレートで使用できます。これがあなたがそれを素早く汚い(コピーアンドペースト)方法で行う方法です。blockspaceless{% 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プロジェクトですでに記述されているすべてのコードを再利用します。

于 2012-10-22T10:41:56.760 に答える