Рейтинг:-2

Как показать блок с уникальным QR для каждого узла?

флаг th

Существует требование, когда мне нужно разместить блок на узле, где каждый блок будет иметь уникальный QR-код.

Я создал жестко закодированный блок QR-кода со следующим кодом.

общедоступная функция сборки () {
  $путь = '';
  $directory = "public://Images/QrCodes/";
  \Drupal::service('file_system')->prepareDirectory($directory, \Drupal\Core\File\FileSystemInterface::CREATE_DIRECTORY);
  $qrName = 'мойQrcode';
  $uri = $каталог. «QR». '.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')
    ->сгенерироватьАбсолютнуюСтроку($uri); 
    
  $qr_image = "<img src='{$relative_file_url}'/>";
      
  возвращаться [
    '#разметка' => $qr_image,
  ];
}

Единственная проблема заключается в том, что я не могу ни добавить блок в узлы, ни сделать динамический QR-код.

Это означает, что каждый узел будет иметь уникальный блок QR-кода.

Как создать динамический блок внутри hook_preprocess_node?

Пожалуйста помоги

leymannx avatar
флаг ne
Итак, это была исходная задача, связанная с вопросом https://github.com/Dineshkushwaha/sph-test/blob/main/README.md, и это выглядит так, как будто вы позволяете другим делать свою домашнюю работу.
флаг fr
Сначала нужно понять, что такое блок и узел и чем они отличаются от страницы. Вы не можете «поместить блок на узел». Блоки размещаются на *странице* как часть отображения страницы; эта страница может или не может *также* отображать узел.
leymannx avatar
флаг ne
А там просто список пулреквестов с возможными решениями. https://github.com/Dineshkushwaha/sph-test/pulls Возможно, сначала попробуйте их прочитать и понять.
apaderno avatar
флаг us
Ответ на вопрос *Как мне создать динамический блок внутри `hook_preprocess_node()`?*: *Вы этого не сделаете.* поскольку считается, что `hook_preprocess_node()` не создает динамические блоки.
Рейтинг: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("моймодуль")
 * )
 */
класс ExampleBlock расширяет BlockBase {

  общедоступная функция сборки () {
  
    $сборка = [];

    $node = \Drupal::routeMatch()->getParameter('node');
    если ($узел экземпляр\Drupal\узел\NodeInterface) {
      // вычисляем $qr_image с помощью $node
      $ построить = [
        '#разметка' => $qr_image,
        '#cache' => ['tags' => $node->getCacheTags()],
      ];
    }

    $build['#cache']['contexts'] = ['route'];
    вернуть $сборку;
  }
}

2. Версия

Реализация того же блока с контекстом узла, как предложил @leymann:

/src/Plugin/Block/ExampleBlock.php:

<?php

пространство имен Drupal\mymodule\Plugin\Block;

используйте Drupal\Core\Block\BlockBase;

/**
 * Предоставляет пример блока.
 *
 * @Блокировать(
 * id = "mymodule_example",
 * admin_label = @Translation("Пример"),
 * категория = @Translation("моймодуль"),
 * context_definitions = {
 * "узел" = @ContextDefinition ("сущность: узел")
 * }
 * )
 */
класс ExampleBlock расширяет BlockBase {

  общедоступная функция сборки () {
    $node = $this->getContextValue('узел');
    // вычисляем $qr_image с помощью $node
    возвращаться [
      '#разметка' => $qr_image,
    ];
  }
  
}

Преимущество в том, что вам не нужно заботиться о кэшировании, контекст делает это автоматически. Недостаток, вам нужно сделать блок зависимым от контекста при размещении его в макете блока. Drupal еще не может автоматически отображать контекст блока. Вы могли бы, например, добавить видимость для типа контента, что, вероятно, в любом случае является хорошей идеей.

флаг th
Но как добавить блок на узел?
4uk4 avatar
флаг cn
Поместите блок на правую боковую панель в соответствии с [вашим планом] (https://drupal.stackexchange.com/questions/310719/how-do-i-show-a-block-with-a-unique-qr-for -каждый-узел/310724?noredirect=1#comment395068_310721). Когда вы затем посещаете узел, блок будет отображаться с QR-кодом для этого узла. На других страницах блок пуст и будет скрыт.
leymannx avatar
флаг ne
(Узел может быть введен из контекста, и следует избегать вызовов \Drupal.)
4uk4 avatar
флаг cn
@leymannx, контекст - отличная идея, и он удаляет любые вызовы \Drupal без DI ;-)
Jaypan avatar
флаг de
Вы также можете добавить блок в Layout Builder, если вы его используете.
Рейтинг:2
флаг cn
  1. Ответ прост: если вы не хотите/не можете использовать https://www.drupal.org/project/twig_tweak - затем просто скопируйте код друпал_блок Расширение Twig из этого модуля в ваш собственный модуль.

  2. Если это не так - просто реализуйте hook_preprocess_node и поместите туда свой код сборки блока или загрузите блок и отправьте его в шаблон узла через $переменные.

  3. Используйте модуль построителя макета (в ядре), чтобы разместить блоки на страницах узла.

флаг cn
Кстати, из вашего кода я не понимаю, как это связано с конкретным узлом.
флаг th
Я много искал, но не нашел способа разместить блок на узлах. Не могли бы вы помочь
флаг th
нашел это https://stackoverflow.com/questions/43771500/using-preprocess-hook-on-specific-node-type-in-drupal-8.. Попробуйте сейчас
флаг cn
Просто скопируйте содержимое метода `build()` вашего блока в предварительную обработку узла и избавьтесь от блока.
флаг cn
Добавил еще одно решение.
флаг th
В постановке задачи четко указано, что я должен использовать Блок, и этот блок должен быть размещен на правой боковой панели, но спасибо за ваши ответы.
Рейтинг:1
флаг fr

Модуль штрих-кодов https://www.drupal.org/project/barcodes предоставляет блок отображения штрих-кода любого типа, включая QR-код. Эта задача так же проста, как включение модуля, а затем настройка блока для отображения того, что вы хотите. Кодирование не требуется. Штрих-коды поддерживают токены, поэтому вы можете динамически кодировать и отображать идентификатор продукта, идентификатор узла или любую другую информацию в блоке штрих-кода.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.