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

23

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

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

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

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

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

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

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

Но я не могу понять, как это облегчает жизнь.

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

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

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

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

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

Клайв
источник
Это может добавить более глубокое понимание сущности API и упаковщиков. Это разговор Фаго, парня из Entity. wolfgangziegler.net/drupalcon-denver
Кен
Спасибо, это звучит очень полезно с первого гамбита. Я посмотрю, когда у меня будет время
Клайв
Это "видео было удалено из всплывающей подсказки", но слайды все еще загружаются.
artfulrobot

Ответы:

23

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

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

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

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

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

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

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

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

Berdir
источник
Блестяще, я знал, что я что-то пропустил с этим. Я думаю, что это было описание того, EntityDrupalWrapperчто вызвало путаницу; когда в нем упоминались «свойства», я не осознавал, что поля вообще были задействованы, я просто думал, что это буквально означает, что класс позаботился о свойствах (nid, status и т. д.). Спасибо за разъяснение, знание того, что модуль Rules использует его для селектора данных, делает его более понятным
Клайв
@Berdir «Мне не обязательно интересен API-интерфейс обертки ...» У меня те же чувства, что и у вас. Вы делаете что-нибудь для борьбы с этим? Используете ли вы field_view_value () для просмотра значений? Как бы вы посоветовали устанавливать значения в пользовательских обратных вызовах для настраиваемого рабочего процесса или панели мониторинга?
Чарли Шлиссер