Как я могу загрузить шаблон из пользовательского модуля на определенной странице?
Мы предоставляем наш контент через API. Иногда мы используем подход Views Restful, а иногда — JSONAPI.
Нам нужно добавить поле API на узлах, которое представляет собой полный HTML-рендеринг страницы этого узла в соответствии с темой (технически мне просто нужно... но я возьму весь документ, если смогу его получить).
Я пробовал несколько подходов:
Я попытался использовать службу рендеринга. Он отображает полный HTML-код из шаблона html.html.twig, но такие элементы, как блоки на странице, отсутствуют. Я предполагаю, что у него нет всего контекста, в котором он нуждается.
$view_builder = \Drupal::entityTypeManager()->getViewBuilder('node');
$content = $view_builder->представление($node);
$ построить = [
'#тип' => 'html',
'страница' => [
'#тип' => 'страница',
'#theme' => 'страница',
'#title' => $node->get("title")->значение,
'контент' => $контент,
],
];
$page = \Drupal::service('рендерер')->renderPlain($build);
Точно так же я пытался использовать twig_render_template. Точно так же он отображает полный html, но такие элементы, как блоки на странице, отсутствуют.
$markup = twig_render_template(drupal_get_path('theme', 'neato'). '/templates/base/html.html.twig', array(
'страница' => [
'#тип' => 'страница',
'#theme' => 'страница',
'#title' => $node->get("title")->значение,
'контент' => $контент,
],
// Необходимо для предотвращения уведомлений, когда включена отладка Twig.
'theme_hook_original' => 'не применимо',
));
$body = (строка) $разметка;
В качестве отдельного подхода я попытался сделать «подзапрос». При таком подходе я получаю визуализированный HTML-код, но это вызывает фатальные ошибки раннего рендеринга, такие как «Блуждающий вызов renderRoot() приводит к разрыву всплытия прикрепленных ресурсов».
$kernel = \Drupal::service('http_kernel.basic');
$sub_request = \Symfony\Component\HttpFoundation\Request::create("/node/".$value->_entity->id(), 'GET');
$subResponse = $kernel->handle($sub_request, \Symfony\Component\HttpKernel\HttpKernelInterface::SUB_REQUEST);
$html = $subResponse->getContent();
Я даже пытался имитировать полную загрузку Drupal.
$autoloader = требуется '/app/web/autoload.php';
$sub_request = Request::create("/node/".$node->id(), 'GET');
$site_path = DrupalKernel::findSitePath($sub_request);
$kernel = DrupalKernel::createFromRequest($sub_request, $autoloader, 'prod');
$sub_response = $kernel->handle($sub_request, HttpKernelInterface::SUB_REQUEST);
$html = $sub_response->getContent();