Яке призначення функції ent_metadata_wrapper (), і чому я повинен її використовувати?


23

Я, здається, розробляє доповнення до багатьох модулів, які використовують Entity API на даний момент, і entity_metadata_wrapper()функція продовжує з'являтися.

Про це говорить на сторінці " Документи" :

Повертає обгортку властивості для даних.

Якщо об'єкт обгорнуто, його можна використовувати для отримання подальших обгортків для властивостей права.

Ігноруючи дивовижно фрейдівське написання слова "сутність", я не розумію, яка мета цих обгортків.

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

Обгортка Полегшує застосовуючи методи отримання і установки зворотних викликів властивостей сутностей

Але я не можу зрозуміти, як це полегшує справи.

Наприклад, для оновлення властивості стану вузла я міг би використовувати цей код:

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

Це досить чисто. Як я розумію (але може бути неправильно) еквівалентний код , використовуючи entity_metadata_wrapper()буде більш багатослівним , ніж це.

Я не впевнений, що тут просто мене вживає термін "обгортка", але я також переглянув код у модулі Entity і я не дуже близький до його розуміння.

Хтось може пояснити, які переваги використання цієї функції, і, можливо, надати простий приклад коду для загального випадку використання?


Це може додати більш глибокого розуміння для атрибутів і обгортань сутності. Це розмова Фаго, хлопця Entity. wolfgangziegler.net/drupalcon-denver
Кен

Дякую, це звучить дуже корисно з початкового гамбіту. Я перегляну це, коли в мене з’явиться певний час
Клайв

Це "відео було вилучено із" blip ", але слайди все ще завантажуються.
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 і правила , оскільки це дозволяє їм знайти свій шлях через кілька рівнів посилань, так що ви можете , наприклад , доступ в поле продукту користувач купив в порядку , щось на кшталт [commerce-order:commerce-line-items:0:commerce-product:some-field](можливо, насправді це невірно, але щось подібне), або додати підсумок тела посиланого вузла до вашого пошукового індексу.

Проте, я не necessarly люблять фактичний API обгортки, це величезні внутрішні масиви і що навіть прості властивості знову обгортки класів. Я сподіваюся, що вдосконалена система сутності (і, сподіваємося, поле) в Drupal 8 усуне необхідність у такій обгортці завдяки тому, що класифікували об'єкти.


Діамант, я знав , що я тільки що пропустив що - то з цим. Я думаю , що це був опис того , EntityDrupalWrapperщо привело до плутанини; коли він згадував "властивості", я не розумів, що поля взагалі були задіяні, я просто вважав, що це буквально означає, що клас піклується про властивості (nid, статус тощо). Подяка за очищення , що вгору, знаючи , що модуль Правила використовує його для вибору даних дозволяє зробити набагато більше сенсу
Клайв

@Berdir «Я не necessarly любить фактичну API обгортки ...» У мене те ж почуття, що і ви. Є чи у вас що - небудь для боротьби з цим? Чи використовуєте ви field_view_value () для значень переглянути? Як би ви рекомендували встановлювати значення у користувацьких зворотних дзвінках для користувальницького робочого процесу чи панелі інструментів?
Чарлі Шліссер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.