หลายค่าไปยังทริกเกอร์ #states


18

ฉันจะมีหลายค่าเพื่อกระตุ้น #states ของ Form API ได้อย่างไร

พูดเช่นฉันต้องการให้ฟิลด์นี้สามารถมองเห็นได้ถ้าค่าเป็น 5 (ปัจจุบันทำงานด้านล่าง) แต่ต้องการทำให้ฟิลด์นี้ปรากฏถ้าค่าคือ 3, 4 หรือ 5

'#states' => array(
    'visible' => array(
       ':input[name="field_star_rating"]' => array('value' => t('5')),
    ),
),

เป็นบันทึกผมพยายามต่อไปและจะไม่ทำงาน ใช้งานได้เฉพาะถ้าค่าเป็น '4'

'#states' => array(
    'visible' => array(
        ':input[name="field_star_rating"]' => array('value' => t('5')),
        ':input[name="field_star_rating"]' => array('value' => t('4')),
    ),
),

สิ่งนี้ยังใช้งานไม่ได้ แต่จะทำงานได้ก็ต่อเมื่อค่าเป็น '4':

'#states' => array(
    'visible' => array(
        ':input[name="field_star_rating"]' => array('value' => t('5'), 'value' => t('4')),
    ),
),

คำตอบ:


39

นี่คือสิ่งที่คุณต้องการ:

'#states' => array(
    'visible' => array(
        ':input[name="field_star_rating"]' => array(
            array('value' => t('5')),
            array('value' => t('4'))
        ),
    ),
),

นี่เป็นวิธีที่ถูกต้องอย่างแน่นอนกระแสที่ทำเครื่องหมายว่าถูกต้องนั้นผิด ดูปัญหานี้สำหรับข้อมูลเพิ่มเติม: drupal.org/node/735528
Robin

#states API แน่ใจแล้วว่ามาไกลถึงปี 2011 การทำเครื่องหมายว่าถูกต้อง
Citricguy

นี่เป็นคำตอบที่ยอดเยี่ยมและฉันมาที่นี่จาก Google เช่นเดียวกับหลายสิบครั้ง ... ความโปรดปรานกำลังมาถึง
AyeshK

มันทำงานได้ดีสำหรับมุมมองปกติ หลังจากเรียกใช้ 'ajax' มันจะเพิ่มเข้ามาเรื่อย ๆ
Guru

3

วิธีเดียวที่ฉันสามารถคิดได้คือใช้ #ajax ใน D7

นี่คือเคล็ดลับที่มีประโยชน์บางประการที่ฉันหวังว่าฉันจะได้รู้ก่อนเริ่ม

  1. #ajax ในรูปแบบ API นั้นยอดเยี่ยมและคุ้มค่าในการเรียนรู้
  2. #states ไม่รองรับ OR หรือ XOR (ไม่มีแพตช์หรือไม่http://drupal.org/node/735528 )
  3. DPM ($ รูปแบบ); และ var_dump ($ form_state) ในฟังก์ชั่นส่งที่กำหนดเองไม่มีค่า

นี่คือเวอร์ชันที่แก้ไขแล้วของหนึ่งในตัวอย่าง AJAX จากโมดูลตัวอย่าง

function plugin_autotextfields($form, &$form_state) {

    $form['star_rating'] = array(
        '#type' => 'select',
        '#title' => t('Star Rating'),
        '#options' => array('_none' => '- select -', 5 => '5 Star', 4 => '4 Star', 3 => '3 Star', 2 => '2 Star', 1 => '1 Star'),
        '#ajax' => array(
            'callback' => 'plugin_autotextfields_callback',
            'wrapper' => 'textfields',
            'effect' => 'fade',
        ),
    );

    $form['textfields'] = array(
        '#title' => t("Fieldset Name"),
        '#prefix' => '<div id="textfields">',
        '#suffix' => '</div>',
        '#type' => 'fieldset',
        '#description' => t('Where the field will be placed'),
    );

    if (!empty($form_state['values']['star_rating']) && $form_state['values']['star_rating'] == 5) {
        $form['textfields']['review'] = array(
            '#type' => 'textfield',
            '#title' => t('Message if 5 stars'),
        );
    } else if (!empty($form_state['values']['star_rating'])) {
        $form['textfields']['review'] = array(
            '#type' => 'textfield',
            '#title' => t('Message if not 5 stars'),
        );
    }

    $form['submit'] = array(
        '#type' => 'submit',
        '#value' => t('Click Me'),
    );

    return $form;
}

function omfg_autotextfields_callback($form, $form_state) {
    return $form['textfields'];
}

ฉันหวังว่านี่จะช่วยคนที่พบปัญหาเดียวกัน :)


ว้าว! คำตอบที่เป็นประโยชน์มากเพื่อนของฉัน ฉันได้ห่อหัวของฉันรอบ ๆ ปัญหากับ #states และตอนนี้มันทำงานได้ แต่ #ajax จะง่ายขึ้นอย่างเห็นได้ชัดตอนนี้ที่คุณตบฉันด้วยเบาะแส และเคล็ดลับการแก้จุดบกพร่องนั้นเป็นโบนัสหรือไม่? ขอโทษฉันต้องจ่ายให้คุณด้วยกรรมเลวทรามต่ำช้า ;)
stefgosselin

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

PS ดูตัวอย่างโมดูลสำหรับคุณสมบัติเพิ่มเติม "form_example / form_example_states.inc"

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