Яка найкраща практика під час роботи з мовою [und]?


51

Я починаю використовувати цю форму для доступу до даних у своєму модулі. (Див. Коментар №1 .)

$node->field_test[$node->language][0]['value']

Я думав, що це виглядає як досить гарне рішення, але далі за цим самим питанням я знайшов це :

Не припускайте, що 'und' - це поля сутностей без мови, це також поля, які не перекладаються, і без модуля перекладу сутності є всі поля. Крім того, існують відмінності в цьому між різними версіями 7.x Drupal.
Краще скористатися field_get_items()функцією, яка розбереться для вас, під яким мовним кодом зберігаються дані.

І тепер я не знаю, чи те, що я використовую, може щось зламати на дорозі.

Відповіді:


39

Я вважаю, що використання модуля Entity API - це чудова допомога, а також робить код більш читабельним. Наведений вище код не завжди буде працювати, оскільки мова вузла та мова поля можуть бути різними.

За допомогою модуля API сутності та його обгортки ви можете використовувати такий код:

 $node_wrapper = entity_metadata_wrapper('node', $node);
 $field_val = $node_wrapper->field_test->value();

Це має бути кулезахисним. Одне з питань використання модуля сутності полягає в тому, що якщо ви спробуєте отримати доступ до поля, яке не існує, ви отримаєте неприємну помилку та виняток, викинутий замість повідомлення та неправильної поведінки.

Щоб цього уникнути, ви можете спробувати / ловити так

try {
  $field_val = $node_wrapper->field_doesnt_exist->value();
} catch (EntityMetadataWrapperException $e) {
  $field_val = 'default/fallback value';
}

Або ви можете використовувати , isset()який EntityMetadataWrapperобробляє всередині:

$field_val = 'default/fallback value';
if (isset($node_wrapper->field_doesnt_exist)) {
  $field_val = $node_wrapper->field_doesnt_exist->value();
}

Чи entity_metadata_wrapper()застаріла ця функція ? Я спробував викликати це в своєму модулі, і я отримав Fatal error: Call to undefined function entity_metadata_wrapper()- я також здійснив пошук джерела на моїй установці Drupal 7.12 в Dreamweaver, і придумав 0 результатів деінде в коді!
Адітя МП

1
aditya - це в модулі API Entity - не в основі.
lazysoundsystem

1
@adityamenon Як ледачий каже, це не в основному ... все ж, мабуть, це буде для Drupal 8. API інтерфейсів принаймні значно покращиться. Насправді не було часу створити всі API, необхідні для системи сутності для Drupal 7, так що саме цього намагається досягти модуль API сутності.
googletorp

Дякую, хлопці, я був дурним, що не читав відповіді належним чином та перейшов за посиланням на сторінку проекту Entity API :)
Aditya MP

1
Коли я переглядаю вихідний код сутності_metadata_wrapper і слідую за кроликом слідом через усі класи, які створені і розширені, щоб полегшити мені маніпуляції на місцях, мені цікаво, чи все це вартує. Додавання ще 3k + рядків коду до мого завантажувального пристрою та зайняття більшої кількості пам’яті для вирішення всіх змінних призначень ... чи є щось легше? Просто здається, що $node->field_name[LANGUAGE_NONE][0]['value'] = 'foo';це дійсно найефективніший спосіб.
Чарлі Шліссер

19

Для читання ви завжди маєте можливість використовувати field_get_items () , який вибере правильну мову для вас, а також перевірить, чи має поле якесь значення.

На жаль, API поля дуже обмежений у 7.x, немає способу отримати, наприклад, перший елемент поля, навіть не наважуйтесь запитати про отримання значення одним викликом функції ... І немає field_set_items ( ) аналог.

Так що так, модуль сутність API робить забезпечує більш хороший API з недоліком , що він також поставляється з досить багато накладних витрат (Це в основному перетворює кожну цінність обгортка об'єкти , які мають тонни вкладених властивостей масивів Ставки прикріпленими до них). Намагаючись скинути обгортку об'єкта, зазвичай ви отримуєте або нічого, або стіну з нечитабельних масивів.


1
У мене складається враження від того, що ви говорите, що подібні речі можуть бути покращені в Drupal 8? Якщо так, як можна дізнатися, як просуваються такі речі? Окрім сторінок модулів Do, це для мене як лабіринт! :)
Клайв

1
Ну, завжди є надія :) І важко тримати навіть огляд на високому рівні того, що відбувається в Drupal 8. Один із способів - це слідувати ініціативам. Однак це не пряма мета існуючих директив. Частини модуля API сутності переміщуються / переміщуються в ядро ​​(Зараз існує клас Entity, а існуючі об'єкти перетворюються на нову систему). Тож є ймовірність, що ми, наприклад, отримаємо методи безпосередньо на цих класах для обробки полів. Для внесенних змін хорошим ресурсом є нова система запису змін, див. Drupal.org/list-changes/drupal .
Бердір

Блискуча, саме така річ, яку я дуже шукав, дякую! :) Сподіваюсь, ви не заперечуєте над моїм запитанням, я знаю, що це насправді не тематично для сайту ... Я хотів би взяти участь у наданні ядра, але ніколи не брав участі у відкритому коді, я знаходжу все це трохи непросто ... приємно мати гарне місце для початку :)
Клайв

Клайв: Перевірте drupalofficehours.org - саме для того, щоб допомогти людям розпочати роботу. Більше ресурсів там. Я також рекомендую перейти на зустріч групи користувачів, що основні розробники часті або, швидше за все, DrupalCamp, де буде основний розробник або два. Знайдіть свою локальну групу на groups.drupal.org, і ви зможете це розробити. drupical.org теж може бути корисним.
wizonesolutions

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.