Пропустить обязательную проверку поля тела
Можно пропустить обязательную проверку поля тела, если оно пустое? Я могу добавить пользовательскую проверку в первую очередь, например:
$form_validate = $form['#validate'][0];
$form['#validate'][0] = 'remove_body_field_validation';
$form['#validate'][] = $form_validate;
function remove_body_field_validation($form, &$form_state) {
$form_state['complete form']['settings']['body_field']['body']['#required'] = FALSE;
}
Но я думаю, что "требуемая проверка" выполняется перед "удалением_под_фильд_валидации"?? :-/
2 answers
Почему бы вам просто не перейти в раздел Структура - > Типы контента -> [Ваш тип] - > Управление полями -> Тело -> Редактировать снимите флажок "Обязательное поле"? Начиная с Drupal 7, тело ведет себя как любое другое поле...
Если вам действительно нужно сделать это в коде, то вы делаете это в form_alter следующим образом:
function [mymodule]_form_alter(&$form, &$form_state, $form_id) {
// some logic here to filter which form is affected (or use hook_form_FORM_ID_alter)
$form['body'][LANGUAGE_NONE][0]['#required'] = FALSE;
}
Есть ли у вас какая-то особая причина делать это во время проверки, а не при отображении формы? Вы заявили, что вам нужно "пропустить обязательную проверку поля тела, если оно пустое", что эквивалентно поворачивая "требуется" полностью.
РЕДАКТИРОВАТЬ: Я нашел способ сделать это (основываясь на этом - https://api.drupal.org/comment/28464#comment-28464):
function my_validate($form, &$form_state) {
$errors = form_get_errors();
if ($errors) {
// Clear errors.
form_clear_error();
// Clear error messages.
$error_messages = drupal_get_messages('error');
// Initialize an array where removed error messages are stored.
$removed_messages = array();
// Remove all errors originated by the 'foo][bar' element.
foreach ($errors as $name => $error_message) {
if ($name == 'body][und][0][value') {
$removed_messages[] = $error_message;
unset($errors[$name]);
}
}
// Reinstate remaining errors.
foreach ($errors as $name => $error) {
form_set_error($name, $error);
// form_set_error() calls drupal_set_message(), so we have to filter out
// these from the error messages as well.
$removed_messages[] = $error;
}
// Reinstate remaining error messages (which, at this point, are messages that
// were originated outside of the validation process).
foreach (array_diff($error_messages['error'], $removed_messages) as $message) {
drupal_set_message($message, 'error');
}
}
}
Чтобы устранить предыдущие ошибки проверки, вы можете удалить их в статической переменной form_set_error
, например, добавить обратный вызов в #element_validate
перейдите к своему элементу и попробуйте выполнить следующую функцию:
function remove_body_field_validation(&$element, &$form_state, $form) {
if ($element['#field_name'] == 'body') {
$element['#required'] = FALSE;
// Clear previous validation errors.
$errors = &drupal_static('form_set_error', array());
$err_key = $element['#field_name'] . '][' . LANGUAGE_NONE;
if (array_key_exists($err_key, $errors)) {
unset($errors[$err_key]);
}
return;
}
}