Лучшая практика для языкового ключа для "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 - это плохо. Каким должен быть правильный способ правильного изменения полей формы в этом случае?

Author: Pierre.Vriens, 2012-03-18

5 answers

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

Переводимые поля имеют код языка, что действительно имеет смысл. Но если поле не поддается переводу, код языка всегда будет (и для всех типов контента сущности, и т.д.) - LANGUAGE_NONE (лучше всего использовать константу LANGUAGE_NONE, а не строку 'und').
Таким образом, с вашим решением вы можете получить ситуацию, когда узел является русским, но поле узла использует LANGUAGE_NONE.
К счастью, поля прикреплены к форме с помощью ключа '#language', который всегда содержит правильный код языка.

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang][0]['value']['#value'] = $value;

Если у вас нет доступа к прикрепленной форме, Функции API языка полей могут быть полезны.

 40
Author: kalabro, 2013-06-09 16:38:34

Если вы знаете тип сущности и связку, используйте что-то вроде следующего кода, который вызывает 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().

 10
Author: Attiks, 2012-05-19 21:40:56

Вся сделка 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);
  }
}

Это должно работать все время.

 4
Author: googletorp, 2012-03-18 18:07:36

( Отвечаю на свой собственный вопрос на случай, если это кому-то поможет. Ответ сработал для меня.)

Я могу написать следующую строку, чтобы получить язык:

$lang = $form['language']['#value'];    //  Instead of "und"
 0
Author: Shafiul, 2012-03-21 05:19:14

Re: ответ калабро

Его код не работал для меня - мой код немного отличается

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang]['#value'] = $value;

[Язык$] [0] возвращается "U", однако всю ценность [$язык] "и" и мне не нужен ['значение'] или, так как $форма['ИМЯ_ПОЛЯ']['#язык'] не массив, это была строка.

 0
Author: decibel.places, 2013-09-02 01:39:09