Score:1

จะตรวจสอบฟิลด์ย่อหน้าได้อย่างไร

ธง sa

ฉันมีประเภทย่อหน้าที่มี 2 ฟิลด์: ปีและไตรมาส

ฉันมีประเภทเนื้อหาที่มีฟิลด์ย่อหน้า (field_year_and_quarter) กำหนดเป้าหมายเฉพาะย่อหน้าประเภทนี้

ฉันกำลังพยายามสร้างข้อจำกัดเพื่อไม่อนุญาตให้เข้ารหัสซ้ำ (ปี/ไตรมาสเดียวกัน)

ฉันเหนื่อย:

1-A ข้อ จำกัด ที่ระดับโหนดซึ่งวนซ้ำ field_year_and_quarter กับ $node->get('field_year_and_quarter')->referencedEntities() เพื่อตรวจสอบว่าซ้ำกันหรือไม่

=>สิ่งนี้ใช้งานไม่ได้เนื่องจากไม่ได้คำนึงถึงสิ่งที่เข้ารหัสในวิดเจ็ต แต่จะตรวจสอบเฉพาะเวอร์ชันที่บันทึกไว้ล่าสุดเท่านั้น

2-A ข้อ จำกัด ที่ระดับย่อหน้าซึ่งทำให้พาเรนต์สามารถวนซ้ำได้ field_year_and_quarter กับ $node_parent->get('field_year_and_quarter')->referencedEntities() เพื่อตรวจสอบว่าซ้ำกันหรือไม่ [ฉันแทนที่หนึ่งรายการด้วยย่อหน้าที่ระบุในพารามิเตอร์ ]

นี่คือรหัส:

  ตรวจสอบฟังก์ชั่นสาธารณะ ($certificate_p, ข้อ จำกัด $ ข้อ จำกัด ) {
    /* @var \Drupal\paragraphs\Entity\Paragraph $certificate_p */
    ถ้า ($certificate_p->bundle() == 'qoc') {
      $prod_company = $certificate_p->getParentEntity();
      $certificates = $prod_company->get('field_year_and_quarter')
        ->referencedEntities();
      $all_certificates = [];
      foreach ($certificates เป็น $certificate) {
        // ใช้ย่อหน้าที่ระบุในพารามิเตอร์ของฟังก์ชัน
        $certif_to_check = ($certificate_p->id() == $certificate->id()) ? $certificate_p : $ใบรับรอง;
        $year = $certif_to_check->get('field_qoc_year')->ค่า;
        $quarter = $certif_to_check->get('field_qoc_quarter')->ค่า;
        // ปี/ไตรมาสถูกเข้ารหัสแล้ว
        ถ้า (isset($all_certificates[$year][$quarter])) {
          $this->context->addViolation($constraint->duplicate_certif, [
            '%quarter' => surround_by_nbsp($ไตรมาส),
            '%year' => surround_by_nbsp($ปี),
          ]);
          หยุดพัก;
        }
        $all_certificates[$year][$quarter] = จริง;
      }
    }

=>สิ่งนี้ไม่ทำงานด้วยเหตุผลเดียวกัน

3- ข้อ จำกัด ที่ระดับฟิลด์... นี่คือรหัส:

  ตรวจสอบฟังก์ชั่นสาธารณะ ($ รายการ, ข้อ จำกัด $ ข้อ จำกัด ) {
    $certificates = $items->referencedEntities();
    $all_certificates = [];
    foreach ($certificates เป็น $certificate) {
      $year = $certificate->get('field_qoc_year')->value;
      $quarter = $certificate->get('field_qoc_quarter')->value;
      // ปี/ไตรมาสถูกเข้ารหัสแล้ว
      ถ้า (isset($all_certificates[$year][$quarter])) {
        $this->context->addViolation($constraint->duplicate_certif, [
          '%quarter' => surround_by_nbsp($ไตรมาส),
          '%year' => surround_by_nbsp($ปี),
        ]);
        หยุดพัก;
      }
      $all_certificates[$year][$quarter] = จริง;
    }
  }

=>ไม่ทำงานด้วยเหตุผลเดียวกัน

ฉันควรทำอย่างไรดี? (ฉันพยายามตรวจสอบในรูปแบบโดยไม่มีโชค)

4uk4 avatar
cn flag
ไม่มีปัญหาในการตรวจสอบหลายย่อหน้าในข้อจำกัด โปรดดู https://drupal.stackexchange.com/questions/278067/adding-constraint-to-paragraph-field สิ่งนี้สามารถเชื่อมโยงกับปัญหา IEF จากคำถามสุดท้ายได้หรือไม่ เหตุใดตัวแปรจึงเป็นคอร์ EntityReferenceFieldItemList ไม่ใช่ฟิลด์ [ERR](https://www.drupal.org/project/entity_reference_revisions)
Baud avatar
sa flag
1- ฉันได้แก้ไขคำถามเพื่อลบการอ้างอิงที่ไม่ถูกต้อง 2-ฉันได้ลบ IEF แล้ว 3-ตัวอย่างที่คุณให้มาจะใช้ได้เพราะไม่ได้ตรวจสอบค่าภายใน... นี่เป็นข้อจำกัดที่ระดับฟิลด์ (เช่นตัวอย่างที่ 3 ของฉัน) แต่ในกรณีของฉัน มันบอกว่าฉันมีสำเนาซ้ำแม้ว่าฉันจะแก้ไข แบบฟอร์มเพื่อลบออก (หรือตรงข้าม)
miststudent2011 avatar
fr flag
https://drupal.stackexchange.com/questions/294733/adding-constraint-to-entity-referenced-paragraph-fieldที่เกี่ยวข้อง
Score:1
ธง cn

ตกลง เมื่อพิจารณาการใช้งาน ERR ของ $items->referencedEntities() และ $item->entity ดูเหมือนว่าฟังก์ชันแรกจะสามารถจัดการกับเอนทิตีใหม่ได้ แต่คุณสมบัติฟิลด์ที่คำนวณที่สองเท่านั้นที่สามารถจัดการกับเอนทิตีที่ไม่ได้บันทึกได้

ดังนั้นลองวนซ้ำ $items แล้วรับย่อหน้าจากรายการฟิลด์ singe:

foreach ($ รายการเป็น $ รายการ) {
  $paragaph = $item->entity;
  $value = $paragraph->field_foo->value;
  // ...
}
Baud avatar
sa flag
คุณช่วยชีวิตฉันไว้!!!! ขอบคุณมาก!
4uk4 avatar
cn flag
หาทางที่ดี! ไม่ทราบว่าสิ่งนี้สร้างความแตกต่าง ฉันเชื่อมโยงข้ามกับตัวอย่างที่เชื่อมโยง

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา