2016-05-26 2 views
0

Я определил несколько условных полей с drupal_process_states, которые должны отображаться и проверяться только в том случае, если переключатель имеет значение «пост». Он работает для «невидимых» и «отключенных» свойств, но он не работает для свойства «optional». Он позволяет отправить форму, но она не работает на основе проверки подлинности, говоря, что эти поля необходимы. Вот мой код в форме перекрестного крючка:Drupal 8 необязательно в drupal_process_states не работает

$states_when_delivery_is_post = array(
    'disabled' => array(
     ':input[name="field_delivery_way"]' => array('value' => 'email'), 
    ), 
    'optional' => array(
     ':input[name="field_delivery_way"]' => array('value' => 'email'), 
    ), 
    'invisible' => array(
     ':input[name="field_delivery_way"]' => array('value' => 'email'), 
    ), 
); 

if (isset($form['field_country'])) { 
    $form['field_country']['#states'] = $states_when_delivery_is_post; 
} 

Любые идеи?

ответ

1

По-видимому, состояния предоставляют только интерфейсные функции, поэтому вы должны сами реализовать бэкэнд-правила. Например, я не нужен адрес поля будет необходимо, если доставка путь электронной почты, поэтому я расчистке эти поля адреса ошибки:

function module_name_form_name_validation(&$form, \Drupal\Core\Form\FormStateInterface $form_state) { 

if ($form_state->getValue('field_delivery_way')[0]['value'] == 'email') { 
    $errors = $form_state->getErrors(); 
    $conditional_fields = ['field_city][0][value', 'field_house_number][0][value', 'field_postcode][0][value', 'field_street][0][value', 'field_country']; 
    $form_state->clearErrors(); 
    foreach ($errors as $element => $error) { 
     if (!in_array($element, $conditional_fields)) { 
      $form_state->setErrorByName($element, $error); 
     } 
    } 
} 

}