Score:1

ConstraintValidator ล้มเหลวในการตรวจสอบข้อจำกัดในฟิลด์อ้างอิง Taxonomy Term

ธง nr

ลูกค้ามีอนุกรมวิธานแบบลำดับชั้นที่เรียบง่ายและสอดคล้องกัน

เมืองในระดับสูงสุดและโรงเรียนในระดับที่สอง

.
âââ เมือง1
â âââ โรงเรียน1
â âââ โรงเรียน2
â âââ โรงเรียน5
âââ เมือง2
    âââ โรงเรียน3
    âââ โรงเรียน4

กลุ่มเอนทิตีของบัญชีผู้ใช้มีฟิลด์การอ้างอิงเอนทิตีสำหรับเงื่อนไขการจัดหมวดหมู่ของโรงเรียน

ฉันกำลังพยายามบังคับใช้ข้อจำกัดเพื่อป้องกันการสร้างหรือบันทึกบัญชีผู้ใช้ หากคำศัพท์ที่เลือกอยู่ในระดับบนสุดของลำดับชั้น (และด้วยเหตุนี้เมือง ไม่ใช่โรงเรียน)

นี่คือตัวอย่างโค้ดบางส่วน ข้ามการพึ่งพาการฉีดของ $this->entityTypeManager เพื่อความกระชับ

TermParentConstraint.php:

<?php

เนมสเปซ Drupal\entity_validation_examples\Plugin\Validation\Constraint;

ใช้ Symfony\Component\Validator\Constraint;

/**
 * ป้องกันการสร้างบัญชีหากคำอนุกรมวิธานของโรงเรียนไม่มีพาเรนต์
 *
 * @ข้อ จำกัด (
 * id = "TermParent",
 * label = @Translation("ป้องกันการสร้างบัญชีหากคำไม่มีพาเรนต์", บริบท = "การตรวจสอบความถูกต้อง"),
 * ประเภท = "นิติบุคคล"
 * )
 */
