Использование регулярных выражений для #states в Form API

В друпал 7 в Form API появилось новое свойство #states. Оно делает возможным изменять состоянии элементов форм (unchecked, visible, enabled и т.д.) в зависимости от состояния других элементов.

Это позволяет обходится без написания кастомного javascript кода. Можно в зависимости от конкретного значения поля изменить состояние другого. Но #states не умеет работать с регулярными выражениями.

С помощью небольшого js файла сделаем возможность в качестве значения поля выбирать regex.

Но это решение не будет работать , если элементы формы , которые мы используем для #states будут подгружаться на странице с помощью ajax .
Эту небольшую проблему можно решить модулем http://drupal.org/project/behavior_weights , который позволяет добавлять для Drupal.behaviors вес .
С помощью него мы сделаем , чтобы Drupal.behaviors нашего скрипта запускался раньше чем Drupal.behaviors.states .

Пример кода , в котором описывается элемент формы , видимость которого зависит от регулярного выражения , использующего значение другого элемента:


$form['#attached']['js'][] = 'states_modification.js';
$form['settings'] = array(
  '#type' => 'textfield',
  '#states' => array(
    'visible' => array(
      ':input[name="color"]' => array('value' => array('regex' => '^(white|red)$')),
    ),
  ),
);

states_modification.js


Drupal.behaviors.statesModification = { 
  weight: -10, 
  attach: function(context, settings) { 
    if (Drupal.states) { 
      Drupal.states.Dependent.comparisons.Object = function(reference, value) { 
        if ('regex' in reference) { 
          return (new RegExp(reference.regex, reference.flags)).test(value); 
        } 
        else { return reference.indexOf(value) !== false; } 
    } 
  } 
}