Hook_form_alter () neden bu kadar dağınık?


40

İşte karşılaştığım bir örnek. Alanımın etiketine biraz HTML koymaya çalışıyorum.

$form['field_feedback']['und']['#title'] <- has the title
$form['field_feedback']['und'][0]['#title'] <- has the title
$form['field_feedback']['und'][0]['value']['#title'] <- has the title. (Works)

Neden yalnızca bir tanesi kullanılmış olmak üzere üç tane doldurulmuş #yazı özelliği var?


1
bu $ form dizisi nerede üretilir? bildiğim gibi hook_form_alter içinde bu yapıya sahip bir $ formumuz yok
Mohammad Ali Akbari

Bunun için teşekkür ederim. Saçımı çekiyordum. Dizi yapısı çok saçma.
JM01

Yanıtlar:


72

Gördüğünüz şey, Drupal'ın formları bir tarlada nasıl temsil ettiği. Bu şekilde parçalanır:

  • Dış dizinin çocukları, $form['field_back']['und']( 'und'için 'undefined'), alanın çevrildiği farklı dillerdir. Drupal olarak, kullanım için tavsiye edilir LANGUAGE_NONEiçin 'und'kod.
  • Her dil dizisinin içindeki çocuklar, örneğin $form['field_feedback']['und'][0]alan için farklı girişleri temsil eder. Bir alan sınırsız önem düzeyi vardır ve bu alan için birkaç girişler varsa Örneğin, onlar gösterecektir olarak $form['field_feedback']['und'][0], $form['field_feedback']['und'][1]vb
  • Sonunda, alan değerleri için örn $form['field_feedback']['und'][0]['value']. Bu durumda, sütun adı, valuebir düğüm referans alanı türü için nid, vb. Olur. Bir alanla ilişkili birden fazla veri sütunu varsa, daha fazla sayıda çocuk göreceksiniz. Bunlar bir metin alanı / seçim kutusu / özel widget ile temsil edilir ve sonuç olarak alan için bir değer sağlar.

Hiyerarşi boyunca çeşitli öğelere başlıkların eklenmiş olması gerçeği açıktır. Bu başlıkların formda gösterilip gösterilmeyeceği, her birinin içinde bulunduğu render dizisinin belirli ayarlarına bağlıdır #title.

Gerçek form widget'ındaki başlığı değiştirmek için yalnızca dizinin en altındaki form öğesi için endişelenmeniz gerekir: örn. Gerçek giriş öğeleri ( $form['field_feedback']['und'][0]['value'], vb.).

Belirli bir alan için kullanılan öğenin / gerecin oldukça karmaşık olabileceğine dikkat etmeniz büyük olasılıkla. Zaten sahip değilseniz, Devel modülünü kurmanız dpm()ve $formdiziyi incelemek için işlevi kullanmanız gerekir ; Bu, tam olarak dizide hedeflediğiniz elemanların nerede olduğunu gösterir.


3
Kısacası, # Drupal'ın bir form API dizisinin bir etkisi olmadığını düşünmediği bir şeye #title eklemek ; Bu durumda bile, Drupal'ın uyguladığı tüm form öğeleri için bir öznitelik olmadığı için # başlığın dikkate alındığı söylenmiyor. Alan API'si, form dizisine normal bir dizi eklediği için sorunları karmaşıklaştırır, ancak bu, # type'yi arayan Drupal'ı bir form öğesini tanımasıyla karıştırmaz .
kiamlaluno
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.