1

我必须生成诸如星级之类的东西,并且必须生成一些用于样式等的 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) }}

是否正确使用树枝函数生成 html 代码?或者我应该使用 {% include ... %}

4

2 回答 2

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 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) }}
于 2012-09-01T14:25:00.250 回答
2

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

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

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

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

于 2012-09-01T20:01:38.413 回答