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;
/**
* Verifică dacă valoarea trimisă este unică pentru utilizator.
*
* @Constraint(
* id = "TermNameUniquePerUser",
* label = @Translation ("Nume termen unic per utilizator", context = "Validare"),
* tip = „șir”
* )
*/
clasa TermNameUniquePerUser extinde Constraint {
// Mesajul care va fi afișat dacă valoarea nu este unică.
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;
/**
* Validează constrângerea TermNameUniquePerUser.
*/
clasa TermNameUniquePerUserValidator extinde ConstraintValidator {
/**
* {@inheritdoc}
*/
validare funcție publică($articole, Constrângere $constrângere) {
foreach ($articole ca $item) {
// Apoi verificați dacă valoarea este unică.
dacă (!$acest->este Unic($articol->valoare)) {
$this->context->addViolation($constraint->notUnique, ['%value' => $item->value]);
}
}
}
/**
* Este unic?
*
* @param șir $valoare
*/
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);
// Dacă interogarea are rezultate, atunci nu este unică.
// Așa că ar trebui să returnăm opusul dacă există rezultate.
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.)