web-gelistirme-sc.com

Hook_form_alter'da "und" için dil anahtarı için en iyi uygulama

Özel modülümdeki bir formda değişiklik yapıyorum. Kod şuna benzer:

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

    }

}

Ancak, zor kodlama und kötü olduğunu düşünüyorum. Bu durumda form alanlarını doğru şekilde değiştirmenin uygun yolu ne olmalıdır?

30
Shafiul

Ne yazık ki, kendi yanıtınız o kadar evrensel değil. Alan dili ve düğüm dili aynı şey değildir.
Alan dili yalnızca Alan Çevirisi API'sını kullanıyorsanız gereklidir (örneğin Varlık çevirisi ). Kullanmaya başladığınızda, bazı alanlar çevrilebilir duruma dönüştürülür.

Çevrilebilir alanlar, gerçekten mantıklı olan dil koduna sahiptir. Ancak alan çevrilebilir değilse, dil kodu her zaman (ve tüm içerik türleri, varlıklar vb. İçin) olacaktır - LANGUAGE_NONE (dizeyi değil LANGUAGE_NONE sabitini kullanmak en iyisidir 'und').
Çözümünüzle bir düğüm Rusça olduğunda bir durum elde edebilirsiniz, ancak düğümün bir alanı LANGUAGE_NONE kullanıyorsa.
Ne mutlu ki, alanlar her zaman doğru dil kodunu içeren '#language' tuşuyla forma eklenir.

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

Eklenmiş forma erişiminiz yoksa, Alan Dili API işlevleri faydalı olabilir.

40
kalabro

Varlık türünü ve paketini biliyorsanız, field_language () çağıran aşağıdaki kod gibi bir şey kullanın.

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

Doğru dili anlayacak ve çok dilli sitelerde çalışacaktır.

Ayrıca field_get_items () adresine bir göz atın.

10
Attiks

Tüm und anlaşması Drupal 7) tasarımında olduğu gibi pratikte işe yaramayan daha can sıkıcı şeylerden biridir.

Her neyse array_keys bunun gibi:

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

Bu her zaman işe yarar.

4
googletorp

re: kalabro'nun cevabı

kodu benim için çalışmadı - kodum biraz farklı

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

[$ lang] [0] "u" döndürdü ancak [$ lang] ifadesinin tam değeri "und" ve ['değer'] 'e de ihtiyacım yoktu, çünkü $ form [' FIELDNAME '] [' # dil ' ] bir dizi değil, bir dizeydi.

0
decibel.places

(Birine yardım etmesi durumunda kendi sorumu cevaplamak. Cevap benim için çalıştı.)

Dili almak için aşağıdaki satırı yazabilirim:

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