Лучшая практика для языкового ключа для â € œundâ € в hook_form_alter

Я изменяю форму в своем настраиваемом модуле. Код выглядит так:

  my_module_form_alter (& amp; $ form, & amp; $ 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 плохое. Каким должен быть правильный способ правильного изменения полей формы в этом случае?

30 голосов | спросил giga 18 MarpmSun, 18 Mar 2012 20:21:45 +04002012-03-18T20:21:45+04:0008 2012, 20:21:45

5 ответов


37

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

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

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

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

ответил kalabro 20 Mayam12 2012, 01:08:54
9

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

ответил Attiks 19 Maypm12 2012, 22:31:02
4

Вся сделка und является одной из самых неприятных вещей в Drupal 7, которая не так хорошо работает на практике, как когда она была разработана.

В любом случае вы можете получить первый язык, используя array_keys , как это:

  my_module_form_alter (& amp; $ form, & amp; $ 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);
  }
}
 

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

ответил googletorp 18 MarpmSun, 18 Mar 2012 22:07:36 +04002012-03-18T22:07:36+04:0010 2012, 22:07:36
0

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

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

  $ lang = $ form ['language'] ['# value']; //Вместо "und"
 
ответил giga 21 MaramWed, 21 Mar 2012 09:19:14 +04002012-03-21T09:19:14+04:0009 2012, 09:19:14
0

re: ответ kalabro

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

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

[$ lang] [0] вернул «u», но полное значение [$ lang] равно «und», и мне не понадобилось ['value'], потому что $ form ['FIELDNAME'] ['# language'] не был массивом, это была строка.

ответил decibel.places 2 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 02 Sep 2013 05:39:09 +0400 2013, 05:39:09

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

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

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