Как лучше всего работать с языком [и]?

51

Я начинаю использовать эту форму для доступа к данным в моем модуле. (См. Комментарий № 1. )

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

Я подумал, что это выглядело довольно хорошим решением, но дальше тот же вопрос я нашел вот так :

Не предполагайте, что 'und' для полей сущностей без языка, это также для полей, которые не могут быть переведены, и без модуля преобразования сущностей, который является всеми полями. Более того, между различными версиями Drupal 7.x есть различия.
Лучше использовать 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();
}
googletorp
источник
Эта функция entity_metadata_wrapper()устарела? Я попытался вызвать это в моем модуле, и я получил Fatal error: Call to undefined function entity_metadata_wrapper()- я также выполнил поиск исходного кода для моей установки Drupal 7.12 в Dreamweaver и нашел 0 результатов где-нибудь еще в коде!
депутат Адитья
1
aditya - это в модуле Entity API, а не в ядре.
lazysoundsystem
1
@adityamenon Как ленивый говорит, что это не в ядре ... но, вероятно, это будет для Drupal 8. API-интерфейсы для сущностей будут, по крайней мере, значительно улучшены. На самом деле не было времени для создания всех API, необходимых для системы управления объектами для Drupal 7, так что именно этого пытается добиться модуль API управления объектами.
googletorp
Спасибо, ребята, я был глуп, что не прочитал ответ должным образом и не перешел по ссылке на страницу проекта API Entity :)
Aditya MP
1
Когда я просматриваю исходный код для entity_metadata_wrapper и следую за кроличьим следом через все классы, которые создаются и расширяются, чтобы упростить мне манипулирование полями, мне интересно, стоит ли это того. Добавление еще 3k + строк кода к моей загрузке и занимающих больше памяти, чтобы справиться со всеми назначениями переменных ... Есть ли что-нибудь более легкое? Просто кажется, что $node->field_name[LANGUAGE_NONE][0]['value'] = 'foo';это действительно самый эффективный способ.
Чарли Шлиссер
19

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

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

Так что да, модуль сущности API делает обеспечивает более хороший API с недостатком , что он также поставляется с довольно много накладных расходами (Это в основном преобразует каждое отдельное значение для объектов оберток , которые имеют тонны вложенной собственности Ставка массивов прикрепленных к ним). Попытка сбросить обертку сущности, как правило, ничего не даст вам или стену нечитаемых массивов.

Berdir
источник
1
Из того, что вы говорите, у меня сложилось впечатление, что подобные вещи могут быть улучшены в Drupal 8? Если так, то как можно узнать, как развиваются подобные вещи? Помимо страниц модуля, для меня это лабиринт! :)
Клайв
1
Ну, всегда есть надежда :) И трудно даже на высоком уровне увидеть, что происходит в Drupal 8, один из способов - следить за инициативами. Однако это не является прямой целью существующих директив. Части модуля API сущностей перемещаются / перемещаются в ядро ​​(теперь существует класс сущностей, а существующие сущности преобразуются в новую систему). Так что есть вероятность, что мы, например, получим методы непосредственно в этих классах для работы с полями. Для зафиксированных изменений хорошим ресурсом является новая система записей изменений, см. Drupal.org/list-changes/drupal .
Бердир
Блестящий, это именно то, что я искал, большое спасибо! :) Надеюсь, вы не возражаете против того, что я спрашиваю. Я знаю, что это не совсем актуально для сайта ... Я бы хотел принять участие в разработке ядра, но я никогда не принимал участия в open-source немного пугающе ... приятно иметь хорошее место для начала :)
Клайв
Клайв: Проверьте drupalofficehours.org - это именно то, чтобы помочь людям начать вносить свой вклад. Больше ресурсов там. Я также рекомендовал бы посетить собрание группы пользователей, на котором основные разработчики часто или, скорее всего, DrupalCamp, где будет находиться один или два основных разработчика. Найдите свою локальную группу на groups.drupal.org, и вы сможете ее решить. drupical.org тоже может быть полезен.
wizonesolutions
-2
$node = node_load($lot_id);
$field_language = field_language('node', $node, 'field_name');
$node->field_name[$field_language][0]['value'] = $custom_value;
Танвир Ахмад
источник
Можете ли вы добавить краткое объяснение, почему это отвечает на вопрос?
Свободное Радикальное