Как создать форму, требуемую для состояний?

У меня есть раскрывающийся список, который отображает различные поля на основе того, что выбрано, и я знаю, что я могу toogle видимость с состояниями, но когда я пытаюсь использовать требуемый * span, отображается, но на самом деле это не требуется. Я имею в виду, что даже если это «требуется», я могу нажать «Отправить» и не получить сообщение об ошибке от drupal. Я делаю что-то неправильно или это в настоящее время нарушено в Drupal 7.8?

  $ form ['host_info'] = массив (
        '#type' => 'Выбрать',
        '#title' => t («Соединение с хостом»)
        '#options' => массив (
          'SSH2' => т ( 'SSH2'),
          «Веб-сервис» => t («Веб-сервис»),
        ),
        '#default_value' => t (variable_get ('host_info', 'SSH2')),
        '#description' => t («Укажите информацию подключения к хосту»),
        '#required' => ПРАВДА,
    );

    $ form ['ssh_host'] = массив (
        '#type' => 'текстовое поле',
        '#title' => t («Адрес хоста»),
        '#description' => t («Адрес хоста сервера SSH2»),
        '#default_value' => т (variable_get ( 'ssh_host')),
        '#states' => массив (
            'visible' => массив (
                ': input [name = host_info]' => array ('value' => t ('SSH2')),
            ),
            'required' => массив (
                ': input [name = host_info]' => array ('value' => t ('SSH2')),
            ),
        ),
    );

    $ form ['ssh_port'] = массив (
        '#type' => 'текстовое поле',
        '#title' => т ( "Порт"),
        '#description' => t («Номер порта сервера SSH2»),
        '#default_value' => т (variable_get ( 'ssh_port')),
        '#states' => массив (
            'visible' => массив (
                ': input [name = host_info]' => array ('value' => t ('SSH2')),
            ),
            'required' => массив (
                ': input [name = host_info]' => array ('value' => t ('Web Service')),
            ),
        ),
    );
 
30 голосов | спросил Sathariel 27 +04002011-10-27T02:28:55+04:00312011bEurope/MoscowThu, 27 Oct 2011 02:28:55 +0400 2011, 02:28:55

8 ответов


18

Вам нужно будет проверить это самостоятельно в пользовательской функции проверки.

Все настройки, определенные в #states, в браузере 100%, все, что он делает, не отображается для Drupal при отправке формы (например, все поля невидимой формы отправляются и проверяются таким же образом, если не было # состояния).

ответил Berdir 27 +04002011-10-27T11:11:38+04:00312011bEurope/MoscowThu, 27 Oct 2011 11:11:38 +0400 2011, 11:11:38
11

Вы можете использовать это как:

  '#' = штатов & GT; [
  'required' => [
    ': input [name = "outside_because [somecheckbox]"]' => ['checked' => ПРАВДА],
  ],
],
 
ответил MuschPusch 18 J0000006Europe/Moscow 2013, 18:41:43
7

Очень похоже на ответ Felix Eve, это только фрагмент для проверки встроенного элемента:

Вы вызываете элемент validate function требуемый элемент:

  $ form ['element'] = array (
....
  '#element_validate' => массив (
     0 => 'My_module_states_require_validate',
   ),
)
 

