การซ่อน / แสดงฟิลด์ Field API ใน Drupal 7 แบบไดนามิก


14

ฉันได้สร้างเอนทิตีด้วยฟอร์ม 'เพิ่มใหม่' กิจการนั้นมีตัวแปรจริงจำนวน จำกัด ฉันได้เพิ่มข้อมูลพิเศษส่วนใหญ่ที่ฉันต้องการโดยใช้ฟิลด์ที่กำหนดเอง (เช่น Field API)

สิ่งที่ฉันต้องทำในขั้นตอนนี้คือสามารถซ่อนฟิลด์หนึ่งแบบไดนามิกโดยยึดตามค่าของฟิลด์อื่น นั่นคือถ้าเขตข้อมูลแบบหล่นลงมีการตั้งค่าเป็นไม่ใช่เขตข้อมูลอื่นควรถูกซ่อนไว้มิฉะนั้นควรแสดงเขตข้อมูลนั้น

จากสิ่งที่ฉันเห็นมันค่อนข้างง่ายที่จะเพิ่มฟังก์ชั่นนี้ไปยังเขตข้อมูลที่สร้างขึ้นโดยใช้แบบฟอร์ม API (เช่นผ่านคุณสมบัติ AJAX) แต่มีวิธีใดที่จะบรรลุผลโดยใช้ฟิลด์ที่แนบมา? ฉันไม่มีปัญหาในการใช้ Javascript ที่กำหนดเองถ้านั่นคือสิ่งที่จำเป็นในการแก้ไขปัญหานี้


ฉันไม่แน่ใจว่าdrupal.org/project/conditional_fieldsพร้อมที่จะไปซื้อ d7 แล้ว แต่มันอาจคุ้มค่าที่จะดู
Jukebox

คำตอบ:


5

jQuery ทำงานได้ดีสำหรับสิ่งนี้:

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

ใช่ฉันลงเอยด้วยการใช้ drupal_add_js ในหน้าแบบฟอร์มและลงเอยด้วยการทำใน jQuery ฉันแค่สงสัยว่ามีวิธี 'Drupal' มากขึ้นในการทำเช่นนี้
NRaf

ฉันจะพูดถึงว่าฉันไม่ใช่แฟนตัวยงของ Drupal #states วิธีการมองเห็นซึ่งเป็นสาเหตุที่ฉันไม่แนะนำข้างต้น
keithm

@keithm คุณช่วยอธิบายเพิ่มเติมได้ไหมว่าทำไมคุณถึงไม่ได้เป็นแฟนของอเมริกา (ตั้งแต่ปี 2015, D7) ฉันกำลังทำงานในโครงการที่เราพยายามตัดสินใจใช้ #states vs drupal_add_js ทำไมคุณคิดว่ามีตัวเลือกที่ดีกว่าอีกทางเลือกหนึ่ง
blue928

มันเป็นเรื่องของการตั้งค่าโปรแกรมเมอร์ที่ชอบด้วยกฎหมายในความคิดของฉัน; เหตุผลของฉันอาจแตกต่างจากของคุณ ที่กล่าวว่าในทางปฏิบัติฉันไม่ชอบใช้ไวยากรณ์อื่นที่ซ้ำซ้อนกับการทำงานที่พบใน Javascript / jQuery เมื่อฉันลอง #states ฉันก็พบกรณีการใช้งานที่มันถูกออกแบบมาอย่าง จำกัด เมื่อปัญหาของฉันขยายออกไปนอกกรณีการใช้งานเหล่านี้ฉันต้องเขียนใหม่ทั้งหมดด้วยจาวาสคริปต์ตรงๆ
keithm

19

ใน Drupal 7 คุณสามารถใช้ $ form #statesแทนสคริปต์ jQuery แบบกำหนดเอง ตัวอย่าง:

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

นี่คือตัวอย่างถ้าคุณต้องการใช้#statesสำหรับเงื่อนไขหลายค่า:

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

ดูform_example/form_example_states.incจากตัวอย่างโมดูลสำหรับรายละเอียดและตัวอย่างเพิ่มเติม


การพูดของ#statesผมไม่เคยพบวิธีที่จะกำหนดเงื่อนไขการแสดงผลที่ซับซ้อนมากขึ้นเช่น: ซ่อนควบคุมเมื่อค่าการควบคุม B คือในอาร์เรย์ (x, y, z) คุณรู้จักไวยากรณ์หรือไม่?
Artur

1
ดูการอัปเดตของฉันด้านบน
milkovsky

4

คุณควรลองใช้ฟิลด์เงื่อนไขฉันคิดว่าโมดูลนี้เป็นสิ่งที่ต้องมีสำหรับงานนี้ คุณสามารถตั้งค่าการพึ่งพาระหว่างเขตข้อมูลในส่วนติดต่อผู้ดูแลระบบที่ใช้งานง่าย ตัวอย่างเช่นคุณสามารถตั้งค่าAฟิลด์ให้ปรากฏเฉพาะเมื่อBฟิลด์มีค่า " 1234 " หรือคุณสามารถตั้งค่าฟิลด์Cข้อความให้มองเห็นได้เฉพาะเมื่อDมีการตรวจสอบEฟิลด์หรือตั้งค่าฟิลด์เป็นมองไม่เห็นถ้าFมีที่มุ่งเน้นฯลฯ

ในแบบฟอร์มอัพโหลดการพึ่งพาเหล่านี้จะถูกตั้งค่าฝั่งไคลเอ็นต์บนการแสดงโหนดการขึ้นต่อกันเหล่านี้จะถูกตั้งค่าบนฝั่งเซิร์ฟเวอร์

คุณสามารถตั้งค่าการพึ่งพาเหล่านี้ได้ที่ admin/structure/types/manage/[YOURCONTENTTYPESMACHINENAME]/dependenciesคุณสามารถตั้งค่าการอ้างอิงเหล่านี้ได้ที่

ทุ่งเงื่อนไข (ที่มาของภาพ: หน้าของโครงการ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.