Лучшая практика для языкового ключа для "und" в форме крючка изменить
Я изменяю форму в своем пользовательском модуле. Код выглядит следующим образом:
function my_module_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == "someID") {
$form['field_charity_author']['und'][0]['value']['#value'] = arg(3);
//$form['field_charity_author']['#type'] = 'hidden';
}
}
Однако я думаю, что жесткое кодирование und
- это плохо. Каким должен быть правильный способ правильного изменения полей формы в этом случае?
5 answers
К сожалению, ваш самоответ не столь универсален. Язык полей и язык узлов - это не одно и то же.
Язык полей необходим только в том случае, если вы используете API перевода полей (например, Перевод сущностей ). Когда вы начинаете его использовать, некоторые поля преобразуются в переводимые.
Переводимые поля имеют код языка, что действительно имеет смысл. Но если поле не поддается переводу, код языка всегда будет (и для всех типов контента сущности, и т.д.) - LANGUAGE_NONE
(лучше всего использовать константу LANGUAGE_NONE
, а не строку 'und'
).
Таким образом, с вашим решением вы можете получить ситуацию, когда узел является русским, но поле узла использует LANGUAGE_NONE
.
К счастью, поля прикреплены к форме с помощью ключа '#language'
, который всегда содержит правильный код языка.
$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang][0]['value']['#value'] = $value;
Если у вас нет доступа к прикрепленной форме, Функции API языка полей могут быть полезны.
Если вы знаете тип сущности и связку, используйте что-то вроде следующего кода, который вызывает field_language().
$field_language = field_language('node', $node, 'field_charity_author');
$form['field_charity_author'][$field_language][0]['value']['#value'] = arg(3);
Он определит правильный язык и будет работать на многоязычных сайтах.
Также взгляните на элементы field_get_items().
Вся сделка und
является одной из наиболее раздражающих вещей в Drupal 7, которая на практике работала не так хорошо, как при ее разработке.
В любом случае вы можете получить первый язык, используя array_keys
вот так:
function my_module_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == "someID") {
$langs = array_keys($form['field_charity_author']);
$form['field_charity_author'][$langs[0]][0]['value']['#value'] = arg(3);
}
}
Это должно работать все время.
( Отвечаю на свой собственный вопрос на случай, если это кому-то поможет. Ответ сработал для меня.)
Я могу написать следующую строку, чтобы получить язык:
$lang = $form['language']['#value']; // Instead of "und"
Re: ответ калабро
Его код не работал для меня - мой код немного отличается
$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang]['#value'] = $value;
[Язык$] [0] возвращается "U", однако всю ценность [$язык] "и" и мне не нужен ['значение'] или, так как $форма['ИМЯ_ПОЛЯ']['#язык'] не массив, это была строка.