Điểm:1

Làm cách nào để xác thực trường đoạn văn?

lá cờ sa

Tôi có một loại đoạn văn với 2 trường: năm và quý

Tôi có một loại nội dung với trường đoạn văn (trường_năm_và_quý) CHỈ nhắm mục tiêu loại đoạn này

Tôi đang cố gắng tạo một ràng buộc để không cho phép mã hóa một bản sao (cùng năm/quý)

Tôi đã thử:

1-Một ràng buộc ở cấp độ nút đang lặp vào trường_năm_và_quý với $node->get('field_year_and_ quarter')->referencedEntities() để kiểm tra nếu có trùng lặp

=> Điều này không hoạt động vì nó không tính đến những gì được mã hóa trong tiện ích, chỉ kiểm tra phiên bản đã lưu cuối cùng

2-Một ràng buộc ở cấp độ đoạn văn đang khiến Phụ huynh của nó có thể lặp vào trường_năm_và_quý với $node_parent->get('field_year_and_ quarter')->referencedEntities() để kiểm tra xem có trùng lặp nào không [Tôi thay thế một mục bằng đoạn được cung cấp trong tham số]

Đây là mã:

  xác thực hàm công khai($certificate_p, Constraint $constraint) {
    /* @var \Drupal\paragraphs\Entity\Paragraph $certificate_p */
    if ($certificate_p->bundle() == 'qoc') {
      $prod_company = $certificate_p->getParentEntity();
      $certificates = $prod_company->get('field_year_and_ quarter')
        ->tham chiếuEntities();
      $all_certificates = [];
      foreach ($chứng chỉ dưới dạng $certificate) {
        // sử dụng đoạn được cung cấp trong tham số chức năng
        $certif_to_check = ($certificate_p->id() == $certificate->id()) ? $certificate_p : $certificate;
        $year = $certif_to_check->get('field_qoc_year')->giá trị;
        $ quarter = $certif_to_check->get('field_qoc_ quarter')->giá trị;
        // Năm/Quý đã được mã hóa
        if (isset($all_certificates[$year][$quý])) {
          $this->context->addViolation($constraint->duplicate_certif, [
            '% quarter' => surround_by_nbsp($ quarter),
            '%year' => surround_by_nbsp($year),
          ]);
          nghỉ;
        }
        $all_certificates[$year][$quý] = TRUE;
      }
    }

=> Điều này không hoạt động vì lý do tương tự

3- Một ràng buộc ở cấp độ trường... đây là mã:

  chức năng công khai xác thực($items, Constraint $constraint) {
    $certificates = $items->referencedEntities();
    $all_certificates = [];
    foreach ($chứng chỉ dưới dạng $certificate) {
      $year = $certificate->get('field_qoc_year')->value;
      $ quarter = $certificate->get('field_qoc_ quarter')->value;
      // Năm/Quý đã được mã hóa
      if (isset($all_certificates[$year][$quý])) {
        $this->context->addViolation($constraint->duplicate_certif, [
          '% quarter' => surround_by_nbsp($ quarter),
          '%year' => surround_by_nbsp($year),
        ]);
        nghỉ;
      }
      $all_certificates[$year][$quý] = TRUE;
    }
  }

=> Không hoạt động vì lý do tương tự

Tôi nên làm gì? (Tôi cũng đã thử xác thực trong biểu mẫu mà không gặp may)

4uk4 avatar
lá cờ cn
Không có vấn đề gì khi xác thực nhiều đoạn trong một ràng buộc, xem https://drupal.stackexchange.com/questions/278067/adding-constraint-to-paragraph-field. Điều này có thể liên quan đến vấn đề IEF từ câu hỏi cuối cùng không? Ngoài ra, tại sao biến lại là một trường EntityReferenceFieldItemList cốt lõi chứ không phải trường [ERR](https://www.drupal.org/project/entity_reference_revisions)?
Baud avatar
lá cờ sa
1-Tôi đã chỉnh sửa câu hỏi để xóa tham chiếu sai. 2-Tôi đã xóa IEF. 3-Ví dụ bạn đưa ra sẽ hoạt động vì nó không kiểm tra các giá trị bên trong... Đây là một ràng buộc ở cấp độ trường (như ví dụ 3 của tôi), nhưng trong trường hợp của tôi, nó cứ báo tôi có một bản sao ngay cả khi tôi chỉnh sửa biểu mẫu để xóa nó (hoặc ngược lại)
miststudent2011 avatar
lá cờ fr
Liên quan https://drupal.stackexchange.com/questions/294733/adding-constraint-to-entity-referenced-paragraph-field
Điểm:1
lá cờ cn

Được rồi, khi xem xét các triển khai ERR của $items->referencedEntities() và $item->entity, có vẻ như hàm đầu tiên có thể xử lý các thực thể mới nhưng chỉ thuộc tính trường được tính toán thứ hai mới có thể xử lý các thực thể chưa được lưu.

Vì vậy, hãy thử lặp lại $items và sau đó lấy đoạn văn từ mục trường duy nhất:

foreach ($items as $item) {
  $paragaph = $item->entity;
  $value = $paragraph->field_foo->value;
  //...
}
Baud avatar
lá cờ sa
bạn đã cứu ngày của tôi !!!! Cảm ơn nhiều!
4uk4 avatar
lá cờ cn
Nhân tiện, tìm thấy tuyệt vời! Không biết điều này làm cho một sự khác biệt. Tôi liên kết chéo nó với ví dụ được liên kết.

Đă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.