drupal_process_states 中可选的 Drupal 8 不起作用

Drupal 8 optional in drupal_process_states doesn't work

我用 drupal_process_states 定义了几个条件字段,只有当单选按钮的值为 'post' 时才应显示和验证这些条件字段。它适用于 'invisible' 和 'disabled' 属性,但不适用于 'optional' 属性。它允许提交表单,但在后端验证时失败,表示这些字段是必需的。这是我的代码,形式为 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;
}

有什么想法吗?

很明显,states只提供了前端功能,后端规则需要你自己实现。例如,如果交付方式是电子邮件,我不需要地址字段,所以我正在清除这些地址字段错误:

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