Praktik terbaik untuk kunci bahasa untuk “und” di hook_form_alter

30

Saya memodifikasi dalam formulir di modul khusus saya. Kode terlihat seperti:

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';

    }

}

Namun, saya pikir hard-coding unditu buruk. Apa yang harus menjadi cara yang tepat untuk memodifikasi bidang formulir dengan benar dalam kasus ini?

Shafiul
sumber
Komentar ini mungkin tidak relevan karena sudah lama ditanyakan. Salah satu cara sederhana saya menggunakannya dengan menggunakan foreachloop. Jika hanya LANGUAGE_NONE, itu hanya sekali jalan. Dalam pengertian form_alter, harus secara teknis mengubah bahasa apa pun yang dimiliki formulir.
AyeshK

Jawaban:

40

Sayangnya, jawaban-diri Anda tidak terlalu universal. Bahasa bidang dan bahasa simpul bukan hal yang sama.
Bahasa bidang hanya diperlukan jika Anda menggunakan API Terjemahan Bidang (misalnya terjemahan Entitas ). Ketika Anda mulai menggunakannya, beberapa bidang dikonversi menjadi dapat diterjemahkan.

Bidang yang dapat diterjemahkan memiliki kode bahasa, yang benar-benar masuk akal. Tetapi jika bidang tidak dapat diterjemahkan, kode bahasa akan selalu (dan untuk semua jenis konten, entitas, dll) - LANGUAGE_NONE(terbaik menggunakan konstanta LANGUAGE_NONEdan bukan string 'und').
Jadi dengan solusi Anda, Anda bisa mendapatkan situasi ketika sebuah simpul adalah Rusia, tetapi bidang simpul menggunakan LANGUAGE_NONE.
Untungnya, bidang dilampirkan ke formulir dengan '#language'kunci, yang selalu berisi kode bahasa yang benar.

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

Jika Anda tidak memiliki akses ke formulir terlampir, fungsi API Bahasa Bidang dapat bermanfaat.

kalabro
sumber
4
Ini adalah satu-satunya jawaban yang benar di utas ini.
Bojan Zivanovic
Metode ini juga dapat digunakan saat mengambil kembali jalur bidang gambar dari sebuah node / tipe konten. Terima kasih
Jayaram R
10

Jika Anda tahu tipe entitas dan bundel gunakan sesuatu seperti kode berikut, yang memanggil field_language () .

$field_language = field_language('node', $node, 'field_charity_author');  
$form['field_charity_author'][$field_language][0]['value']['#value'] = arg(3);

Ini akan mencari tahu bahasa yang tepat, dan akan bekerja di situs multibahasa.

Lihat juga field_get_items () .

Attik
sumber
Ini benar sebagai cara API.
Nikit
Bagaimana jika simpul belum dibuat?
AgA
@Nikit saya tidak yakin, karena bahasa tampilan dan bahasa bentuk tidak sama. Penulis mengubah beberapa formulir dan dapat berupa formulir untuk membuat simpul baru atau untuk menambahkan terjemahan baru dari simpul yang ada.
kalabro
@kalabro - bahasa tampilan dan bahasa bentuk - sama dengan konteks saat ini.
Nikit
4

Seluruh undkesepakatan adalah salah satu hal yang lebih menyebalkan dalam Drupal 7 yang tidak berfungsi dengan baik dalam praktiknya seperti ketika dirancang.

Bagaimanapun Anda bisa mendapatkan bahasa pertama menggunakan array_keysseperti ini:

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);
  }
}

Itu harus bekerja sepanjang waktu.

googletorp
sumber
Terima kasih atas jawaban anda. Saya menempelkan apa yang telah saya lakukan untuk memperbaiki masalah ini di jawaban lain. :)
Shafiul
Bisakah saya menggunakan $ langs untuk mengakses nilai bidang yang sama di form_state juga?
AgA
Apakah ini benar-benar aman? Bisakah Anda yakin $ langs [0] selalu merupakan item array yang benar?
rooby
0

(Menjawab pertanyaan saya sendiri kalau-kalau itu membantu seseorang. Jawabannya berhasil untuk saya.)

Saya dapat menulis baris berikut untuk mendapatkan bahasa:

$lang = $form['language']['#value'];    //  Instead of "und"
Shafiul
sumber
5
Ini salah. Lihat jawaban kalabro .
Bojan Zivanovic
0

re: jawaban kalabro

kodenya tidak berfungsi untuk saya - kode saya sedikit berbeda

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

[$ lang] [0] mengembalikan "u" tetapi nilai penuh [$ lang] adalah "und" dan saya juga tidak memerlukan ['nilai'], karena $ form ['FIELDNAME'] ['# language' ] bukan sebuah array, itu adalah sebuah string.

decibel.places
sumber
1
Karakter ke-0 dari 'und' adalah 'u'. Anda berada di labirin lorong-lorong kecil yang berkelok-kelok, semua array.
Chris Burgess