检查字段是否为空


18

当您有$ node对象时,如何检查字段是否为空?

我发现这是可能的解决方案:

$field = field_get_items('node', $node, 'field_post_image');

我现在可以检查:

更新。这不可靠,尽管我保证昨天它对我有用。

isset($field);

但我想知道是否有更好的方法。

开导我

Answers:


30

如果您阅读了文档FALSE则如果没有数据,该函数将返回。isset()实际上会失败,因为您正在分配FALSE给变量,因此实际上已将其设置为某些变量。正确的语法为:

$field = field_get_items('node', $node, 'field_post_image');
if ($field) {
   //Do something with the field
}
else{
   //There are no results
}

看来这是最好的方法。如果它是空将返回FALSE,如果有任何数据会返回一个数组,所以没有担心$场的计算结果为FALSE在一些情况下字段0,等等
corbacho

这对我不起作用,因为在未设置任何内容时它返回了默认值。

@ Sam152谢谢!这对于我登录时非常有用,但是当我注销时它没有显示任何内容。有什么理由和解决方案吗?
2014年

嗨,丹。登录应该不会对上述代码产生任何影响。也许您正在使用devel调试变量,并且匿名用户没有“访问开发人员信息”?
Sam152

这是检查字段是否为空的错误方法,您应该使用调用实现该字段的模块定义的hook_field_is_empty所描述的方法,请参见kiamlaluno的文章。
lslinnet

8

您可以使用以下代码段来验证字段是否为空。

$info = field_info_field($field_name);
$function = $info['module'] . '_field_is_empty';

if (function_exists($function)) {
  $value = field_get_items('node', $node, $field_name);
  $is_empty = $function($value[0], $info);
}

此代码更安全,因为在不同条件下不同字段被认为是空的。例如,请参见file_field_is_empty()number_field_is_empty()taxonomy_field_is_empty()之间的区别:taxonomy_field_is_empty()检查参数的tid属性$item,同时number_field_is_empty()检查同一参数的value属性。自定义字段可能需要更复杂的条件进行验证,才能认为该字段为空。

文档中给出的hook_field_is_empty()的描述如下:

定义什么构成字段类型的空项目。


我很欣赏这个答案,但是hook_field_is_empty()似乎走得很远。我想知道该字段是否为空。例如,number_field_is_empty认为0也为空。我还测试了如果该字段是多值,则不能直接应用此功能。
corbacho

1
那就是在您将包含0或字符串“ 0”的变量传递给empty()时执行的操作;它可能是字段为空时使用的值,并且调用hook_field_is_empty()是唯一了解字段是否为空的方法。
kiamlaluno

有错 应该是$ function($ value [0],$ info); 请参阅api.drupal.org/api/drupal/modules!field!field.api.php/function/…–
volocuga

2

我们在($content['field_name']['#items'][0][value])中找到了原始值,因此您可以使用表达式确定该字段是否为空

(!empty($ content ['field_name'] ['#items'] [0] [value]))

其中field_name与所需字段的名称匹配。


否。“值”键只是一个数据库列名称。根据字段类型,它可以有所不同。我认为最好的方法-如上面建议的那样检查hook_field_is_empty()(必需)
volocuga

1

Drupal 8

如果有人在D8中需要相同的答案,那就是我要测试的领域:

if ($entity->hasField('field_event_date_start')
  && !$entity->get('field_event_date_start')->isEmpty()) {
  // Do something ...
}
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.