progress_man
@progress_man
php – it's my life

В чем может быть ошибка при сохранении комментария в Drupal 8?

В админке создана форма comment-form. В mytheme.theme изменяю форму:
function mytheme_form_comment_comment_form_alter(&$form, FormStateInterface $form_state, $form_id = NULL) {
  $form['actions']['submit']['#validate'] = ['Drupal\mytheme\AjaxCommentForm::ajaxValidateCallback'];
  $form['actions']['submit']['#ajax'] = [
    'callback' => 'Drupal\mytheme\AjaxCommentForm::ajaxSubmitCallback',
    'event'    => 'click',
    'progress' => FALSE,
  ];
}


Часть кода mytheme\src\AjaxCommentForm:
class AjaxCommentForm {
  public function ajaxSubmitCallback(array &$form, FormStateInterface $form_state) {
    $response = new AjaxResponse();

    ...

    $message = [
      '#theme'           => 'status_messages',
      '#message_list'    => \Drupal::service('messenger')->all(),
      '#status_headings' => [
        'status'  => t('Status message'),
        'error'   => t('Error message'),
        'warning' => t('Warning message'),
      ],
    ];

    $messages = \Drupal::service('renderer')->render($message);
    $response->addCommand(new HtmlCommand('#' . Html::getClass($form['form_id']['#value']) . '-messages', $messages));


    return $response;
  }

  public function ajaxValidateCallback(array &$form, FormStateInterface $form_state) {
    
    ...

    if (strlen($form_state->getValue('field_comment_name')) === 0) {
      $form_state->setErrorByName('field_comment_name', 'Введите Ваше имя');
    }
  }
}


Валидация работает как надо, однако при попытке сохранения вылезает ошибка
Drupal\Core\Entity\EntityStorageException: Entity validation was skipped.


Если отключаю свою валидацию, то форма сохраняет новый комментарий без проблем. В какую сторону копать?
  • Вопрос задан
  • 91 просмотр
Решения вопроса 1
andead
@andead
друпал девелопер, фрилансер
Попробуйте

$form['#validate'][] = 'Drupal\mytheme\AjaxCommentForm::ajaxValidateCallback';


И методы в AjaxCommentForm должны быть static.
И бизнес логика должны быть в модуле, а не в теме.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы