Drupal 7 Form API: установите видимое состояние элемента формы на основе ИЛИ вместо И

У меня есть набор полей, который я хотел бы отображать, только если в поле выбора выбрана одна из нескольких опций. Проблема в том, что я не понимаю, как работать в операционной. Если вы включаете в массив несколько условий, он работает как AND. Мне нужно, чтобы он работал, чтобы, например, если в поле выбора было значение 1, 2 или 3.


person LoneWolfPR    schedule 09.10.2012    source источник


Ответы (3)


По-видимому, начиная с drupal 7.14 поддерживаются 'or' и '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'))
            )
        )
    )
);
person LoneWolfPR    schedule 09.10.2012

Подводя итоги LoneWolfPR s ответ

Это будет И: оба флажка должны быть отмечены, чтобы вступить в силу.

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

Это будет ИЛИ (поместите отдельные условия в массивы): необходимо установить один или оба флажка

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

Это будет XOR (например, или и с 'xor' между массивами): должен быть отмечен один и только один флажок

array(
    array(':input[name^="field_checkbox_1"]' => array('checked' => TRUE)),
    'xor',
    array(':input[name^="field_checkbox_2"]' => array('checked' => TRUE)),
)
person yunzen    schedule 30.07.2014
comment
Это должен быть принятый ответ. Точное, и решение работает нормально. - person Manas Chaturvedi; 01.07.2016

Ссылка на запись об изменении «Исправленные условные выражения, разрешающие конструкции OR и XOR» на d.o.

Начиная с версии 7.14, API форм Drupal #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, а все элементы литерала массива ([...]) объединяются оператором И; если первым элементом массива является 'xor', выполняется операция XOR.

person emaV    schedule 25.09.2013
comment
Ответы только по ссылкам не приветствуются, ответы SO должны быть конечной точкой поиска решения (по сравнению с еще одной остановкой ссылок, которые со временем устаревают). Пожалуйста, подумайте о добавлении здесь автономного синопсиса, сохранив ссылку в качестве справки. - person Alex; 25.09.2013