นี่คือคำอธิบายดั้งเดิมของงาน (ตอนนี้ถูกลบออกจากคำถาม):
สร้างสิ่งต่อไปนี้:
- ประเภทเนื้อหา Drupal เพื่อเก็บผลิตภัณฑ์ทั้งหมดของพวกเขา
- บล็อก Drupal ที่สามารถวางไว้ในหน้าผลิตภัณฑ์ใดก็ได้ บล็อกเมื่อวางในหน้าผลิตภัณฑ์ใด ๆ จะแสดงปัจจุบันโดยอัตโนมัติ
แสดงลิงค์การซื้อแอพของผลิตภัณฑ์เป็นรหัส QR ที่เว็บไซต์
ผู้เยี่ยมชมสามารถสแกนโดยใช้มือถือ
คุณสามารถใช้เส้นทางปัจจุบันเพื่อรับโหนดและเพิ่มบล็อกเฉพาะสำหรับแต่ละโหนด:
/src/Plugin/Block/ExampleBlock.php:
<?php
เนมสเปซ Drupal\mymodule\Plugin\Block;
ใช้ Drupal\Core\Block\BlockBase;
/**
* ให้บล็อกตัวอย่าง
*
* @ปิดกั้น(
* id = "mymodule_example",
* admin_label = @Translation("ตัวอย่าง"),
* หมวดหมู่ = @Translation("mymodule")
* )
*/
คลาส ExampleBlock ขยาย BlockBase {
สร้างฟังก์ชั่นสาธารณะ () {
$สร้าง = [];
$node = \Drupal::routeMatch()->getParameter('โหนด');
ถ้า ($ โหนดอินสแตนซ์ของ \Drupal\node\NodeInterface) {
// คำนวณ $qr_image ด้วย $node
$ สร้าง = [
'#markup' => $qr_image,
'#cache' => ['tags' => $node->getCacheTags()],
];
}
$build['#cache']['contexts'] = ['เส้นทาง'];
ส่งคืน $build;
}
}
2. เวอร์ชัน
การใช้บล็อกเดียวกันกับบริบทของโหนดตามที่ @leymann แนะนำ:
/src/Plugin/Block/ExampleBlock.php:
<?php
เนมสเปซ Drupal\mymodule\Plugin\Block;
ใช้ Drupal\Core\Block\BlockBase;
/**
* ให้บล็อกตัวอย่าง
*
* @ปิดกั้น(
* id = "mymodule_example",
* admin_label = @Translation("ตัวอย่าง"),
* หมวดหมู่ = @Translation("mymodule"),
* บริบท_definitions = {
* "โหนด" = @ContextDefinition("เอนทิตี:โหนด")
* }
* )
*/
คลาส ExampleBlock ขยาย BlockBase {
สร้างฟังก์ชั่นสาธารณะ () {
$node = $this->getContextValue('โหนด');
// คำนวณ $qr_image ด้วย $node
กลับ [
'#markup' => $qr_image,
];
}
}
ข้อได้เปรียบ คุณไม่จำเป็นต้องดูแลเกี่ยวกับการแคช บริบทจะทำสิ่งนี้โดยอัตโนมัติ ข้อเสีย คุณต้องทำให้บล็อกขึ้นอยู่กับบริบทเมื่อวางในรูปแบบบล็อก Drupal ยังไม่สามารถจับคู่บริบทบล็อกได้โดยอัตโนมัติ ตัวอย่างเช่น คุณสามารถเพิ่มการเปิดเผยสำหรับประเภทเนื้อหา ซึ่งน่าจะเป็นความคิดที่ดีอยู่แล้ว