Điểm:1

ConstraintValidator không xác thực ràng buộc trên trường tham chiếu Thuật ngữ phân loại

lá cờ nr

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?

Điểm:1
lá cờ ph

Các tảiParents() gọi phương thức tảiMultiple(), và đó là nơi mảng_flip() lỗi đang xảy ra:

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

Vì vậy, rất có thể một cái gì đó đang xảy ra ở đó.

Các tảiParents() phương pháp khác nhau tùy thuộc vào phiên bản Drupal của bạn.

hotwebmatter avatar
lá cờ nr
Cảm ơn vì tiền hỗ trợ! Đây là một phần `trạng thái drush`: Phiên bản Drupal: `9.2.7` Cơ sở dữ liệu: `Đã kết nối` Drupal bootstrap: `Successful` Chủ đề mặc định: `projectname` Chủ đề quản trị: `projectname_admin` Phiên bản Drush: `10.6.0` Hồ sơ cài đặt: ` tiêu chuẩn` Gốc Drupal: `/app/docroot`
Điểm:1
lá cờ cn

Vấn đề là bạn đang tải cha mẹ trong một mảng và sau đó kiểm tra giá trị trống. Các thuật ngữ ở cấp cao nhất có thể có gốc gốc (ID=0), vì vậy đây cũng sẽ là một mục trong mảng, ngay cả khi không trỏ đến một thuật ngữ hiện có.

Bạn có thể cố gắng đơn giản hóa mã, kể từ D8.6, bạn không cần sử dụng thuật ngữ lưu trữ nữa để xử lý trường cha. trống () trên các lần bắt ID mục tiêu VÔ GIÁ TRỊ cho một trường trống và 0 cho cha mẹ gốc.

 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') {
      $term = $entity->get('field_select_a_school')->entity;
      nếu ($thuật ngữ) {
        if (trống($term->parent->target_id)) {
          $this->context->addViolation($constraint->schoolMessage);
        }
      }
    }

  }
Điểm:0
lá cờ nr

Trong trường hợp này, hóa ra giải pháp nhanh nhất là cấu hình Chọn theo thứ bậc đơn giản tiện ích một cách chính xác. (Mô-đun SHS đã được cài đặt, vì vậy tôi cũng có thể sử dụng nó!)

Đối với bản ghi, đây là cấu hình widget có vấn đề.

TRƯỚC:

Bỏ chọn hộp kiểm có nhãn "Buộc chọn cấp độ sâu nhất"

SAU ĐÓ:

Đã chọn hộp kiểm có nhãn "Buộc chọn cấp độ sâu nhất"

Cảm ơn tất cả các câu trả lời, tất cả mọi người! Tôi đã học được khá nhiều về xác thực ràng buộc và phân loại phân cấp, điều này sẽ giúp ích cho tôi trong lần tiếp theo khi tôi phải xử lý cây phân loại hoặc triển khai một Hạn chếValidator lớp.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.