В некоторых случаях удобно не только встроить View через UI или блок, но и программно срендерить представление (View
) и получить HTML — например, для отправки во внешнюю систему, в e-mail, или вывода в нестандартном месте.
В этой статье покажем, как это сделать правильно — через Views::getView()
и renderer->renderRoot()
.
Пример: рендеринг View в HTML
Вот готовый рабочий пример:
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 |
use Drupal\views\Views; use Drupal\Core\Render\RendererInterface; /** @var \Drupal\views\ViewExecutable|null $view */ $view = Views::getView('machine_name_view'); if ($view && $view->access('default')) { $view->setDisplay('default'); $view->preExecute(); $view->execute(); $render = $view->render(); /** @var RendererInterface $renderer */ $renderer = \Drupal::service('renderer'); $html = $renderer->renderRoot($render); // Теперь $html содержит финальную HTML-разметку // Например, можно вернуть её как #markup: return [ '#type' => 'markup', '#markup' => $html, ]; } else { return [ '#markup' => 'View не найден или доступ запрещён.', ]; } |
Разбор кода
Сначала мы получаем представление через Views::getView('machine_name_view')
— этот вызов загружает View по его системному имени (machine name). После этого мы указываем, какой именно дисплей использовать, например, default
или block_1
, вызвав метод setDisplay()
.
Далее необходимо подготовить представление к выполнению — это делается с помощью вызовов preExecute()
и execute()
, которые собирают параметры и запускают запрос. Результат работы представления сохраняется в виде рендер-массива, получаемого через метод render()
.
Однако на этом этапе мы имеем не готовый HTML, а структурированный массив, который должен быть отрисован системой рендеринга Drupal. Чтобы получить итоговую HTML-разметку, мы используем сервис renderer
и его метод renderRoot()
, передав в него полученный рендер-массив. Этот метод не только формирует HTML, но и корректно обрабатывает кеш-контексты, вложенные элементы и завершает пайплайн рендеринга.
Таким образом, на выходе мы получаем полностью отрендеренную HTML-строку, готовую к использованию в любых нужных вам целях.