Drupal 7 Form API:基于OR而不是AND设置表单元素的可见状态

时间:2012-10-09 00:00:30

标签: drupal-7 drupal-modules drupal-forms

我有一个我想要显示的字段集,只有当选择框中选择了几个选项之一时才会显示。问题是,我似乎无法看到如何工作OR。如果在数组中包含多个条件,它将像AND一样运行。我需要它才能工作,如果选择框的值例如为1 2或3。

3 个答案:

答案 0 :(得分:5)

显然支持drupal 7.14'或'和'xor'。它只是在文档中没有任何容易找到的地方。这是我作为一个例子做的事情,以防任何人需要它。这很有效。

$form['survey'] = array(
    '#type' => 'fieldset',
    '#collapsible' => FALSE,
    '#states' => array(
        'visible' => array(
            array(
                array(':input[name="measurementmethod"]' => array('value'=>'5')),
                'xor',
                array(':input[name="measurementmethod"]' => array('value'=>'6')),
                'xor',
                array(':input[name="measurementmethod"]' => array('value'=>'7'))
            )
        )
    )
);

答案 1 :(得分:4)

总结LoneWolfPR s answer

这将是AND:必须检查两个复选框才能生效

array(
    ':input[name^="field_checkbox_1"]' => array('checked' => TRUE),
    ':input[name^="field_checkbox_2"]' => array('checked' => TRUE),
)

这将是OR(将单个条件放入数组中):必须选中一个或两个复选框

array(
    array(':input[name^="field_checkbox_1"]' => array('checked' => TRUE)),
    array(':input[name^="field_checkbox_2"]' => array('checked' => TRUE)),
)

这将是异或(与数组之间的'xor'一样):必须检查一个且只有一个checkox

array(
    array(':input[name^="field_checkbox_1"]' => array('checked' => TRUE)),
    'xor',
    array(':input[name^="field_checkbox_2"]' => array('checked' => TRUE)),
)

答案 2 :(得分:1)

参考d.o。

上的更改记录“Fixed conditionals to allow OR and XOR constructions

从7.14开始,Drupal表单API #state支持OR和XOR条件。

以下代码允许条件:dependee_1 OR (dependee_2 OR dependee_3) OR (dependee_4 XOR dependee_5)

<?php
  $form['dependent_1']['#states'] = array(
    'disabled' => array(
    // dependee_1 has value ON
      '[name="dependee_1"]' => array('value' => 'ON'),
      array(
      // At least one of dependee_2 or dependee_3 has value ON
        array('[name="dependee_2"]' => array('value' => 'ON')),
        array('[name="dependee_3"]' => array('value' => 'ON')),
      ),
      array(
      // Only one of dependee_4 or dependee_5 can have value ON
        array('[name="dependee_4"]' => array('value' => 'ON')),
        'xor',
        // The field should be disabled when Select #1 has value ON; at least one
        // of Select #2 and Select #3 has value ON; one but only one of Select #4
        // and Select #5 has value ON.
        array('[name="dependee_5"]' => array('value' => 'ON')),
      ),
    )
  );
?>

基本上,对象文字({...})中的所有元素都是AND,并且数组文字([...])中的所有元素都是ORed;如果数组的第一个元素是'xor',则条件是异或。