我必须生成类似星级的东西,我必须为样式等生成一些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 ...%}
答案 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扩展是一个合理的例外。