Forms Drupal 8在Drupal#u进程#u状态下为可选';行不通

Forms Drupal 8在Drupal#u进程#u状态下为可选';行不通,forms,field,conditional,drupal-8,Forms,Field,Conditional,Drupal 8,我已经定义了几个条件字段,只有当单选按钮的值为“post”时才应该显示和验证这些字段。它适用于“不可见”和“禁用”属性,但不适用于“可选”属性。它允许提交表单,但后端验证失败,说明这些字段是必需的。以下是我在alter hook表单中的代码: $states_when_delivery_is_post = array( 'disabled' => array( ':input[name="field_delivery_way"]' => array('valu

我已经定义了几个条件字段,只有当单选按钮的值为“post”时才应该显示和验证这些字段。它适用于“不可见”和“禁用”属性,但不适用于“可选”属性。它允许提交表单,但后端验证失败,说明这些字段是必需的。以下是我在alter hook表单中的代码:

$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;
}

有什么想法吗?

显然,州只提供前端功能,所以你应该自己实现后端规则。例如,如果传递方式是电子邮件,我不需要地址字段,因此我正在清除这些地址字段错误:

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);
            }
        }
    }
}

显然,州只提供前端功能,所以您应该自己实现后端规则。例如,如果传递方式是电子邮件,我不需要地址字段,因此我正在清除这些地址字段错误:

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);
            }
        }
    }
}