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

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

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

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

  

Не предполагайте, что 'und' для полей сущностей без языка, это также для полей, которые не являются переводимыми, и без модуля трансляции сущности, который является всеми полями. Более того, существуют различия в этом между различными версиями Drupal 7.x.
  Лучше использовать функцию field_get_items(), которая будет сортировать для вас по какому языковому коду хранятся данные.

И теперь я не знаю, может ли то, что я использую, сломать что-то по дороге.

51 голос | спросил Merrick 6 MarpmTue, 06 Mar 2012 21:01:07 +04002012-03-06T21:01:07+04:0009 2012, 21:01:07

3 ответа


40

Я считаю, что использование модуля 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 6 MarpmTue, 06 Mar 2012 21:16:06 +04002012-03-06T21:16:06+04:0009 2012, 21:16:06
19

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

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

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

ответил Berdir 6 MarpmTue, 06 Mar 2012 23:46:27 +04002012-03-06T23:46:27+04:0011 2012, 23:46:27
-2
$node = node_load($lot_id);
$field_language = field_language('node', $node, 'field_name');
$node->field_name[$field_language][0]['value'] = $custom_value;
ответил Tanvir Ahmad 4 J0000006Europe/Moscow 2014, 17:03:55

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

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

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