คลาส 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}
   */
  ตรวจสอบฟังก์ชั่นสาธารณะ ($ เอนทิตี, ข้อ จำกัด $ ข้อ จำกัด ) {
    ถ้า (!isset($entity)) {
      กลับ;
    }

    ถ้า ($entity->getEntityTypeId() == 'ผู้ใช้') {

      $school = $entity->get('field_select_a_school')->getValue();

      // เงื่อนไขอนุกรมวิธานโรงเรียนกำพร้าต้องเป็นเมืองไม่ใช่โรงเรียน
      $parent = \Drupal::entityTypeManager()
        ->getStorage('taxonomy_term')
        ->loadParents($school[0]['target_id']);
      ถ้า (ว่าง ($ parent)) {
        $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 /app/docroot/core  
  5298865 18/Oct 22:57 php Warning คำเตือน: 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/Extension/CoreExtension.php) #0  
  5298863 18/ต.ค. 22:57 ประกาศเกี่ยวกับ php: iconv(): ชุดอักขระผิด การแปลงจาก `HTML-ENTITIES' เป็น `UTF-8' ไม่ได้รับอนุญาตใน twig_convert_encoding() (บรรทัดที่ 1009 ของ /app/vendor/twig/twig /src/Extension/CoreExtension.php) #0  
  5298862 18/ต.ค. 22:57 ประกาศเกี่ยวกับ php: iconv(): ชุดอักขระผิด การแปลงจาก `HTML-ENTITIES' เป็น `UTF-8' ไม่ได้รับอนุญาตใน twig_convert_encoding() (บรรทัดที่ 1009 ของ /app/vendor/twig/twig /src/Extension/CoreExtension.php) #0  
  5298861 18/ต.ค. 22:57 น. ประกาศเกี่ยวกับ php: iconv(): ชุดอักขระผิด ไม่อนุญาตให้แปลงจาก `HTML-ENTITIES' เป็น `UTF-8' ใน twig_convert_encoding() (บรรทัดที่ 1009 ของ /app/vendor/twig/twig /src/Extension/CoreExtension.php) #0  
  5298860 18 ต.ค. 22:57 ประกาศเกี่ยวกับ php: iconv(): ชุดอักขระผิด การแปลงจาก `HTML-ENTITIES' เป็น `UTF-8' ไม่ได้รับอนุญาตใน twig_convert_encoding() (บรรทัดที่ 1009 ของ /app/vendor/twig/twig /src/Extension/CoreExtension.php) #0  
  5298859 18 ต.ค. 22:57 ประกาศเกี่ยวกับ php: iconv(): ชุดอักขระผิด การแปลงจาก `HTML-ENTITIES' เป็น `UTF-8' ไม่ได้รับอนุญาตใน twig_convert_encoding() (บรรทัดที่ 1009 ของ /app/vendor/twig/twig /src/Extension/CoreExtension.php) #0  
  5298858 18 ต.ค. 22:57 ประกาศเกี่ยวกับ php: iconv(): ชุดอักขระผิด การแปลงจาก `HTML-ENTITIES' เป็น `UTF-8' ไม่ได้รับอนุญาตใน twig_convert_encoding() (บรรทัดที่ 1009 ของ /app/vendor/twig/twig /src/Extension/CoreExtension.php) #0  
 --------- -------------- ------ ---------- ----------- --------------------------------------------- --------------------------------------------- --------------------------------------------- ----------------------------- 

ฉันได้เห็น ไอคอน () เกิดข้อผิดพลาดตั้งแต่อัปเกรดโปรเจกต์นี้จาก Drupal 8 เป็น Drupal 9 ดังนั้นฉันจึงไม่คิดว่ามันเกี่ยวข้องกัน ข้อความแสดงข้อผิดพลาด 3 อันดับแรกที่นี่อาจเกี่ยวข้องกับการตรวจสอบข้อจำกัด แต่ก็เป็นข้อผิดพลาดทั่วไปในโครงการนี้เช่นกัน (และการดีบักข้อความเหล่านี้มีความสำคัญต่ำกว่าฟังก์ชันการทำงานที่จำเป็นซึ่งจะครบกำหนดในเร็วๆ นี้)

ความคิดใด ๆ ? อย่างน้อยฉันก็มาถูกทางแล้ว?

Score:1
ธง ph

เดอะ loadParents() การเรียกเมธอด โหลดหลายรายการ ()และนั่นคือจุดที่ array_flip() เกิดข้อผิดพลาด:

คำเตือน: array_flip(): สามารถพลิกค่า STRING และ INTEGER ได้เท่านั้น! ใน Drupal\Core\Entity\EntityStorageBase->loadMultiple() (บรรทัดที่ 261 ของ /app/docroot/core/lib/Drupal/Core/Entity/EntityStorageB

น่าจะมีอะไรเกิดขึ้นที่นั่น

เดอะ loadParents() วิธีการจะแตกต่างกันไปตามเวอร์ชัน Drupal ของคุณ

hotwebmatter avatar
nr flag
ขอบคุณสำหรับทิป! นี่คือ `drush status` บางส่วน: เวอร์ชัน Drupal: `9.2.7` ฐานข้อมูล: `Connected` Drupal bootstrap: `Successful` ธีมเริ่มต้น: `projectname` ธีมผู้ดูแลระบบ: `projectname_admin` Drush version: `10.6.0` โปรไฟล์การติดตั้ง: ` รูทมาตรฐานของ Drupal: `/app/docroot`
Score:1
ธง cn

ปัญหาคือคุณกำลังโหลดพาเรนต์ในอาร์เรย์แล้วตรวจสอบค่าว่าง เงื่อนไขที่ระดับบนสุดสามารถมีพาเรนต์หลัก (ID=0) ดังนั้น นี่จะเป็นรายการในอาร์เรย์เช่นกัน แม้ว่าจะไม่ได้ชี้ไปที่เทอมที่มีอยู่ก็ตาม

คุณสามารถลองลดความซับซ้อนของโค้ดได้ เนื่องจาก D8.6 คุณไม่จำเป็นต้องใช้ที่เก็บคำศัพท์อีกต่อไปเพื่อจัดการฟิลด์พาเรนต์ ว่าง () บน ID เป้าหมายที่จับได้ โมฆะ สำหรับช่องว่างและ 0 สำหรับพาเรนต์หลัก

 ตรวจสอบฟังก์ชั่นสาธารณะ ($ เอนทิตี, ข้อ จำกัด $ ข้อ จำกัด ) {
    ถ้า (!isset($entity)) {
      กลับ;
    }

    ถ้า ($entity->getEntityTypeId() == 'ผู้ใช้') {
      $term = $entity->get('field_select_a_school')->เอนทิตี;
      ถ้า ($ คำ) {
        ถ้า (ว่าง ($term->parent->target_id)) {
          $this->context->addViolation($constraint->schoolMessage);
        }
      }
    }

  }
Score:0
ธง nr

ในกรณีนี้ วิธีที่เร็วที่สุดคือการกำหนดค่า เลือกลำดับชั้นอย่างง่าย วิดเจ็ตอย่างถูกต้อง (โมดูล SHS ได้รับการติดตั้งแล้ว ดังนั้นฉันอาจใช้มันได้เช่นกัน!)

สำหรับเร็กคอร์ด นี่คือการกำหนดค่าวิดเจ็ตที่มีปัญหา

ก่อน:

ยกเลิกการเลือกช่องทำเครื่องหมาย "บังคับให้เลือกระดับที่ลึกที่สุด"

หลังจาก:

เลือกช่องทำเครื่องหมาย "บังคับให้เลือกระดับที่ลึกที่สุด"

ขอบคุณสำหรับคำตอบทุกคน! ฉันได้เรียนรู้มาบ้างเล็กน้อยเกี่ยวกับการตรวจสอบความถูกต้องของข้อจำกัดและอนุกรมวิธานลำดับชั้น ซึ่งจะช่วยฉันในครั้งต่อไปที่ฉันต้องจัดการกับต้นไม้อนุกรมวิธานหรือใช้ ConstraintValidator ระดับ.

โพสต์คำตอบ

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