Khách hàng có một phân loại phân cấp đơn giản và nhất quán.
Thành phố ở cấp cao nhất và Trường học ở cấp thứ hai.
.
âââ City1
â âââ Trường1
â âââ School2
â âââ School5
âââ City2
âââ Trường3
âââ Trường4
Gói thực thể tài khoản người dùng chứa trường Tham chiếu thực thể cho các điều khoản phân loại của Trường.
Tôi đang cố gắng thực thi một ràng buộc để ngăn việc tạo hoặc lưu tài khoản người dùng nếu thuật ngữ được chọn ở cấp cao nhất của hệ thống phân cấp (và do đó là Thành phố, không phải Trường học).
Đây là một số mã ví dụ, bỏ qua phần tiêm phụ thuộc của $this->entityTypeManager
cho ngắn gọn.
TermParentConstraint.php
:
<?php
không gian tên Drupal\entity_validation_examples\Plugin\Validation\Constraint;
sử dụng Symfony\Component\Validator\Constraint;
/**
* Ngăn chặn việc tạo tài khoản nếu Thuật ngữ phân loại trường học không có cha mẹ.
*
* @Hạn chế(
* id = "Thuật ngữ",
* label = @Translation("Ngăn tạo tài khoản nếu thuật ngữ không có cha", context = "Xác thực"),
* loại = "thực thể"
* )
*/
lớp TermParentConstraint mở rộng Ràng buộc {
/**
* Thông báo hiển thị khi cố gắng tạo tài khoản nếu Trường không có Thành phố gốc.
*
* chuỗi @var
* Thông điệp của trường.
*/
public $schoolMessage = 'Bạn phải chọn cả Thành phố và Trường học.';
}
TermParentConstraintValidator.php
:
<?php
không gian tên Drupal\entity_validation_examples\Plugin\Validation\Constraint;
sử dụng Drupal\user\Entity\User;
sử dụng Symfony\Component\Validator\Constraint;
sử dụng Symfony\Thành phần\Validator\ConstraintValidator;
/**
* Xác thực ràng buộc TermParent.
*/
lớp TermParentConstraintValidator mở rộng ConstraintValidator {
/**
* {@inheritdoc}
*/
xác thực chức năng công khai($entity, Constraint $constraint) {
if (!isset($entity)) {
trở lại;
}
if ($entity->getEntityTypeId() == 'người dùng') {
$school = $entity->get('field_select_a_school')->getValue();
// Thuật ngữ phân loại trường mồ côi phải là Thành phố, không phải Trường học.
$parent = \Drupal::entityTypeManager()
->getStorage('taxonomy_term')
->loadParents($school[0]['target_id']);
if (trống($parent)) {
$this->context->addViolation($constraint->schoolMessage);
}
}
}
}
hành vi dự kiến: Khi tôi tạo một tài khoản người dùng mới và chọn Thành phố1
như giá trị của Trường học
, việc tạo tài khoản sẽ không thành công và thông báo lỗi sẽ hiển thị.
Hành vi thực tế: Khi tôi tạo một tài khoản người dùng mới và chọn Thành phố1
như giá trị của Trường học
, tạo tài khoản thành công và không có thông báo lỗi nào được hiển thị.
Nhật ký Drupal Watchdog chứa một số lỗi, nhưng tôi không chắc chúng có liên quan hay không:
drush ws
--------- -------------- ------ ---------- ----------- --------------------------------------------- --------------------------------------------- --------------------------------------------- -----------------------------
ID Ngày Loại Mức độ nghiêm trọng Thông báo
--------- -------------- ------ ---------- ----------- --------------------------------------------- --------------------------------------------- --------------------------------------------- -----------------------------
5298867 18/Oct 22:57 php Cảnh báo Cảnh báo: Loại offset bất hợp pháp trong isset hoặc để trống trong Drupal\Core\Entity\EntityStorageBase->load() (dòng 246 của /app/docroot/core/lib/Drupal/Core/Entity/ EntityStorageBase.php) #0 /app/docroot/
5298866 18/Oct 22:57 php Thông báo Thông báo: Chuyển đổi mảng thành chuỗi trong Drupal\Core\Entity\EntityStorageBase->buildCacheId() (dòng 126 của /app/docroot/core/lib/Drupal/Core/Entity/EntityStorageBase.php ) #0 /ứng dụng/docroot/lõi
5298865 18/Oct 22:57 php Cảnh báo Cảnh báo: array_flip(): Chỉ có thể lật các giá trị CHUỖI và INTEGER! trong Drupal\Core\Entity\EntityStorageBase->loadMultiple() (dòng 261 của /app/docroot/core/lib/Drupal/Core/Entity/EntityStorageB
5298864 18/Oct 22:57 php Thông báo Thông báo: iconv(): Bộ ký tự sai, chuyển đổi từ `HTML-ENTITIES' sang `UTF-8' không được phép trong twig_convert_encoding() (dòng 1009 của /app/vendor/twig/twig /src/Extension/CoreExtension.php) #0
5298863 18/Oct 22:57 php Thông báo Thông báo: iconv(): Bộ ký tự sai, chuyển đổi từ `HTML-ENTITIES' sang `UTF-8' không được phép trong twig_convert_encoding() (dòng 1009 của /app/vendor/twig/twig /src/Extension/CoreExtension.php) #0
5298862 18/Oct 22:57 php Thông báo Thông báo: iconv(): Bộ ký tự sai, chuyển đổi từ `HTML-ENTITIES' thành `UTF-8' không được phép trong twig_convert_encoding() (dòng 1009 của /app/vendor/twig/twig /src/Extension/CoreExtension.php) #0
5298861 18/Oct 22:57 php Thông báo Thông báo: iconv(): Bộ ký tự sai, chuyển đổi từ `HTML-ENTITIES' sang `UTF-8' không được phép trong twig_convert_encoding() (dòng 1009 của /app/vendor/twig/twig /src/Extension/CoreExtension.php) #0
5298860 18/Oct 22:57 php Thông báo Thông báo: iconv(): Bộ ký tự sai, chuyển đổi từ `HTML-ENTITIES' sang `UTF-8' không được phép trong twig_convert_encoding() (dòng 1009 của /app/vendor/twig/twig /src/Extension/CoreExtension.php) #0
5298859 18/Oct 22:57 php Thông báo Thông báo: iconv(): Bộ ký tự sai, chuyển đổi từ `HTML-ENTITIES' sang `UTF-8' không được phép trong twig_convert_encoding() (dòng 1009 của /app/vendor/twig/twig /src/Extension/CoreExtension.php) #0
5298858 18/Oct 22:57 php Thông báo Thông báo: iconv(): Bộ ký tự sai, chuyển đổi từ `HTML-ENTITIES' sang `UTF-8' không được phép trong twig_convert_encoding() (dòng 1009 của /app/vendor/twig/twig /src/Extension/CoreExtension.php) #0
--------- -------------- ------ ---------- ----------- --------------------------------------------- --------------------------------------------- --------------------------------------------- -----------------------------
tôi đã nhìn thấy iconv()
lỗi kể từ khi nâng cấp dự án này từ Drupal 8 lên Drupal 9, vì vậy tôi không nghĩ chúng có liên quan. Ba thông báo lỗi hàng đầu ở đây có thể liên quan đến việc xác thực ràng buộc, nhưng chúng cũng là những lỗi khá phổ biến trong dự án này (và việc gỡ lỗi chúng có mức độ ưu tiên thấp hơn nhiều so với chức năng thiết yếu sắp ra mắt).
Bất kỳ ý tưởng? Ít nhất tôi có đang đi đúng hướng không?