Lors de la sauvegarde/mise à jour du nœud, je dois valider si la combinaison de certains champs est unique. Champ unique le module est censé permettre cela, mais cette fonctionnalité ne fonctionne pas (validation d'un seul champ). J'ai donc créé mon propre crochet:
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
}
}
}
La détection d'un nœud avec des valeurs de duplicité en cours de création fonctionne. Comment puis-je empêcher l'enregistrement de ce nœud?
Comment puis-je empêcher l'enregistrement de ce nœud?
Si vous souhaitez empêcher que le nœud soit enregistré dans une méthode de pré-enregistrement ou un hook, vous devez lever une exception:
throw new \Exception(t('Fields are not unique!'));
Plus convivial serait de vérifier ceci dans le formulaire en premier et de donner à l'utilisateur une chance de corriger l'entrée avant de lever une exception.
Une double vérification de ceci dans la pré-sauvegarde est toujours une bonne idée pour s'assurer qu'aucun contenu de nœud incorrect n'est enregistré, quel que soit le formulaire, l'API Rest ou le code utilisé. Si quelqu'un dépasse le premier niveau de contrôles du formulaire, vous n'avez pas d'autre option que de lever une exception.
Éditer:
Dans le cas où une exception est levée, vous pouvez remplacer la réponse 500 par défaut par une gestion d'erreur personnalisée dans un abonné d'exception, voir Gérer l'exception de connexion à la base de données via un gestionnaire personnalisé
J'avais une exigence similaire et je voulais une solution plus agréable que de simplement lever une exception. Les éléments suivants semblaient bien fonctionner pour moi, dans ma hook_node_presave()
:
$response = new RedirectResponse(\Drupal::request()->getRequestUri());
$response->send();
drupal_set_message(t('This is my error message'), 'error', TRUE);
exit;
Ce n'est pas le bon crochet pour faire des validations. Utilisez hook_form_FORM_ID_alter () pour ajouter une fonction de validation.
$form['#validate'][] = 'my_custom_validate';
Puis dans votre fonction de validation personnalisée:
$term = $form_state->getValue('field_mytaxonomy');
// Your logic here.
$form_state->setErrorByName('field_mytaxonomy', t('Fields are not unique!'));