Я перебираю коллекцию полей и упаковываю элементы коллекции полей entity_metadata_wrapper. Я хотел бы проверить наличие поля перед вызовом его value
метода (что приводит к ошибке в полях, которые не имеют значения), но я не могу найти способ сделать это.
$field_collection_item = field_collection_item_load($id);
$item_wrapper = entity_metadata_wrapper('field_collection_item', $field_collection_item);
// this results in an error if the field_contrib_headshot field is empty
$headshot = $item_wrapper->field_contributor->field_contrib_headshot->value();
Мой текущий обходной путь должен использовать, field_get_items
чтобы видеть, является ли поле пустым, но я хотел бы быть в состоянии сделать это через оболочку метаданных, если это возможно.
Каждый раз, когда есть ссылка на сущность или коллекция полей, isset () никогда не работал для меня. То, что, кажется, работает каждый раз, когда у нас есть ссылка на сущность, делает:
источник
Похоже, у вас есть
entity_reference
где-то там из-за цепочки методов. Но посмотрите на метод __isset () для EntityStructureWrapper .Проверьте как:
а затем использовать
IF
блок, чтобы сделать вашу логику ...РЕДАКТИРОВАТЬ:
$has_headshot
теперь действительная проверка желательна.источник
__isset
отлично работает на полевой коллекции, хотя мне нужно добавить полное имя поля:field_contrib_headshot
вместоcontrib_headshot
field_contributor
ссылается на другое полеfield_contrib_headshot
... у вас там как-то вложено. Я предполагаю, что вы используете entity_reference или что-то еще, например field_group, для вложения этих вещей ... это все, что я имел в виду.$item_wrapper->field_contributor->__isset('field_contrib_headshot')
$has_headshot = isset($item_wrapper->field_contributor->field_contrib_headshot);
Справочные поля сущностей и коллекции полей
Скопировано и вставлено прямо с http://dropbucket.org/node/1201, но, похоже, пока лучший пример, чем любой другой ответ ...
источник
Для EntityMetadataWrapper:
Если у вас есть блоки кода, которые не должны работать, или если вы столкнулись с ошибками PHP, посмотрите на некоторые примеры ниже. В этом примере используется свойство nid.
МОЖЕТ ВСЕ ОШИБКА
ИЛИ
ИЛИ
Вы можете обнаружить, что использование isset, как и так, может принимать значение true, даже если nid отсутствует. -> getIdentifier (), или -> value (), или -> raw () могут выдавать исключения.
ВСЕГДА ВСЕГДА ИСТИНА
ИСПОЛЬЗУЙТЕ ЭТО ВМЕСТО
источник
Я обнаружил, что isset () не может быть использован в результате вызова функции. Так как логическое значение возвращается со следующим оператором, я смог убедиться, что у обернутого элемента действительно есть значение.
источник
Люди часто ошибаются. Когда вы вызываете isset в оболочке метаданных сущности, вы проверяете, поддерживает ли пакет сущностей это свойство. Это не имеет никакого отношения к фактической стоимости поля.
На самом деле не существует независимого метода для проверки, установлено ли значение. Вам просто нужно оценить value () или, желательно, raw (). (Вы также можете вызвать count (), если это многозначное поле, но raw () вернет пустой массив, так что на самом деле это не требуется.)
Чтобы повторить, raw () - это значение, которое вы должны использовать, чтобы проверить, существует ли поле. Это надежно и вычислительно дешево.
источник
Вот моя личная вспомогательная функция для получения значения из потенциально не заданной цепочки ссылок на сущности:
$ wentity - это обернутая сущность, $ field_chain - это массив имен field_name, например:
Вы также можете сделать:
это сработает!
источник