Запретить сохранение узла в hook_node_presave

При сохранении /обновлении узла мне нужно проверить, является ли уникальная комбинация полей. Предположим, что это уникальный модуль , но эта функция не работает (проверка только одного поля) , Поэтому я создал свой собственный крючок:

function mymodule_node_presave(\Drupal\Core\Entity\EntityInterface $node) {

  if ($node->bundle() == 'mycontent') {

    $term = \Drupal\taxonomy\Entity\Term::load($node->get('field_mytaxonomy')->target_id);

    $query = \Drupal::entityQuery('node');
    $query->condition('type', 'mycontent');
    $query->condition('field_mydate', $node->get('field_mydate')->value, '=');
    $query->condition('field_mytaxonomy', $term->id(), '=');

    $nids = $query->execute();

    if ($nids) {
      drupal_set_message('Fields are not unique!', 'error');
      // I need to prevent saving of node here      
    }  
  }
}

Выполняется обнаружение узла с создаваемыми дубликатами. Как предотвратить сохранение этого узла?

4 голоса | спросил tdd 16 FriEurope/Moscow2016-12-16T12:01:10+03:00Europe/Moscow12bEurope/MoscowFri, 16 Dec 2016 12:01:10 +0300 2016, 12:01:10

3 ответа


6

Как предотвратить сохранение этого узла?

Если вы хотите, чтобы узел был сохранен в методе presave или hook, вам нужно выбросить исключение:

throw new \Exception(t('Fields are not unique!'));

Другим удобным для пользователя было бы проверить это в форме в первую очередь и дать пользователю возможность исправить ввод, прежде чем вы выкинете исключение.

Двойная проверка этого в presave по-прежнему является хорошей идеей, чтобы убедиться, что содержимое неправильного узла не сохраняется, независимо от того, какая форма, Rest API или код используется. Если кто-то пропустит первый уровень проверок в форме, у вас нет другого выбора, кроме как исключить исключение.

Edit:

Если возникает исключение, вы можете заменить ответ по умолчанию 500 на пользовательскую обработку ошибок в подписчике на исключение, см. Обработка исключения подключения к базе данных с помощью настраиваемого обработчика

ответил 4k4 16 FriEurope/Moscow2016-12-16T13:14:43+03:00Europe/Moscow12bEurope/MoscowFri, 16 Dec 2016 13:14:43 +0300 2016, 13:14:43
3

У меня было подобное требование, и я хотел получить более приятное решение, чем просто исключение. Следующее, казалось, хорошо работало для меня, в моем hook_node_presave():

$response = new RedirectResponse(\Drupal::request()->getRequestUri());
$response->send();
drupal_set_message(t('This is my error message'), 'error', TRUE);
exit;
ответил BrynJ 13 PMpThu, 13 Apr 2017 18:00:49 +030000Thursday 2017, 18:00:49
1

Это не правильный выбор для проверки. Используйте функцию hook_form_FORM_ID_alter (), чтобы добавить функцию проверки.

$form['#validate'][] = 'my_custom_validate';

Затем в вашей пользовательской функции проверки:

$term = $form_state->getValue('field_mytaxonomy');
// Your logic here.
$form_state->setErrorByName('field_mytaxonomy', t('Fields are not unique!'));
ответил Job 19 FebruaryEurope/MoscowbMon, 19 Feb 2018 16:50:57 +0300000000pmMon, 19 Feb 2018 16:50:57 +030018 2018, 16:50:57

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132