Score:0

วิธีใช้ hook_block_access() กับบล็อกแบบกำหนดเองที่สร้างใน UI

ธง gb

ฉันมีบล็อกแบบกำหนดเองที่สร้างโดยใช้ไลบรารีบล็อกแบบกำหนดเองของ Drupal 9 ฉันต้องการใช้ hook_block_access() เพื่อควบคุมการเข้าถึง แต่เนื่องจากเป็นบล็อกแบบกำหนดเอง จึงไม่มีชื่อเครื่องบล็อก ID เดียวที่ฉันสามารถหาได้ (โดยใช้ตัวแปร Devel) คือ:

วัตถุ stdClass ( [ระดับ] => Drupal\block_content\Entity\BlockContent [ธีม:ป้องกัน] => [values:protected] => อาร์เรย์
( [id] => อาร์เรย์ ( [x-ค่าเริ่มต้น] => 4 )

        [revision_id] => อาร์เรย์
            (
                [x-ค่าเริ่มต้น] => 4
            )

        [ประเภท] => อาร์เรย์
            (
                [x-default] => พื้นฐาน
            )

        [uuid] => อาร์เรย์
            (
                [x-ค่าเริ่มต้น] => f0c17429-584a-4221-995c-c00f4c41c714
            )

        [langcode] => อาร์เรย์
            (
                [x-default] => th
            )

        [revision_user] => อาร์เรย์
            (
                [x-default] => 
            )

        [revision_created] => อาร์เรย์
            (
                [x-default] => 1632243859
            )

        [revision_log] => อาร์เรย์
            (
                [x-default] => 
            )

        [revision_default] => อาร์เรย์
            (
                [x-default] => 1
            )

        [isDefaultRevision] => อาร์เรย์
            (
                [x-default] => 1
            )

        [สถานะ] => อาร์เรย์
            (
                [x-default] => 1
            )

        [ข้อมูล] => อาร์เรย์
            (
                [x-default] => เพิ่มเนื้อหา
            )

        [เปลี่ยน] => อาร์เรย์
            (
                [x-default] => 1632261438
            )

        [default_langcode] => อาร์เรย์
            (
                [x-default] => 1
            )

        [revision_translation_affected] => อาร์เรย์
            (
                [x-default] => 1
            )

        [ใช้ซ้ำได้] => อาร์เรย์
            (
                [x-default] => 1
            )

        [body] => อาร์เรย์
            (
                [x-default] => อาร์เรย์
                    (
                        [0] => อาร์เรย์
                            (
                                [มูลค่า] => 

ฯลฯ...

ฉันไปที่การแก้ไขบล็อกโดยไปที่: http://mysite.com/block/4

ฉันจะใช้ได้อย่างไร hook_block_access (บล็อก $block, $operation, AccountInterface $account) เพื่อควบคุมการเข้าถึงบล็อคนี้? ฉันจะระบุบล็อคนี้ได้อย่างไรใน $บล็อก ตัวแปร?

Score:2
ธง cn

หลังจากที่คุณสร้างบล็อกแบบกำหนดเองใน UI แล้ว คุณสามารถวางบล็อกนั้นในภูมิภาคต่างๆ ได้ แต่ละอินสแตนซ์เหล่านี้ได้รับชื่อเครื่องและ hook_block_access() ทำงานได้ตามที่ตั้งใจไว้

หากคุณต้องการควบคุมการเข้าถึงในระดับเอนทิตีเนื้อหา สิ่งนี้สมเหตุสมผลเพราะคุณสามารถใช้บล็อกเนื้อหาได้ไม่เฉพาะในรูปแบบบล็อกเท่านั้น แต่ยังใช้เบ็ดการเข้าถึงสำหรับประเภทเอนทิตี block_content:

ใช้ Drupal\Core\Access\AccessResult;
ใช้ Drupal\Core\Entity\EntityInterface;
ใช้ Drupal\Core\Session\AccountInterface;

/**
 * ใช้ hook_ENTITY_TYPE_access()
 */
ฟังก์ชัน mymodule_block_content_access (EntityInterface $entity, $operation, AccountInterface $บัญชี) {
  ถ้า ($ การดำเนินการ == 'ดู') {
    ถ้า ($entity->id() == 4) {
      กลับ AccessResult::forbidden();
    }
  }
  กลับ AccessResult::เป็นกลาง ();
}
SomebodySysop avatar
gb flag
ค้นพบว่า hook_block_access() ไม่ทำงานเลยเมื่อวางบล็อกโดยใช้ตัวสร้างเลย์เอาต์ ในทางกลับกัน hook_entity_type_access() ทำงานได้อย่างสมบูรณ์ ขอบคุณสำหรับสิ่งนั้น.

โพสต์คำตอบ

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