扩展twig以生成html代码

时间:2012-09-01 14:10:42

标签: symfony twig

我必须生成类似星级的东西,我必须为样式等生成一些html。

        <div class="star on"><i>*</i></div>
        <div class="star on"><i>*</i></div>
        <div class="star on"><i>*</i></div>
        <div class="star"><i></i></div>
        <div class="star"><i></i></div>

我想使用传递活动星星参数的树枝函数进行渲染。

{{ stars(4) }}

正确使用twig函数生成html代码吗? 或者我应该使用{%include ...%}

2 个答案:

答案 0 :(得分:3)

不需要过度工程来完成这么简单的任务。

如果在Controller中生成数组,那么它可能如下所示:

$stars = array(
    true,
    true,
    true,
    false,
    false,
);

然后,您可以在Twig中呈现HTML:

{% for star in stars %}
    <div class="star{{ star ? ' on' }}"<i>{{ star ? '*' }}</i></div>
{% endfor %}

如果您只想使用Twig,我建议您使用macro

{% macro stars(stars, total) %}
    {% for item in 1..total %}
        {{ item }}<br>
        {% if item <= stars %}
            <div class="star on"><i>*</i></div>
        {% else %}
            <div class="star"><i></i></div>
        {% endif %}
    {% endfor %}
{% endmacro %}

如果您已在同一模板中定义了宏,则应通过_self调用它,如果在另一个文件中 - 就像一个函数一样,但不要忘记将import文件放入需要的树枝中。请参阅有关宏的章节(上面链接)。

以下调用将生成您在问题中描述的HTML结构:

{{ _self.stars(3,5) }}

答案 1 :(得分:2)

请参阅其文档的Extending Twig部分。根据该页面第一部分中的表格,使用内容生成功能是很自然的。我创建了很多Twig函数,我建议你创建一个来解决你的问题。

BTW,您的函数可以使用HTML代码呈现单独的模板 - 不要在Twig函数的PHP代码中生成HTML代码。要从Twig函数呈现单独的模板,请将service_container服务注入其中,获取templating服务并在其上调用render()方法:

return $this->container->get('templating')->render($pathToYourCustomTemplate);

通常,最好单独注入所需的服务,但是如果注入templating服务而不是service_container,则会出现循环依赖性问题。这就是为什么将整个容器注入Twig扩展是一个合理的例外。