Найкраща практика мовного ключа для "унд" у гачку_форма_алтер


30

Я змінюю форму у своєму спеціальному модулі. Код виглядає так:

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погано. Яким має бути правильний спосіб змінити поля форми у цьому випадку?


Цей коментар, мабуть, не має значення, оскільки його задавали давно. Один простий спосіб, яким я користуюся, використовуючи foreachцикл. Якщо це лише LANGUAGE_NONE, це один пробіг. У формі_alter сенс, він повинен технічно змінювати будь-яку мову форми.
АйешК

Відповіді:


40

На жаль, ваша самовідповідь не така універсальна. Мова поля та мова вузлів - це не одне і те ж.
Мова поля потрібна лише у тому випадку, якщо ви використовуєте API перекладу поля (наприклад, переклад Entity ). Коли ви починаєте його використовувати, деякі поля перетворюються на перекладні.

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

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

Якщо у вас немає доступу до доданої форми, функції API Field Field можуть бути корисними.


4
Це єдина правильна відповідь у цій темі.
Боян Живанович

Цей метод також може бути використаний під час відновлення контуру поля зображення у вузол / тип вмісту. Спасибі
Jayaram R

10

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


Це правильний спосіб API.
Нікіт

А як бути, якщо вузол не створений?
AgA

@Nikit Я не впевнений, оскільки мова відображення та мова форми не однакові. Автор змінює певну форму, і вона може бути формою для створення нового вузла або для додавання нового перекладу існуючого вузла.
калабро

@kalabro - мова відображення та мова форми - однакова в поточному контексті.
Нікіт

4

Вся 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);
  }
}

Це повинно працювати весь час.


Дякую за вашу відповідь. Я вставлю те, що я зробив, щоб виправити це питання в іншій відповіді. :)
Шафіул

Чи можу я використовувати $ langs для отримання значення того ж поля у form_state?
AgA

Це справді безпечно? Чи можете ви бути впевнені, що $ langs [0] - це завжди правильний елемент масиву?
рубін

0

(Відповідаючи на власне запитання у випадку, якщо це комусь допомагає. Відповідь спрацювала на мене.)

Я можу написати наступний рядок, щоб отримати мову:

$lang = $form['language']['#value'];    //  Instead of "und"

5
Це неправильно. Дивіться відповідь калабро .
Боян Живанович

0

re: відповідь калабро

його код не працював для мене - мій код трохи інший

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

[$ lang] [0] повернув "u", але повне значення [$ lang] - "und", і мені не потрібно було "[значення"], тому що $ form ['FIELDNAME'] ['# language' ] не був масив, це був рядок.


1
Першим символом 'und' є 'u'. Ви знаходитесь в лабіринті закручених маленьких проходів, усіх масивів.
Кріс Берджесс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.