Hook_form_alter'da "und" için dil anahtarı için en iyi yöntem


30

Özel modülümdeki bir formda değişiklik yapıyorum. Kod gibi görünüyor:

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 kodlamanın undkötü olduğunu düşünüyorum . Bu durumda form alanlarını doğru şekilde değiştirmenin doğru yolu ne olmalıdır?


Bu yorum uzun zaman önce sorulduğu için muhtemelen ilgisizdir. Bir basit yolu bir foreachdöngü kullanarak kullanıyorum . Yalnızca LANGUAGE_NONE ise, bu tek bir işlemdir. Form_alter anlamında, formun dili ne olursa olsun teknik olarak değiştirmelidir.
AyeshK

Yanıtlar:


40

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

Çevirilebilir alanların dil kodları vardır, bu da gerçekten mantıklıdır. Alan çevrilebilir değilse Ama, dil kodu hep olacak (ve tüm içerik türlerinin, kişiler, vs için) - LANGUAGE_NONE(en iyi sabiti kullanmak LANGUAGE_NONEve dize 'und').
Bu nedenle, çözümünüzle bir düğüm Rusça olduğunda bir durum elde edebilirsiniz, ancak düğümün bir alanı kullanılır LANGUAGE_NONE.
Neyse ki, alanlar '#language'her zaman doğru dil kodunu içeren anahtarla forma eklenir .

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

Ekli forma erişiminiz yoksa, Alan Dili API işlevleri yararlı olabilir.


4
Bu konudaki tek doğru cevap budur.
Bojan Zivanoviç

Bu yöntem, bir düğüm / içerik türünün görüntü alanı yolunu alırken de kullanılabilir. Teşekkürler
Jayaram R

10

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

$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 () 'ye de bakınız .


API yolu olarak bu doğru.
Nikit

Peki ya düğüm oluşturulmadıysa?
AgA

@Nikit Emin değilim, çünkü ekran dili ve form dili aynı değil. Yazar bazı formları değiştirir ve yeni düğüm oluşturmak için veya mevcut düğümün yeni çevirisini eklemek için form olabilir.
kalabro

@kalabro - ekran dili ve form dili - geçerli bağlamda aynıdır.
Nikit

4

Bütün mesele undDrupal 7'de tasarlandığı gibi pratikte işe yaramayan daha sinir bozucu şeylerden biri.

Neyse, array_keysböyle kullanarak ilk dili edinebilirsiniz :

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 yaramalı.


Cevabınız için teşekkürler. Bu sorunu başka bir cevaba göre düzeltmek için yaptıklarımı yapıyorum. :)
Shafiul

Form_state içindeki aynı alanın değerine erişmek için $ langs kullanabilir miyim?
AgA

Bu gerçekten güvenli mi? $ Langs [0] 'in her zaman doğru dizi maddesi olduğundan emin misiniz?
Rooby

0

(Birinin yardımcı olması durumunda kendi soruma cevap vermek. Cevap benim için işe yaradı.)

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

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

5
Bu yanlış. Kalabro'nun cevabını görün .
Bojan Zivanoviç

0

re: kalabro cevabı

kodu benim için işe yaramadı - kodum biraz farklı

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

[$ lang] [0] "u" döndürdü, ancak [$ lang] 'ın tam değeri "und" ve ben de [' değer ']' e ihtiyacım olmadı, çünkü $ form ['FIELDNAME'] ['# language' ] bir dizi değildi, bir dize idi.


1
'Und' in 0ncı karakteri 'u'dur. Tüm dizileri çevreleyen küçük pasajların bir labirentindesiniz.
Chris Burgess
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.