Forms Drupal 8在Drupal#u进程#u状态下为可选';行不通
我已经定义了几个条件字段,只有当单选按钮的值为“post”时才应该显示和验证这些字段。它适用于“不可见”和“禁用”属性,但不适用于“可选”属性。它允许提交表单,但后端验证失败,说明这些字段是必需的。以下是我在alter hook表单中的代码: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
$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);
}
}
}
}