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