Drupal 7'de Alan API alanlarını dinamik olarak gizleme / gösterme


14

'Yeni ekle' formuna sahip bir varlık oluşturdum. İşletmenin sınırlı sayıda gerçek değişkeni vardır. Özel Alanlar (yani Alan API'sı) kullanarak ihtiyacım olan ekstra verilerin çoğunu ekledim.

Bu aşamada yapmam gereken şey, bir alanı diğerinin değerine göre dinamik olarak gizleyebilmektir. örneğin, bir açılır alanın değeri Hayır olarak ayarlanmışsa, başka bir alan gizlenmelidir, aksi takdirde gösterilmelidir.

Görebildiğim kadarıyla, bu işlevselliği Form API (yani AJAX özelliği aracılığıyla) kullanılarak oluşturulan alanlara eklemek biraz kolaydır, ancak ekli alanları kullanarak elde etmek için herhangi bir yolu var mı? Bunu çözmek için gereken bu özel Javascript kullanarak hiçbir sorunları var.


Drupal.org/project/conditional_fields'ın d7 için henüz hazır olup olmadığından emin değilim , ama aramaya değer olabilir
Jukebox

Yanıtlar:


5

jQuery bunun için iyi çalışır:

(function($) {
  $(document).ready(function() {
    $('#select1').change(function() {
      switch ($(this).val()) {
        case '1':
          $('#field2').hide();
          break;
        default:
          $('#field2').show();
          break;
      }
    });
  });
}) (jQuery);

Evet, form sayfasında drupal_add_js kullanarak sonlandırdım ve bunu jQuery'de yaptım. Bunu yapmanın daha 'Drupal' bir yolu olup olmadığını merak ediyordum.
NRaf

Drupal #states'in görünürlük yaklaşımının büyük bir hayranı olmadığımı söyleyebilirim, bu yüzden yukarıda önermedim.
keithm

@keithm Lütfen neden devlet hayranı olmadığınızı açıklar mısınız (2015 itibariyle, D7). #States vs drupal_add_js kullanmaya karar vermeye çalıştığımız bir proje üzerinde çalışıyorum. Sizce neden biri diğerine göre daha iyi bir seçim?
blue928

Bence meşru bir programcı tercihi meselesi; benim mantığım sizinkinden farklı olabilir. Bununla birlikte, pratikte Javascript / jQuery'de bulunan işlevselliği kopyalayan başka bir sözdizimine başvurmayı sevmiyorum. #States'i denediğimde, çok sınırlayıcı olarak tasarlandığı kullanım durumlarını da buldum. Sorunum bu kullanım durumları dışında genişlediğinde, zaten düz Javascript her şeyi yeniden yazmak zorunda kaldı.
keithm

19

Drupal 7'de #statesözel jQuery komut dosyası yerine $ form kullanabilirsiniz . Misal:

  $form['student_type'] = array(
    '#type' => 'radios',
    '#options' => array(
      'high_school'   => t('High School'),
      'undergraduate' => t('Undergraduate'),
      'graduate'      => t('Graduate'),
    ),
    '#title' => t('What type of student are you?')
  );

  // High school information.
  $form['high_school']['tests_taken'] = array(
    '#type' => 'checkboxes',
    '#options' => drupal_map_assoc(array(t('SAT'), t('ACT'))),
    '#title' => t('What standardized tests did you take?'),
    // This #states rule says that this checkboxes array will be visible only
    // when $form['student_type'] is set to t('High School').
    // It uses the jQuery selector :input[name=student_type] to choose the
    // element which triggers the behavior, and then defines the "High School"
    // value as the one that triggers visibility.
    '#states' => array(
      'visible' => array(   // action to take.
        ':input[name="student_type"]' => array('value' => 'high_school'),
      ),
    ),
  );

#statesBirden çok değer koşulu için kullanmak istiyorsanız, örnek :

 $form['student_type'] = array(
    '#type' => 'checkboxes',
    '#options' => array(
      'high_school'   => t('High School'),
      'undergraduate' => t('Undergraduate'),
      'graduate'      => t('Graduate'),
    ),
    '#title' => t('What type of student are you?')
  );

  // High school information.
  $form['high_school']['tests_taken'] = array(
    '#type' => 'textfield',
    '#title' => t('What standardized tests did you take?'),
    '#states' => array(
      'visible' => array(   // action to take.
        ':input[name="student_type[high_school]"]' => array('checked' => TRUE),
        ':input[name="student_type[undergraduate]"]' => array('checked' => TRUE),
        ':input[name="student_type[graduate]"]' => array('checked' => FALSE),
      ),
    ),
  );

Bkz form_example/form_example_states.incgelen örnekler modülünü fazla ayrıntı ve örnekler için.


Konuşma #stateskontrol B değeri (x, y, z) dizi olduğunda gizlemek kontrol A: ben gibi daha karmaşık görüş koşullarını tanımlamak için bir yol bulmuş hiç. Bunun için bir sözdizimi biliyor musunuz?
Artur

1
Yukarıdaki güncellememi görün
milkovsky

4

Koşullu Alanları denemelisiniz , bu modülün bu görev için bir zorunluluk olduğunu düşünüyorum. Kullanıcı dostu bir yönetici arayüzündeki alanlar arasında bağımlılıklar ayarlayabilirsiniz. Örneğin,A alanı yalnızca görünür eğer Balan değeri "vardır 1234 " ya da ayarlayabilirsiniz Colmak textfield'ı görünür yalnızca Dtarla kontrol veya set edilir Esaha görünmez eğer Fisimli odaklı vb

Karşıya yükleme formunda, bu bağımlılıklar istemci tarafında, düğüm ekranında, bu bağımlılıklar sunucu tarafında ayarlanır.

Bu bağımlılıkları adresinde ayarlayabilirsiniz admin/structure/types/manage/[YOURCONTENTTYPESMACHINENAME]/dependencies.

Koşullu Alanlar (Resmin kaynağı: projenin sayfası )

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.