如何在Twig中制作一个宏?

时间:2012-09-14 13:25:29

标签: symfony twig

我使用一大段代码来显示朋友,我在几个模板中使用它,所以我想把它变成一个宏,但语法是一种不寻常的方式,我不知道是否有这样的方法完成。

我要分开的代码部分是:

       {% if(fr.email != null) %}
            <p>
                <span class ="label">Email Address: </span> 
                <a  class="email" href="{{ path('friend_email', {'id': fr.id}) }}">
                    {{ fr.email }}
                </a>
            </p>
        {% endif %}

        {% if(fr.phone != null) %}
            <p>
                <span class="label">Phone: </span>
        {{ fr.phone }}
            </p>
        {% endif %}

等约10个变量。在另一个模板中我使用它,但不是fr.email,fr.phone等,我需要friend.email,friend.phone ......

我试过这个但没有成功:

{% macro display_friend(fr) %}

    {% if({{ fr }}.email != null) %}
            <p>
                <span class ="label">Email Address: </span> 
                <a  class="email" href="{{ path('friend_email', {'id': {{ fr }}.id}) }}">
                    {{ {{ fr }}.email }}
                </a>
            </p>
        {% endif %}

        {% if({{ fr }}.phone != null) %}
            <p>
                <span class="label">Phone: </span>
        {{ {{ fr }}.phone }}
            </p>
        {% endif %}
{% endmacro %}

如果有必要,我可以在每个模板中使用fr.email,fr.phone,fr。* ....所以也许继承可以工作?

所以我的问题是:有没有办法让这部分代码变成宏,如果是,它会更好还是继承会更好?

2 个答案:

答案 0 :(得分:4)

在您的情况下,使用with选项,而不是使用宏我只会包含一个twig文件。例如,你可以这样做:

{% include 'AcmeDemoBundle:Demo:showFriend.html.twig' with {'fr': friend} %}

和showFriend.html.twig将是:

   {% if(fr.email != null) %}
        <p>
            <span class ="label">Email Address: </span> 
            <a  class="email" href="{{ path('friend_email', {'id': fr.id}) }}">
                {{ fr.email }}
            </a>
        </p>
    {% endif %}

    {% if(fr.phone != null) %}
        <p>
            <span class="label">Phone: </span>
    {{ fr.phone }}
        </p>
    {% endif %}

答案 1 :(得分:1)

macro内,您可以fr.var使用

{% if({{ fr }}.email != null) %}

将成为

{% if fr.email %}

正如您所看到的,不需要指定!= null(我甚至怀疑它是否有用,它可能应该是fr.email not is null