Это исходное описание задачи (сейчас удалено из вопроса):
Постройте следующее:
- Тип контента 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 еще не может автоматически отображать контекст блока. Вы могли бы, например, добавить видимость для типа контента, что, вероятно, в любом случае является хорошей идеей.