Menyembunyikan / menampilkan bidang API Bidang secara dinamis di Drupal 7


14

Saya telah membuat entitas dengan formulir 'tambah baru'. Entitas itu sendiri memiliki sejumlah variabel aktual. Saya telah menambahkan sebagian besar data tambahan yang saya butuhkan menggunakan Bidang khusus (yaitu API Bidang).

Apa yang perlu saya lakukan pada tahap ini adalah dapat secara dinamis menyembunyikan satu bidang berdasarkan nilai yang lain. yaitu jika bidang drop-down memiliki nilainya diatur ke Tidak, bidang lain harus disembunyikan, jika tidak akan ditampilkan.

Dari apa yang saya lihat, agak mudah untuk menambahkan fungsi ini ke bidang yang dibuat menggunakan Formulir API (yaitu melalui properti AJAX), namun apakah ada cara untuk mencapainya menggunakan bidang terlampir? Saya tidak punya masalah menggunakan Javascript khusus jika itu yang diperlukan untuk menyelesaikan ini.


Saya tidak yakin apakah drupal.org/project/conditional_fields siap untuk d7, tetapi mungkin layak untuk dilihat
Jukebox

Jawaban:


5

jQuery berfungsi dengan baik untuk ini:

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

Ya, saya akhirnya menggunakan drupal_add_js pada halaman formulir dan akhirnya melakukannya di jQuery. Saya hanya bertanya-tanya apakah ada cara yang lebih 'Drupal' untuk melakukan ini.
NRaf

Saya akan menyebutkan bahwa saya bukan penggemar pendekatan status Drupal # untuk visibilitas, itulah sebabnya saya tidak menyarankan itu di atas.
keithm

@keithm Bisakah Anda menjelaskan mengapa Anda bukan penggemar negara (per 2015, D7). Saya sedang mengerjakan sebuah proyek di mana kami mencoba membuat keputusan untuk menggunakan #states vs drupal_add_js. Mengapa Anda pikir yang satu lebih baik daripada yang lain?
blue928

Ini masalah preferensi programmer yang sah menurut saya; alasan saya mungkin berbeda dari Anda. Yang mengatakan, dalam prakteknya saya agak tidak suka menggunakan sintaks lain yang menduplikasi fungsi ditemukan di Javascript / jQuery. Ketika saya sudah mencoba status #, saya juga menemukan kasus penggunaan yang tampaknya dirancang terlalu membatasi. Ketika masalah saya meluas di luar kasus penggunaan ini, saya harus menulis ulang semuanya dalam Javascript lurus pula.
keithm

19

Di Drupal 7 Anda dapat menggunakan $ form #statesdaripada skrip jQuery kustom. Contoh:

  $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'),
      ),
    ),
  );

Ini adalah contoh jika Anda ingin menggunakan #stateskondisi multi nilai:

 $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),
      ),
    ),
  );

Lihat form_example/form_example_states.incdari contoh modul untuk lebih detail dan contoh.


Omong-omong #states, saya belum pernah menemukan cara untuk mendefinisikan kondisi visibilitas yang lebih kompleks, seperti: hide control A ketika control B value berada dalam array (x, y, z). Apakah Anda mengetahui sintaksis untuk itu?
Artur

1
Lihat pembaruan saya di atas
milkovsky

4

Anda harus mencoba Conditional Fields , saya pikir modul ini harus dimiliki untuk tugas ini. Anda dapat mengatur dependensi antar bidang pada antarmuka admin yang mudah digunakan. Misalnya, Anda dapat mengatur Alapangan untuk hanya terlihat jika Bbidang memiliki nilai " 1234 ", atau Anda dapat mengatur Ctextfield menjadi terlihat hanya ketika Dbidang diperiksa, atau set Elapangan untuk tak terlihat jika Fyaitu terfokus dll

Pada formulir unggahan, dependensi ini akan diatur di sisi klien, pada tampilan node, dependensi ini akan ditetapkan di sisi server.

Anda dapat mengatur dependensi ini di admin/structure/types/manage/[YOURCONTENTTYPESMACHINENAME]/dependencies.

Bidang Bersyarat (Sumber gambar: proyek halaman )

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.