验证字段不为空


15

检查节点模板中的字段是否为空的最佳方法是什么。

在node--example.html.twig中,我们可以使用“ content”变量。

我不能像检查块一样使用检查

{% if content.field_example  %}

我可以这样使用:

{% if content.field_example['#object'] is defined  %}

但是最好的方法是什么?


1
使用hook_preprocess并以编程方式检查,也许添加指标变量。否则4k4会写什么。

Answers:


21

就像我在《如何从节点模板中的实体引用呈现字段》中写的一样[Drupal 8],content是一个渲染数组,其中包含准备显示的数据。

如果要检查或比较某些内容,请改用节点对象上可用的值。

{% if node.field_example.value %}

请注意,该属性取决于字段类型。如果是参考字段,则需要使用target_id。参考的问题链接到实体字段API备忘单,其中列出了常见的字段类型及其属性。


对于图片字段{%node.field_article_image.target_id%}
Yogesh Kushwaha,

13

您不能确定内容内部的渲染数组的结构,因此这可能不是最佳方法。

这可能是一个更好的解决方案:

{% if content.field_example|render|striptags|trim %}
  <p>field is not empty</p>
{% endif %}

这将检查渲染字段是否生成任何输出。

但这取决于您如何配置字段格式以及尝试执行的操作。例如,如果该字段为空,则可以配置为显示标签。然后,您必须对此进行调整。如果您不依赖于呈现的输出,而只想检查字段是否在数据库中具有值,请使用节点对象。请参阅Berdir的答案。


我认为Berdir回答正确,因为它更灵活。
sainf '16

@ 4k4:|render由于字段模板中的随机空白问题,这还不够,请参
见此

@MojtabaReyhani:谢谢你,很棒的发现。在此处找到此链接drupal.org/node/2783633#comment-11510195。将此添加到代码中。
k4


1
{% if not (node.field_whatever.isEmpty == true) and content.field_whatever is defined %}
  <div class="whatever_markup">
    {{ content.field_whatever }}
  </div>
{% endif %}

该解决方案非常防弹,甚至可以在可重用和/或共享模板(例如,跨node--teaser.html.twig多个包共享)中使用,因为

  • 它适用于所有字段类型
  • 它检查该字段是否存在
  • 它检查该字段是否为空
  • 它检查该字段是否未在显示模式下隐藏

双重否定not ...isEmpty == true是必要的,否则不存在的字段将使检查失败。我还相信,与涉及渲染字段的任何检查相比,我的解决方案可以更快,更灵活地处理错误。

这适用于任何实体模板,例如,您只需在模板文件中替换node.field_xxxparagraph.field_xxxparagraph.html.twig

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.