Клиент имеет простую и последовательную иерархическую таксономию.
Города на верхнем уровне и школы на втором уровне.
.
🔸Город 1
🔸 Школа №1
🔸Школа2
✨ Школа5
ââ Город2
✨Школа3
ââ Школа4
Пакет сущностей учетной записи пользователя содержит поле «Ссылка на сущность» для терминов таксономии учебного заведения.
Я пытаюсь применить ограничение, чтобы предотвратить создание или сохранение учетной записи пользователя, если выбранный термин находится на верхнем уровне иерархии (и, следовательно, в городе, а не в школе).
Вот пример кода, пропускающий внедрение зависимостей $this->entityTypeManager
для краткости.
TermParentConstraint.php
:
<?php
пространство имен Drupal\entity_validation_examples\Plugin\Validation\Constraint;
используйте Symfony\Component\Validator\Constraint;
/**
* Предотвратить создание учетной записи, если термин школьной таксономии не имеет родителя.
*
* @Ограничение(
* id = "Родительский термин",
* label = @Translation("Запретить создание учетной записи, если термин не имеет родителя", context = "Проверка"),
* тип = "сущность"
* )
*/
класс TermParentConstraint расширяет ограничение {
/**
* Сообщение отображается при попытке создать учетную запись, если у школы нет родительского города.
*
* @var строка
* Школьное сообщение.
*/
public $schoolMessage = 'Вы должны выбрать и город, и школу.';
}
TermParentConstraintValidator.php
:
<?php
пространство имен Drupal\entity_validation_examples\Plugin\Validation\Constraint;
используйте Drupal\user\Entity\User;
используйте Symfony\Component\Validator\Constraint;
используйте Symfony\Component\Validator\ConstraintValidator;
/**
* Проверяет ограничение TermParent.
*/
класс TermParentConstraintValidator расширяет ConstraintValidator {
/**
* {@inheritdoc}
*/
проверка публичной функции ($entity, ограничение $constraint) {
если (!isset($entity)) {
возвращаться;
}
если ($entity->getEntityTypeId() == 'пользователь') {
$school = $entity->get('field_select_a_school')->getValue();
// Термины таксономии школ-сирот должны быть городами, а не школами.
$parent = \Drupal::entityTypeManager()
->getStorage('taxonomy_term')
->loadParents($school[0]['target_id']);
если (пусто($родитель)) {
$this->context->addViolation($constraint->schoolMessage);
}
}
}
}
Ожидаемое поведение: Когда я создаю новую учетную запись пользователя и выбираю Город1
как значение Школа
, создание учетной записи должно завершиться ошибкой, и должно появиться сообщение об ошибке.
Фактическое поведение: Когда я создаю новую учетную запись пользователя и выбираю Город1
как значение Школа
, создание учетной записи завершается успешно, и сообщение об ошибке не отображается.
Журналы Drupal Watchdog содержат некоторые ошибки, но я не уверен, что они актуальны:
драш сс
--------- -------------- ------ ---------- ----------- --------------------------------------------- --------------------------------------------- --------------------------------------------- -----------------------------
ID Дата Тип Сообщение о серьезности
--------- -------------- ------ ---------- ----------- --------------------------------------------- --------------------------------------------- --------------------------------------------- -----------------------------
5298867 18 октября 22:57 Предупреждение php Предупреждение: недопустимый тип смещения в isset или пустой в Drupal\Core\Entity\EntityStorageBase->load() (строка 246 файла /app/docroot/core/lib/Drupal/Core/Entity/ EntityStorageBase.php) #0 /app/docroot/
5298866 18 октября 22:57 Уведомление о php Уведомление: преобразование массива в строку в Drupal\Core\Entity\EntityStorageBase->buildCacheId() (строка 126 файла /app/docroot/core/lib/Drupal/Core/Entity/EntityStorageBase.php ) #0 /приложение/docroot/ядро
5298865 18/окт 22:57 php Предупреждение Предупреждение: array_flip(): Может переворачивать только значения STRING и INTEGER! в Drupal\Core\Entity\EntityStorageBase->loadMultiple() (строка 261 файла /app/docroot/core/lib/Drupal/Core/Entity/EntityStorageB
5298864 18 октября 22:57 Уведомление о php Уведомление: iconv(): неправильный набор символов, преобразование из `HTML-ENTITIES' в `UTF-8' не разрешено в twig_convert_encoding() (строка 1009 из /app/vendor/twig/twig /src/Расширение/CoreExtension.php) #0
5298863 18 октября 22:57 Уведомление о php Уведомление: iconv(): неверный набор символов, преобразование из `HTML-ENTITIES' в `UTF-8' не разрешено в twig_convert_encoding() (строка 1009 файла /app/vendor/twig/twig /src/Расширение/CoreExtension.php) #0
5298862 18 октября 22:57 Уведомление о php Уведомление: iconv(): неверный набор символов, преобразование из `HTML-ENTITIES' в `UTF-8' не разрешено в twig_convert_encoding() (строка 1009 файла /app/vendor/twig/twig /src/Расширение/CoreExtension.php) #0
5298861 18 октября, 22:57 Уведомление о php Уведомление: iconv(): Неверный набор символов, преобразование из `HTML-ENTITIES' в `UTF-8' не разрешено в twig_convert_encoding() (строка 1009 файла /app/vendor/twig/twig /src/Расширение/CoreExtension.php) #0
5298860 18 октября 22:57 Уведомление о php Уведомление: iconv(): неверный набор символов, преобразование из `HTML-ENTITIES' в `UTF-8' не разрешено в twig_convert_encoding() (строка 1009 файла /app/vendor/twig/twig /src/Расширение/CoreExtension.php) #0
5298859 18 октября, 22:57 Уведомление о php Уведомление: iconv(): Неправильный набор символов, преобразование из `HTML-ENTITIES' в `UTF-8' не разрешено в twig_convert_encoding() (строка 1009 файла /app/vendor/twig/twig /src/Расширение/CoreExtension.php) #0
5298858 18 октября, 22:57 Уведомление о php Уведомление: iconv(): неправильный набор символов, преобразование из `HTML-ENTITIES' в `UTF-8' не разрешено в twig_convert_encoding() (строка 1009 файла /app/vendor/twig/twig /src/Расширение/CoreExtension.php) #0
--------- -------------- ------ ---------- ----------- --------------------------------------------- --------------------------------------------- --------------------------------------------- -----------------------------
я видел значокv()
ошибки после обновления этого проекта с Drupal 8 на Drupal 9, поэтому я не думаю, что они актуальны. Первые три сообщения об ошибках здесь могут быть связаны с проверкой ограничения, но они также являются довольно распространенными ошибками в этом проекте (и их отладка имеет гораздо более низкий приоритет, чем основные функции, которые должны появиться в ближайшее время).
Любые идеи? Я хоть на правильном пути?