Điểm:-2

Làm cách nào để hiển thị một khối có QR duy nhất cho mỗi nút?

lá cờ th

Có một yêu cầu là tôi cần Đặt một Khối trên nút trong đó mỗi khối sẽ có mã QR Duy nhất.

Tôi đã tạo một khối mã QR được mã hóa cứng bằng mã sau.

xây dựng chức năng công cộng () {
  $path = '';
  $directory = "public://Images/QrCodes/";
  \Drupal::service('file_system')->prepareDirectory($directory, \Drupal\Core\File\FileSystemInterface::CREATE_DIRECTORY);
  $qrName = 'myQrcode';
  $uri = $thư mục . 'QR'. '.png'; // Tạo một hình ảnh 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}'/>";
      
  trở lại [
    '#markup' => $qr_image,
  ];
}

Vấn đề duy nhất là tôi không thể thêm khối vào các nút cũng như không thể làm cho mã QR động.

Điều đó có nghĩa là Mỗi nút sẽ có một Khối mã QR duy nhất.

Làm cách nào để tạo một khối động bên trong hook_pre process_node?

Hãy giúp tôi

leymannx avatar
lá cờ ne
Vì vậy, đây là nhiệm vụ ban đầu được liên kết trong câu hỏi https://github.com/Dineshkushwaha/sph-test/blob/main/README.md và có vẻ như bạn để người khác làm bài tập về nhà của mình.
lá cờ fr
Trước tiên, bạn cần hiểu khối và nút là gì và chúng khác với trang như thế nào. Bạn không thể "đặt một khối trên một nút". Các khối được đặt trên một *trang*, như một phần của màn hình trang; trang đó có thể hoặc không * cũng * hiển thị một nút.
leymannx avatar
lá cờ ne
Và chỉ có một danh sách yêu cầu kéo với các giải pháp khả thi. https://github.com/Dineshkushwaha/sph-test/pulls Có thể thử đọc và hiểu chúng trước.
apaderno avatar
lá cờ us
Câu trả lời cho *Làm cách nào để tôi tạo khối động bên trong `hook_pre process_node()`?* là *Bạn không muốn.* vì `hook_pre process_node()` không được cho là tạo khối động.
Điểm:5
lá cờ cn

Đây là mô tả ban đầu của nhiệm vụ (hiện đã bị xóa khỏi câu hỏi):

Xây dựng như sau:

  • Loại nội dung Drupal để chứa tất cả các sản phẩm của họ
  • Một khối Drupal có thể được đặt trên bất kỳ trang sản phẩm nào. Khối, khi được đặt trên bất kỳ trang sản phẩm nào, sẽ tự động hiển thị hiện tại đã hiển thị Liên kết mua ứng dụng của sản phẩm dưới dạng mã QR, rằng trang web khách truy cập có thể quét bằng điện thoại di động của họ.

Bạn có thể sử dụng tuyến đường hiện tại để lấy nút và thêm một khối duy nhất cho mỗi nút:

/src/Plugin/Block/ExampleBlock.php:

<?php

không gian tên Drupal\mymodule\Plugin\Block;

sử dụng Drupal\Core\Block\BlockBase;

/**
 * Cung cấp một khối ví dụ.
 *
 * @Chặn(
 * id = "mymodule_example",
 * admin_label = @Translation("Ví dụ"),
 * danh mục = @Translation("mymodule")
 * )
 */
lớp Ví dụBlock mở rộng BlockBase {

  xây dựng chức năng công cộng () {
  
    $xây dựng = [];

    $node = \Drupal::routeMatch()->getParameter('node');
    if ($node instanceof \Drupal\node\NodeInterface) {
      // tính toán $qr_image với $node
      xây dựng $ = [
        '#markup' => $qr_image,
        '#cache' => ['tags' => $node->getCacheTags()],
      ];
    }

    $build['#cache']['contexts'] = ['tuyến đường'];
    trả lại bản dựng $;
  }
}

2. Phiên bản

Triển khai cùng một khối với bối cảnh nút, như @leymann đã đề xuất:

/src/Plugin/Block/ExampleBlock.php:

<?php

không gian tên Drupal\mymodule\Plugin\Block;

sử dụng Drupal\Core\Block\BlockBase;

