
Иногда в шаблоне Drupal удобно вывести QR-код прямо по месту — без внешних файлов, без рендеринга через отдельный контроллер и без подключения сторонних сервисов. Например, чтобы вставить ссылку на страницу, код подтверждения, номер заказа или любую короткую строку. Это можно сделать всего несколькими строками, добавив к Twig собственный фильтр |qrcode
.
Для генерации самого кода используется лёгкая и надёжная библиотека endroid/qr-code, устанавливаемая через Composer:
1 |
composer require endroid/qr-code |
После установки в модуле создаётся сервис, который регистрирует Twig-расширение: (У меня это был кастомный модуль tweaks).
В файле tweaks.services.yml
регистрируется новый сервис:
1 2 3 4 5 6 |
services: tweaks.twig.qr_code: class: Drupal\tweaks\Twig\QrCodeExtension tags: - { name: twig.extension } arguments: [] |
Сам плагин минималистичен и не требует дополнительных зависимостей, кроме библиотеки Endroid. Он добавляет фильтр |qrcode
, который принимает строку (или URL) и необязательный массив параметров.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
<?php namespace Drupal\tweaks\Twig; use Twig\Extension\AbstractExtension; use Twig\TwigFilter; use Endroid\QrCode\QrCode; use Endroid\QrCode\Writer\PngWriter; use Endroid\QrCode\Writer\SvgWriter; /** * Provides Twig filter |qrcode. */ class QrCodeExtension extends AbstractExtension { public function getFilters() { return [ new TwigFilter('qrcode', [$this, 'generate'], ['is_safe' => ['html']]), ]; } /** * Generate QR code. * * @param string $text * Text or URL to encode. * @param array $options * Options: * - size: int (px) default 200 * - format: 'svg' or 'png' (default 'svg') * - alt: alt text for img tag (default '') * @return string * HTML string: inline SVG or <img src="data:image/png;base64,..."> */ public function generate($text, array $options = []) { $size = isset($options['size']) ? (int) $options['size'] : 200; $format = isset($options['format']) ? $options['format'] : 'svg'; $alt = isset($options['alt']) ? htmlspecialchars($options['alt'], ENT_QUOTES, 'UTF-8') : ''; // Create QR code object. $qr = QrCode::create($text) ->setSize($size); if ($format === 'png') { $writer = new PngWriter(); $result = $writer->write($qr); $data = $result->getString(); $base64 = base64_encode($data); return '<img src="data:image/png;base64,' . $base64 . '" alt="' . $alt . '" width="' . $size . '" height="' . $size . '"/>'; } else { // default svg $writer = new SvgWriter(); $result = $writer->write($qr); // getString() returns the SVG markup. $svg = $result->getString(); // SVG уже безопасен как HTML (is_safe => html), но можно минимально очистить. return $svg; } } } |
В шаблоне Twig его можно использовать прямо как фильтр:
1 |
{{ 'https://example.com'|qrcode }} |
или с параметрами:
1 |
{{ 'https://example.com'|qrcode({'format':'png','size':150,'alt':'Site link'}) }} |
По умолчанию фильтр возвращает встроенный SVG, который сразу вставляется в HTML-разметку. Это наиболее лёгкий вариант: не создаётся файл, не загружается изображение с диска, и код можно использовать где угодно — в обычных страницах, e-mail-шаблонах или PDF-документах.
Если указать format: 'png'
, плагин создаёт <img>
с data:image/png;base64,...
.
Минимум кода, никаких зависимостей от маршрутов и контроллеров, а результат — полностью автономный QR-код, который можно сгенерировать прямо в шаблоне. Это один из тех маленьких плагинов, которые экономят время и упрощают жизнь при верстке нестандартных шаблонов или интеграции с PDF-экспортом.