Проверьте, не заполнено ли поле


18

Как проверить, что поле пустое, когда у вас есть объект $ node?

Я нашел это как возможное решение:

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

Я могу проверить сейчас:

UPDATE .UPS! Это ненадежно, хотя я обещаю, что это работало на меня вчера.

isset($field);

но мне интересно, есть ли лучший способ.

Просветите меня

Ответы:


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, если у него есть какие-либо данные, он вернет массив, поэтому не стоит беспокоиться, что $ field будет иметь значение FALSE в случае
числовых

Это не сработало для меня, потому что возвращало значение по умолчанию, когда ничего не было установлено.
река

@ Sam152 Спасибо! Это работало отлично, когда я вошел в систему, но когда я вышел из системы, это ничего не показывает. Есть ли причина для этого и какое-либо решение?
Дан

Привет, Дэн. Вход в систему не должен иметь никакого влияния на приведенный выше код. Возможно, вы используете 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 также пусто. Также я проверяю, что вы не можете применить эту функцию напрямую, если поле многозначное.
Корбахо

1
Это то, что делает empty (), когда вы передаете ему переменную, содержащую 0, или строку «0»; это может быть поле, использующее значение, когда оно пустое, и вызов 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]), так что вы можете определить, является ли поле пустым или нет с помощью выражения

(! Пусто ($ содержание [ 'field_name'] [ '# экспоната'] [0] [значение]))

где field_nameсоответствует имени нужного поля.


Нет. Ключ "value" - это просто имя столбца БД. Это может быть различным в зависимости от типа поля. Я думаю, что лучший способ - проверить 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 ...
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.