多个值触发#状态


18

如何让多个值触发Form API的#state?

举例来说,我希望此字段不仅在值是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')),
    ),
),

Answers:


39

这是您需要的:

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

这确实是正确的方法,当前标记为正确的方法是错误的。有关更多信息,请参见此
Robin

#states API在2011年肯定已经走了很长一段路。标记为正确。
Citricguy 2014年

这是一个很好的答案,我是从Google来到这里的,就像十几次一样。
AyeshK 2015年

可以正常查看。在运行任何“AJAX”后,连连加
大师

3

我唯一能想到的方法是在D7中使用#ajax。

这里有一些有用的提示,希望在开始之前会有所帮助。

  1. API形式的#ajax很棒,值得学习
  2. #states不支持OR或XOR(没有补丁?http: //drupal.org/node/735528 )
  3. dpm($ form); 和自定义提交功能上的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 2012年

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”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.