Clientul are o taxonomie ierarhică simplă și consistentă.
Orașe la nivelul superior și școli la nivelul doi.
.
âââ Oraş1
â  âââ Scoala1
â  âââ Scoala2
â  âââ Scoala5
âââ Oraş2
âââ Scoala3
âââ Scoala4
Pachetul de entitate cont de utilizator conține un câmp Referință de entitate la termenii taxonomiei școlii.
Încerc să impun o constrângere pentru a împiedica crearea sau salvarea unui cont de utilizator dacă termenul selectat se află la nivelul superior al ierarhiei (și, prin urmare, un oraș, nu o școală).
Iată un exemplu de cod, omitând injecția de dependență a $this->entityTypeManager
pentru concizie.
TermParentConstraint.php
:
<?php
spațiu de nume Drupal\entity_validation_examples\Plugin\Validation\Constraint;
utilizați Symfony\Component\Validator\Constraint;
/**
* Preveniți crearea contului dacă termenul de taxonomie școlară nu are părinte.
*
* @Constraint(
* id = „TermParent”,
* label = @Translation ("Preveniți crearea contului dacă termenul nu are părinte", context = "Validare"),
* tip = „entitate”
* )
*/
clasa TermParentConstraint extinde Constraint {
/**
* Mesaj afișat când se încearcă crearea unui cont dacă școala nu are oraș părinte.
*
* @var șir
* Mesajul școlii.
*/
public $schoolMessage = 'Trebuie să selectați atât un oraș, cât și o școală.';
}
TermParentConstraintValidator.php
:
<?php
spațiu de nume Drupal\entity_validation_examples\Plugin\Validation\Constraint;
utilizați Drupal\utilizator\Entitate\Utilizator;
utilizați Symfony\Component\Validator\Constraint;
utilizați Symfony\Component\Validator\ConstraintValidator;
/**
* Validează constrângerea TermParent.
*/
clasa TermParentConstraintValidator extinde ConstraintValidator {
/**
* {@inheritdoc}
*/
validare funcție publică($entitate, Constrângere $constrângere) {
dacă (!isset($entitate)) {
întoarcere;
}
if ($entity->getEntityTypeId() == 'utilizator') {
$school = $entity->get('field_select_a_school')->getValue();
// Termenii taxonomiei școlilor orfane trebuie să fie orașe, nu școli.
$parent = \Drupal::entityTypeManager()
->getStorage('termen_taxonomie')
->loadParents($school[0]['target_id']);
dacă (gol ($părinte)) {
$this->context->addViolation($constraint->schoolMessage);
}
}
}
}
Comportament asteptat: Când creez un nou cont de utilizator și selectez Orașul 1
ca valoare a Şcoală
, crearea contului ar trebui să eșueze și ar trebui să fie afișat un mesaj de eroare.
Comportament real: Când creez un nou cont de utilizator și selectez Orașul 1
ca valoare a Şcoală
, crearea contului reușește și nu este afișat niciun mesaj de eroare.
Jurnalele Drupal Watchdog conțin unele erori, dar nu sunt sigur că sunt relevante:
drush ws
--------- -------------- ------ ---------- ----------- --------------------------------------------- --------------------------------------------- --------------------------------------------- ------------------------------
ID Data Tip Severitate Mesaj
--------- -------------- ------ ---------- ----------- --------------------------------------------- --------------------------------------------- --------------------------------------------- ------------------------------
5298867 18/Oct 22:57 php Avertisment Avertisment: Tip offset ilegal în isset sau gol în Drupal\Core\Entity\EntityStorageBase->load() (linia 246 din /app/docroot/core/lib/Drupal/Core/Entity/ EntityStorageBase.php) #0 /app/docroot/
5298866 18/Oct 22:57 php Notice Notificare: Conversie matrice în șir în Drupal\Core\Entity\EntityStorageBase->buildCacheId() (linia 126 din /app/docroot/core/lib/Drupal/Core/Entity/Base.phpStorage ) #0 /app/docroot/core
5298865 18/Oct 22:57 php Avertisment Avertisment: array_flip(): Poate răsturna numai valorile STRING și INTEGER! în Drupal\Core\Entity\EntityStorageBase->loadMultiple() (linia 261 din /app/docroot/core/lib/Drupal/Core/Entity/EntityStorageB
5298864 18/Oct 22:57 php Notice Notice: iconv(): set de caractere greșit, conversia din „HTML-ENTITIES” în „UTF-8” nu este permisă în twig_convert_encoding() (linia 1009 din /app/vendor/twig/twig) /src/Extension/CoreExtension.php) #0
5298863 18/Oct 22:57 php Notice Notice: iconv(): set de caractere greșit, conversia din „HTML-ENTITIES” în „UTF-8” nu este permisă în twig_convert_encoding() (linia 1009 din /app/vendor/twig/twig) /src/Extension/CoreExtension.php) #0
5298862 18/Oct 22:57 php Notice Notice: iconv(): set de caractere greșit, conversia din „HTML-ENTITIES” în „UTF-8” nu este permisă în twig_convert_encoding() (linia 1009 din /app/vendor/twig/twig /src/Extension/CoreExtension.php) #0
5298861 18/Oct 22:57 php Notice Notice: iconv(): set de caractere greșit, conversia din „HTML-ENTITIES” în „UTF-8” nu este permisă în twig_convert_encoding() (linia 1009 din /app/vendor/twig/twig /src/Extension/CoreExtension.php) #0
5298860 18/Oct 22:57 php Notice Notice: iconv(): set de caractere greșit, conversia din „HTML-ENTITIES” în „UTF-8” nu este permisă în twig_convert_encoding() (linia 1009 din /app/vendor/twig/twig) /src/Extension/CoreExtension.php) #0
5298859 18/Oct 22:57 php Notice Notice: iconv(): set de caractere greșit, conversia din „HTML-ENTITIES” în „UTF-8” nu este permisă în twig_convert_encoding() (linia 1009 din /app/vendor/twig/twig /src/Extension/CoreExtension.php) #0
5298858 18/Oct 22:57 php Notice Notice: iconv(): set de caractere greșit, conversia din „HTML-ENTITIES” în „UTF-8” nu este permisă în twig_convert_encoding() (linia 1009 din /app/vendor/twig/twig /src/Extension/CoreExtension.php) #0
--------- -------------- ------ ---------- ----------- --------------------------------------------- --------------------------------------------- --------------------------------------------- ------------------------------
L-am văzut pe iconv()
erori de la actualizarea acestui proiect de la Drupal 8 la Drupal 9, deci nu cred că sunt relevante. Cele mai importante trei mesaje de eroare de aici pot fi legate de validarea constrângerii, dar sunt și erori destul de comune în acest proiect (și depanarea lor este o prioritate mult mai mică decât funcționalitatea esențială care se va datora foarte curând).
Vreo idee? Sunt măcar pe drumul cel bun?