Пропустить обязательную проверку поля тела


Можно пропустить обязательную проверку поля тела, если оно пустое? Я могу добавить пользовательскую проверку в первую очередь, например:

  $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
Author: kenorb, 2013-12-30

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');
    }
  }
}
 6
Author: m1n0, 2013-12-31 09:36:50

Чтобы устранить предыдущие ошибки проверки, вы можете удалить их в статической переменной 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;
  }

}
 0
Author: kenorb, 2016-09-16 10:00:14