Затем функция проверки обнаружит требуемое поле и проверит, имеет ли он правильное значение формы, которое выявило бы поле, которое необходимо выполнить.

  function my_module_states_require_validate ($ element, $ form_state) {
  $ required_field_key = key ($ element ['# states'] ['visible']);
  $ required_field = explode ('' ', $ required_field_key);
  if ($ form_state ['values'] [$ required_field [1]] == $ element ['# states'] ['visible'] [$ required_field_key] ['value']) {
    if ($ form_state ['values'] [$ element ['# name']] == '') {
      form_set_error ($ element ['# name'], $ element ['# title']. 'требуется.');
    }
  }
}
 
ответил Dominic Woodman 29 +03002014-10-29T17:55:17+03:00312014bEurope/MoscowWed, 29 Oct 2014 17:55:17 +0300 2014, 17:55:17
3

Существует другой способ использовать функцию AFTER_BUILD для формы и сделать это поле опционным. Вот ссылка для drupal 6.

Добавьте это в свой код формы

  $ form ['# after_build'] [] = 'custom_form_after_build';
 

Внедрить после сборки, проверить свое настраиваемое полевое условие

  function custom_form_after_build ($ form, & amp; $ form_state) {
  if (isset ($ form_state ['input'] ['custom_field'])) {
    $ form ['another_custom_field'] ['# required'] = FALSE;
    $ form ['another_custom_field'] ['# needs_validation'] = FALSE;
  }
 return $ form;
}
 

В моем случае #states добавляло несколько *, поэтому я должен их избегать и использовать jquery, чтобы скрыть и показать диапазон, содержащий *

.. <До> $ ( 'другой обычай поля ') найти (' пядь') скрыть ();

и

.. <До> $ ( 'другой обычай поля ') найти (' пядь') шоу ();

На основе моего значения custom_field.

ответил atyagi 27 MarpmFri, 27 Mar 2015 17:06:57 +03002015-03-27T17:06:57+03:0005 2015, 17:06:57
3

Вот подробное руководство по Drupal 7 form # состояния .

Это важный бит:

  /**
 * Внедрение формы.
 * /
function module_form ($ form, $ form_state) {
  $ form ['checkbox_1'] = [
    '#title' => t ('Флажок 1'),
    '#type' => Флажок ',
  ];

  //Если флажок установлен, то ввод текста
  //требуется (с красной звездой в заголовке).
  $ form ['text_input_1'] = [
    '#title' => t ('Текстовый ввод 1'),
    '#type' => 'текстовое поле',
    '#states' => [
      'required' => [
        'input [name = "checkbox_1"]' => [
          'checked' => ПРАВДА,
        ],
      ],
    ],
  ];

  $ form ['actions'] = [
    'submit' => [
      '#type' => 'Отправить',
      '#value' => т ( 'Submit'),
    ],
  ];

  return $ form;
}

/**
 * Форма проверяет обратный вызов.
 * /
function module_form_validate ($ form, $ form_state) {
  //если флажок установлен, а ввод текста пуст, тогда проверьте проверку
  //сообщение об ошибке.
  if (! empty ($ form_state ['values'] ['checkbox_1']) & amp; & amp; & amp; & amp; & amp; & amp; & amp;
    пустые ($ form_state [ 'значения'] [ 'text_input_1'])
  ) {
    form_error ($ form ['text_input_1'], t (поле '@ name требуется.', [
      '@name' => $ Форма [ 'text_input_1'] [ '# название'],
    ]));
  }
}
 
ответил Wim Mostrey 25 Jam1000000amWed, 25 Jan 2017 09:26:43 +030017 2017, 09:26:43
2

Я только что столкнулся с той же проблемой, которая необходима для обеспечения пользовательской проверки, но я хотел, чтобы это контролировалось с помощью массива #states, поэтому мне не пришлось дважды указывать те же правила.

Он работает, извлекая имя поля из селектора jQuery (селектор должен быть в формате : input [name = "field_name"] или он не будет работать).

Код ниже проверяется только в конкретном сценарии, в котором я его использовал, однако, хотя он может оказаться полезным кому-то другому.

  function hook_form_validate ($ form, & amp; $ form_state) {

    //проверяем требуемое поле, указанное в массиве состояний

    foreach ($ form as $ key => $ field) {

        if (is_array ($ field) & amp; & amp; isset ($ field ['# states'] ['required'])) {

            $ required = false;
            $ lang = $ field ['# language'];

            foreach ($ field ['# states'] ['required'] as $ cond_field_sel => $ cond_vals) {

                //искать имя = в селекторе jquery - если этого нет, то сдайтесь (пока)
                preg_match ('/name = "(. *)" /', $ cond_field_sel, $ matches);

                if (isset ($ matches [1])) {

                    //удалить язык из имени поля
                    $ cond_field_name = str_replace ('[und]', '', $ matches [1]);

                    //получать идентификатор значения (например, значение, tid, target_id)
                    $ value_ident = ключ ($ cond_vals);

                    //петля над значениями условного поля
                    foreach ($ form_state ['values'] [$ cond_field_name] [$ lang] as $ cond_field_val) {

                        //проверяем соответствие
                        if ($ cond_vals [$ value_ident] == ​​$ cond_field_val [$ value_ident]) {
                            //теперь мы знаем, что это поле требуется
                            $ required = true;
                            перерыв 2;
                        }

                    }

                }

            }

            if ($ required) {
                $ field_name = $ field [$ lang] ['# field_name'];
                $ filled_in = false;
                foreach ($ form_state ['values'] [$ field_name] [$ lang] как $ item) {
                    if (array_pop ($ item)) {
                        $ filled_in = true;
                    }
                }
                if (! $ filled_in) {
                    form_set_error ($ field_name, t (': field - обязательное поле', array (': field' => $ field [$ lang] ['# title'])));
                }
            }

        }
    }

}
 
ответил Felix Eve 12 MarpmWed, 12 Mar 2014 14:15:03 +04002014-03-12T14:15:03+04:0002 2014, 14:15:03
2

Я смог сделать это в Drupal 8:

  '#states' => массив (
            'required' => массив (
              array (': input [name = "host_info"]' => array ('value' => 'SSH2')),
             ),
           ),
 

Не ставьте t ('SSH2'). это поместит его там вместо значения параметра, который является нетранслированным SSH2.

Я подозреваю, что это тоже сработает для Drupal 7.

ответил Will 25 PM000000110000000431 2016, 23:34:04
0

У меня есть вложенные поля формы и флажок, поэтому мне нужно немного поработать над ответом Доминика Вудмана. В случае, если любое другое тело сталкивается с одной и той же проблемой:

  function my_module_states_require_validate ($ element, $ form_state) {
  $ required_field_key = key ($ element ['# states'] ['visible']);
  $ required_field = explode ('' ', $ required_field_key);
  $ keys = explode ('[', $ required_field [1]);
  $ keys = str_replace (']', '', $ keys);
  $ tmp = $ form_state ['values'];
  foreach ($ keys as $ key => $ value) {
    $ tmp = $ tmp [$ value];
  }
  if ($ tmp == $ element ['# states'] ['visible'] [$ required_field_key] ['checked']) {
    $ keys2 = explode ('[', $ element ['# name']);
    $ keys2 = str_replace (']', '', $ keys2);
    $ tmp2 = $ form_state ['values'];
    foreach ($ keys2 as $ key => $ value) {
      $ tmp2 = $ tmp2 [$ value];
    }
    if ($ tmp2 == '') {
      form_set_error ($ element ['# name'], $ element ['# title']. t ('требуется.'));
    }
  }
}
 
ответил Koli 9 MarpmFri, 09 Mar 2018 18:40:58 +03002018-03-09T18:40:58+03:0006 2018, 18:40:58

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132