Недавно я пытался обновить свой код, чтобы использовать обертки объектов для доступа к значениям полей. Теперь у меня есть следующее:
$wrapper = entity_metadata_wrapper("node", $nid); print($wrapper->field_property_sample()->value());
вместо этого:
print($node->field_property_sample[LANGUAGE_NONE][0]["value"]);
Иногда я сталкиваюсь с этой проблемой:
EntityMetadataWrapperException: неизвестное свойство данных field_property_sample.
Есть ли способ обойти это?
У меня около 10 из этих полей, которые могут генерировать это исключение, и это действительно становится уродливым
$wrapper = entity_metadata_wrapper("node", $nid); try { print($wrapper->field_property_sample()->value()); } catch (EntityMetadataWrapperException &e){ print(""); } /** repeat 10 times **/
Есть ли какая-то функция, которую я могу более или менее назвать так?
$wrapper = entity_metadata_wrapper("node", $nid); print($wrapper->field_property_sample->exists() ? $wrapper->field_property_sample->value() : "" ); /** repeat 10 times **/
Да, вы можете просто использовать существующие функции языка PHP
try { print($wrapper->field_property_sample->value()); } catch (EntityMetadataWrapperException $e) { // Recover }
Или, поскольку EntityMetadataWrapper
реализует __isset()
вы можете использовать это:
print isset($wrapper->field_property_sample) ? $wrapper->field_property_sample->value() : '';
Что касается ответа Клайва, вы можете использовать __isset()
следующим образом:
print ($wrapper->__isset('field_property_sample') ? $wrapper->field_property_sample->value() : '';
На вложенных коллекциях полей:
При повторении списка наборов полей и проверки непустой коллекции полей, вложенной в первую, isset () не работает. Однако я обнаружил, что проверка:
foreach ($node_wrapper->field_fc_one AS $field_collection) { // Grab a nested field collection, properly wrapped. $nested_fc_wrapper = $field_collection->field_nested_fc; // isset() or $wrapper->__isset('') do not work here, but this does: if(nested_fc_wrapper->getIdentifier()) { // Do some stuff } }
Использование field_property_sample()
не имеет смысла, потому что:
$wrapper->field_property_sample()
используется для вызова метода класса $wrapper->field_property_sample
используется для получения значения свойства класса Свойство – это переменная, которую вы хотите использовать, метод класса – это функция, которую вы хотите вызвать.
Таким образом, используя:
$wrapper->field_property_sample->value();
является правильным синтаксисом.
Для правильного использования обложек метаданных Entity проверьте: обертки метаданных Entity .
Вот пример кода:
try { $wrapper = entity_metadata_wrapper('node', $node); $wrapper->field_property_sample = 'some data'; $wrapper->field_multi_sample = array('1st', '2nd'); $wrapper->save(); } catch (EntityMetadataWrapperException $e) { watchdog_exception('my_module', $e); }
Для печати используйте:
print($wrapper->field_property_sample->value());
или dpm()
, dd()
из модуля dpm()
.