/**
 * Cung cấp một khối ví dụ.
 *
 * @Chặn(
 * id = "mymodule_example",
 * admin_label = @Translation("Ví dụ"),
 * danh mục = @Translation("mymodule"),
 * context_definitions = {
 * "nút" = @ContextDefinition("thực thể:nút")
 * }
 * )
 */
lớp Ví dụBlock mở rộng BlockBase {

  xây dựng chức năng công cộng () {
    $node = $this->getContextValue('node');
    // tính toán $qr_image với $node
    trở lại [
      '#markup' => $qr_image,
    ];
  }
  
}

Ưu điểm, bạn không cần quan tâm đến bộ nhớ đệm, ngữ cảnh sẽ tự động thực hiện việc này. Nhược điểm, bạn cần làm cho khối phụ thuộc vào ngữ cảnh khi đặt nó trong bố cục khối. Drupal chưa thể tự động ánh xạ bối cảnh khối. Ví dụ, bạn có thể thêm khả năng hiển thị cho loại nội dung, đây có thể là một ý tưởng hay.

lá cờ th
Nhưng làm cách nào để thêm khối trên nút?
4uk4 avatar
lá cờ cn
Đặt khối ở thanh bên phải, theo [kế hoạch của bạn](https://drupal.stackexchange.com/questions/310719/how-do-i-show-a-block-with-a-unique-qr-for -each-node/310724?noredirect=1#comment395068_310721). Sau đó, khi bạn truy cập một nút, khối sẽ được hiển thị, với Mã QR cho nút đó. Trên các trang khác, khối trống và sẽ bị ẩn.
leymannx avatar
lá cờ ne
(Nút có thể được đưa vào từ ngữ cảnh và nên tránh các cuộc gọi \Drupal. )
4uk4 avatar
lá cờ cn
@leymannx, bối cảnh là một ý tưởng tuyệt vời và điều này sẽ loại bỏ mọi cuộc gọi \Drupal mà không có DI ;-)
Jaypan avatar
lá cờ de
Bạn cũng có thể thêm khối trong Trình tạo bố cục nếu bạn đang sử dụng nó.
Điểm:2
lá cờ cn
  1. Câu trả lời đơn giản là: nếu bạn không muốn/không thể sử dụng https://www.drupal.org/project/twig_tweak - sau đó chỉ cần sao chép mã của drupal_block Twig tiện ích mở rộng từ mô-đun đó sang mô-đun của riêng bạn.

  2. Nếu đó không phải là trường hợp - chỉ cần thực hiện hook_pre process_node và đặt mã xây dựng khối của bạn ở đó hoặc tải khối và gửi nó tới mẫu nút qua biến $.

  3. Sử dụng mô-đun trình tạo bố cục (trong lõi) để đặt các khối trên các trang nút.

lá cờ cn
BTW, từ mã của bạn, tôi không thấy cách kết nối này với nút cụ thể.
lá cờ th
Tôi đã tìm kiếm rất nhiều nhưng không tìm ra cách đặt khối trên các nút. Bạn có thể giúp
lá cờ th
tìm thấy cái này https://stackoverflow.com/questions/43771500/using-pre process-hook-on-specific-node-type-in-drupal-8..Thử ngay bây giờ
lá cờ cn
Chỉ cần sao chép nội dung của phương thức `build()` trong khối của bạn vào tiền xử lý nút và loại bỏ khối.
lá cờ cn
Đã thêm một giải pháp nữa.
lá cờ th
Trong tuyên bố vấn đề, có đề cập rõ ràng rằng tôi phải sử dụng Khối và khối đó phải được đặt ở thanh bên phải, nhưng cảm ơn câu trả lời của bạn.
Điểm:1
lá cờ fr

Mô-đun mã vạch https://www.drupal.org/project/barcodes cung cấp một khối hiển thị mã vạch thuộc bất kỳ loại nào, kể cả mã QR. Nhiệm vụ này đơn giản như kích hoạt mô-đun sau đó định cấu hình khối để hiển thị những gì bạn muốn. Không mã hóa cần thiết. Mã vạch hỗ trợ mã thông báo để bạn có thể tự động mã hóa và hiển thị ID sản phẩm, ID nút hoặc bất kỳ thông tin nào khác trong khối mã vạch của mình.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.