【发布时间】:2017-06-27 21:05:43
【问题描述】:
我有一个字段,该字段可以有一两行 html:
<p>One line</p>
或:
<p>first line</p>
<p>Second line </p>
使用 twig 我如何检查字段是否有一个或两个
标签。
我想做的例子:
{% if item|length('<p>') = 1 %}
<div class="one">{{ item }}</div>
{% elseif item|length('<p>') = 2 %}
<div class="two">{{ item }}</div>
{% endif %}
关于如何实现这一点的任何想法?
更新 #1:Honza 说的是真的,如果项目中只有一行,我希望父 div 有一个类,如果项目中有两行,我希望父 div 有一个不同的类
更新 #2 这是我的树枝文件中的实际标记。
{%
set classes = [
'field',
'field--name-' ~ field_name|clean_class,
'field--type-' ~ field_type|clean_class,
'field--label-' ~ label_display,
]
%}
{%
set title_classes = [
'field__label',
label_display == 'visually_hidden' ? 'visually-hidden',
]
%}
<div{{ attributes.addClass(classes) }}>
<div{{ title_attributes.addClass(title_classes) }}>{{ label }}</div>
{% if multiple %} <div class="field__items"> {% endif %}
{% for item in items %}
<div{{ item.attributes.addClass('field__item') }}>{{ item.content }}</div>
{% endfor %}
{% if multiple %} </div> {% endif %}
</div>
我希望 field__item 有一个类,当它有一个 <p> 标签和一个不同的类,当它有两个标签时,我知道事实上它将是 <p> 标签,但 <p> 标签的内容各不相同仅以第一行和第二行为例,但内容是用户在填写字段后生成的,无论是使用一行还是两行。
Alvin Bunk - 使用 Edit 2 中的代码已接近,但无论如何它仍会将类输出为 0,我不知道为什么,因为我在你的 twigfiddle 文件中看到它有效,也许是因为它是 Drupal 8。我如何将您的代码集成到模板中:
<div{{ attributes.addClass(classes) }}>
<div{{ title_attributes.addClass(title_classes) }}>{{ label }}</div>
{% if multiple %} <div class="field__items"> {% endif %}
{% set count = item|split('</p>') %}
{% for item in items %}
<div class="{{ count|length -1 }}">{{ item.content }}</div>
{% endfor %}
{% if multiple %} </div> {% endif %}
</div>
我不知道我做错了什么,但它总是显示为 class="0" 我也尝试过“item.content”和“item.content|raw”,但没有。
这里是转储输出:
array(1) {
[0]=>
array(2) {
["content"]=>
array(4) {
["#type"]=>
string(14) "processed_text"
["#text"]=>
string(52) "<p>CGS-2181-3105-9090</p>
<p>CGS-2181-3105-9090</p>"
["#format"]=>
string(15) "restricted_html"
["#langcode"]=>
string(3) "und"
}
["attributes"]=>
object(Drupal\Core\Template\Attribute)#2953 (1) {
["storage":protected]=>
array(0) {
}
}
}
}
更新 #3
基于上面的转储,我可以使用 {{ item.content["#text"] }} 获取字段的 html 值,它输出 <p>CGS-2181-3105-9090</p> <p>CGS-2181-3105-9090</p> 但我不知道如何遍历它,我尝试设置一个变量 {% set count = '<p>' in item.content["#text"] %} 然后检查长度喜欢{{ count|length }},但无论如何我总是得到 1。
更新#4:
使用来自 Alvin Bunk 的代码的变体,我终于能够让它输出一个数字,这里是正确获取标签数字的标记:
{% for item in items %}
{% set count = item.content["#text"]|split('</p>') %}
<div class="{{ count|length -1 }}">{{ item.content }}</div>
{% endfor %}
我在 for 循环下面移动了 set 变量,并从转储中添加了字符串存在的对象,现在它可以正确计数。
【问题讨论】:
-
你能否展示一下你是如何将
items作为参数传递给你的控制器的? -
我到底是怎么显示的?
-
我不确定 Drupal 是如何完成的,我只熟悉 Symfony。在 Symfony 中,它会这样完成:
return $this->render('mytwigfile.html.twig', array( 'items' => $item->getContent() ));这就是我希望你做的,在你的 items 对象上调用“getContent()”函数,所以 Twig 文件只获取一个字符串而不是一个对象(或数组)。 -
我目前也不知道如何在drupal中做到这一点,我已经查看了api但这是很多php文件和函数,到目前为止我还没有找到任何具体的东西,似乎是通过字段模块传递,但我无法从所有代码中做出正面或反面,如果我发现任何东西,我会继续寻找并更新你。谢谢
-
我添加了 EDIT #4。试试吧。我的想法不多了。 Drupal 文档不是很有帮助。
标签: symfony drupal twig drupal-theming drupal-8