Intereting Posts
NuSOAP: как изменить тип содержимого запроса? Веб-службы vTiger: разрешение на выполнение операции отклонено для запроса Использование регулярного выражения для соответствия блоку div, имеющему определенный идентификатор Проверьте, заканчивается ли строка с номером в PHP Zend framework 2 рекомендуется для обработки ошибок Где следует хранить конфигурацию, зависящую от среды, в приложении Zend Framework 2? Как подключиться к 2 базам данных одновременно в PHP Получение количества IPv6-адресов из Ipv6 CIDR в PHP Простой поиск и замена регулярных выражений в php для минимизации / сжатия javascript? Восклицательный знак перед переменным – требуется разъяснение как отправить HTTP-запрос методом GET в PHP на другой веб-сайт Неужели это неправильно, если не использовать сеттеров и геттеров? Как запустить программу Windows GUI с помощью PHP? Нужна ваша помощь, данные IOS Swift Post для Json Alamofire Ошибка session_start ()

EntityMetadataWrapperException: неизвестное свойство данных для поля

Недавно я пытался обновить свой код, чтобы использовать обертки объектов для доступа к значениям полей. Теперь у меня есть следующее:

$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() .