Score:-2

ฉันจะแสดงบล็อกที่มี QR เฉพาะสำหรับแต่ละโหนดได้อย่างไร

ธง th

มีข้อกำหนดที่ฉันต้องวางบล็อกบนโหนดซึ่งแต่ละบล็อกจะมีรหัส QR ที่ไม่ซ้ำ

ฉันสร้างบล็อกคิวอาร์โค้ดแบบฮาร์ดโค้ดด้วยโค้ดต่อไปนี้

สร้างฟังก์ชั่นสาธารณะ () {
  $เส้นทาง = '';
  $directory = "สาธารณะ://Images/QrCodes/";
  \Drupal::service('file_system')->prepareDirectory($directory, \Drupal\Core\File\FileSystemInterface::CREATE_DIRECTORY);
  $qrName = 'myQrcode';
  $uri = $ไดเรกทอรี 'คิวอาร์'. '.png'; // สร้างภาพ png
    
  $path = \Drupal::service('file_system')->realpath($uri);
    
  \PHPQRCode\QRcode::png("www.google.com", $path, 'L', 4, 2);
  
  $relative_file_url = \Drupal::service('file_url_generator')
    ->generateAbsoluteString($uri); 
    
  $qr_image = "<img src='{$relative_file_url}'/>";
      
  กลับ [
    '#markup' => $qr_image,
  ];
}

ปัญหาเดียวคือฉันไม่สามารถเพิ่มบล็อกไปยังโหนดหรือทำให้โค้ด QR เป็นไดนามิกได้

หมายความว่าแต่ละโหนดจะมี QR Code Block ที่ไม่ซ้ำกัน

จะสร้างไดนามิกบล็อกภายใน hook_preprocess_node ได้อย่างไร

กรุณาช่วย

leymannx avatar
ne flag
นี่เป็นงานดั้งเดิมที่เชื่อมโยงในคำถาม https://github.com/Dineshkushwaha/sph-test/blob/main/README.md และดูเหมือนว่าคุณปล่อยให้คนอื่นทำการบ้านเล็กน้อย
fr flag
ก่อนอื่นคุณต้องเข้าใจว่าบล็อกและโหนดคืออะไรและแตกต่างจากเพจอย่างไร คุณไม่สามารถ "วางบล็อกบนโหนด" บล็อกวางอยู่บน *หน้า* ซึ่งเป็นส่วนหนึ่งของการแสดงหน้า หน้านั้นอาจหรือไม่ *แสดงโหนดด้วยก็ได้
leymannx avatar
ne flag
และมีเพียงรายการของคำขอดึงพร้อมวิธีแก้ปัญหาที่เป็นไปได้ https://github.com/Dineshkushwaha/sph-test/pulls อาจจะลองอ่านทำความเข้าใจก่อนนะครับ
apaderno avatar
us flag
คำตอบของ *ฉันจะสร้างไดนามิกบล็อกภายใน `hook_preprocess_node()` ได้อย่างไร* คือ *คุณทำไม่ได้* เนื่องจาก `hook_preprocess_node()` ไม่คิดว่าจะสร้างบล็อกไดนามิก
Score:5
ธง cn

นี่คือคำอธิบายดั้งเดิมของงาน (ตอนนี้ถูกลบออกจากคำถาม):

สร้างสิ่งต่อไปนี้:

  • ประเภทเนื้อหา 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 ยังไม่สามารถจับคู่บริบทบล็อกได้โดยอัตโนมัติ ตัวอย่างเช่น คุณสามารถเพิ่มการเปิดเผยสำหรับประเภทเนื้อหา ซึ่งน่าจะเป็นความคิดที่ดีอยู่แล้ว

th flag
แต่ฉันจะเพิ่มบล็อกบนโหนดได้อย่างไร
4uk4 avatar
cn flag
วางบล็อกในแถบด้านขวาตาม [แผนของคุณ](https://drupal.stackexchange.com/questions/310719/how-do-i-show-a-block-with-a-unique-qr-for -each-node/310724?noredirect=1#comment395068_310721) เมื่อคุณเยี่ยมชมโหนดหนึ่ง ๆ บล็อกจะปรากฏขึ้นพร้อมกับ QR-Code สำหรับโหนดนั้น ในหน้าอื่นๆ บล็อกจะว่างเปล่าและจะถูกซ่อนไว้
leymannx avatar
ne flag
(สามารถแทรกโหนดจากบริบทและควรหลีกเลี่ยงการเรียก \Drupal)
4uk4 avatar
cn flag
@leymannx บริบทเป็นแนวคิดที่ดีและสิ่งนี้จะลบการโทร \Drupal ใด ๆ โดยไม่มี DI ;-)
Jaypan avatar
de flag
คุณยังสามารถเพิ่มบล็อกใน Layout Builder หากคุณกำลังใช้งานอยู่
Score:2
ธง cn
  1. คำตอบง่ายๆ คือ: หากคุณไม่ต้องการ/ไม่สามารถใช้ https://www.drupal.org/project/twig_tweak - จากนั้นเพียงคัดลอกรหัสของ drupal_block ส่วนขยาย Twig จากโมดูลนั้นไปยังโมดูลของคุณเอง

  2. หากไม่เป็นเช่นนั้น - เพียงแค่นำไปใช้ hook_preprocess_node และใส่รหัสการสร้างบล็อกของคุณที่นั่น หรือโหลดบล็อกแล้วส่งไปยังเทมเพลตโหนดผ่าน $ตัวแปร.

  3. ใช้โมดูลตัวสร้างเลย์เอาต์ (ในคอร์) เพื่อวางบล็อกบนหน้าโหนด

cn flag
BTW จากรหัสของคุณฉันไม่เห็นว่าสิ่งนี้เชื่อมต่อกับโหนดใดโหนดหนึ่ง
th flag
ฉันค้นหามาก แต่ไม่พบวิธีวางบล็อกบนโหนด คุณช่วยได้ไหม
th flag
พบ https://stackoverflow.com/questions/43771500/using-preprocess-hook-on-specific-node-type-in-drupal-8..Trying นี้
cn flag
เพียงคัดลอกเนื้อหาของเมธอด `build()` ของบล็อกของคุณไปยังโหนดประมวลผลล่วงหน้าและกำจัดบล็อก
cn flag
เพิ่มอีกหนึ่งโซลูชั่น
th flag
ในคำชี้แจงปัญหาระบุไว้อย่างชัดเจนว่าฉันต้องใช้ Block และควรวางบล็อกนั้นไว้ที่แถบด้านขวา แต่ขอบคุณสำหรับคำตอบของคุณ
Score:1
ธง fr

โมดูลบาร์โค้ด https://www.drupal.org/project/barcodes ให้บล็อกแสดงบาร์โค้ดทุกประเภทรวมถึงรหัส QR งานนี้ทำได้ง่ายเพียงแค่เปิดใช้งานโมดูล จากนั้นกำหนดค่าบล็อกให้แสดงสิ่งที่คุณต้องการ ไม่จำเป็นต้องมีการเข้ารหัส บาร์โค้ดรองรับโทเค็น ดังนั้นคุณจึงสามารถเข้ารหัสและแสดงรหัสผลิตภัณฑ์ รหัสโหนด หรือข้อมูลอื่น ๆ ในบล็อกบาร์โค้ดของคุณแบบไดนามิก

โพสต์คำตอบ

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