Какова цель функции entity_metadata_wrapper () и почему я должен ее использовать?

Кажется, я разрабатываю надстройки для большого количества модулей, которые в настоящее время используют Entity API , а entity_metadata_wrapper() продолжает выскакивать.

страница документов говорит об этом:

  

Возвращает оболочку свойств для данных.

     

Если сущность завернута, оболочка может использоваться для получения дополнительных оберток для свойств права.

Игнорируя чудесно фрейдистское написание слова «сущность» там, я действительно не понимаю, какова цель этих оберток.

Я понимаю, что функция по существу возвращает EntityDrupalWrapper класс:

  

Обертка упрощает применение обратных вызовов getter и setter свойств сущностей

Но то, что я не могу понять, это , как это облегчает процесс.

Например, чтобы обновить свойство состояния узла, я мог бы использовать этот код:

$node = node_load($nid);
$node->status = 1;
node_save($node);

Это довольно чисто. Насколько я понимаю (но может быть и неправильно) эквивалентный код с использованием entity_metadata_wrapper() был бы более подробным, чем это.

Я не уверен, что это просто использование термина «обертка», который отключает меня здесь, но я тоже просмотрел код в модуле Entity, и я не совсем понимаю его.

Кто-нибудь может объяснить, какие преимущества использовать эту функцию, и, возможно, предоставить простой пример кода для общего использования?

23 голоса | спросил Clive 7 J0000006Europe/Moscow 2012, 19:53:08

1 ответ


23

Да, изменение статуса узла тривиально, так как это свойство с жестким кодом.

Поля, с другой стороны, намного сложнее. Они вложены в три уровня в глубину, а field_get_items () , чтобы получить их на правильном языке, для установки значений полей нет такой функции. Поэтому вам всегда нужно проверить, является ли поле переводимым или нет , и вам нужно знать, какое свойство точно содержит значения вы ищете /хотите установить.

Два примера, которые показывают, что может сделать оболочка объекта:

  • Следующая строка добавляет позицию транзакции в заказ, заботясь о языке и фактическом свойстве, который содержит ссылочный идентификатор, взятый из следующего ответа https://drupal.stackexchange.com/a/23513/31

    $order_wrapper->commerce_line_items[] = $line_item;
    
  • Аналогичным образом, имея возможность прямого доступа к значению поля, без необходимости проверять язык или дельта, даже имея возможность прямого доступа к ссылочным объектам, взятым из https://drupal.stackexchange.com/a/33010/31

    $subnode = entity_metadata_wrapper('node', $node)->field_subnode->value();
    $default = $subnode->title;
    

Обертка объектов является движущей силой гибких, мощных модулей, таких как API поиска и Правила , поскольку он позволяет им прокладывать себе путь через несколько уровней ссылок, чтобы вы могли, например, получить доступ к полю продукта, который пользователь купил в заказе с чем-то вроде [commerce-order:commerce-line-items:0:commerce-product:some-field] (на самом деле это не так, но что-то в этом роде) или добавить сводку ссылочного узла в индекс поиска.

Тем не менее, я не очень люблю API API-оболочки, это огромные внутренние массивы и что даже простые свойства снова являются классами-оболочками. Я надеюсь, что улучшенная система (и, надеюсь, полевая) в Drupal 8 устранит необходимость в такой оболочке благодаря наличию классифицированных объектов.

ответил Berdir 7 J0000006Europe/Moscow 2012, 23:27:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132