Mulțumim lui @Alireza Tabatabaeian pentru asta. Pur și simplu postez codul pe care l-am folosit pe baza acelui răspuns.
La taxonomia căreia am vrut să aplic constrângerea, am adăugat a field_term_ref_author referire la entitate la utilizator.
mymodule.php
funcția MYMOUDLE_taxonomy_term_presave(TermInterface $term) {
$vocabular = $term->bundle();
comutator ($vocabular) {
caz „my_vocab_type”:
dacă ($term->isNew()) {
// Setați autorul (prin câmpul personalizat).
$current_user = \Drupal::currentUser()->id();
$term->set('field_term_ref_author', $current_user);
}
pauză;
funcția MYMODULE_entity_base_field_info_alter(&$fields, $entity_type) {
if ($entity_type->id() === 'termen_taxonomie') {
if (isset($fields['nume'])) {
$fields['nume']->addConstraint('TermNameUniquePerUser');
}
}
}
mymodule/src/Plugin/Validation/Constraint/TermNameUniquePerUser.php
<?php
spațiu de nume Drupal\MYMODULE\Plugin\Validation\Constraint;
utilizați Symfony\Component\Validator\Constraint;
clasa TermNameUniquePerUser extinde Constraint {
public $notUnique = 'Ați creat deja un termen numit %value.';
}
mymodule/src/Plugin/Validation/Constraint/TermNameUniquePerUserValidator.php
<?php
spațiu de nume Drupal\MYMODULE\Plugin\Validation\Constraint;
utilizați Symfony\Component\Validator\Constraint;
utilizați Symfony\Component\Validator\ConstraintValidator;
clasa TermNameUniquePerUserValidator extinde ConstraintValidator {
validare funcție publică($articole, Constrângere $constrângere) {
foreach ($articole ca $item) {
dacă (!$acest->este Unic($articol->valoare)) {
$this->context->addViolation($constraint->notUnique, ['%value' => $item->value]);
}
}
}
funcția privată esteUnică($valoare) {
$uid = \Drupal::currentUser()->id();
$term_name_query = \Drupal::entityQuery('taxonomy_term')
->condition('nume', $valoare, '=')
->condition('field_term_ref_author', $uid);
return !($term_name_query->execute());
}
}
Lucrul bun despre scrierea interogării de entitate în acest fel este că, dacă vocabularul de taxonomie nu are a field_term_ref_author
câmp, nu vor exista niciodată rezultate, așa că constrângerea se va evalua corect cu termeni care sunt în pachete care nu sunt supuși constrângerii (deși acest lucru va duce la o interogare irosită a bazei de date.)