Cum pot încărca un șablon dintr-un modul personalizat pe o anumită pagină?
Oferim conținutul nostru prin intermediul API-urilor. Uneori folosim abordarea Views Restful și uneori JSONAPI.
Trebuie să adăugăm un câmp API pe noduri care este o redare HTML completă a paginii acelui nod în funcție de tema (tehnic, am nevoie doar de... dar voi lua întregul document dacă îl pot obține).
Am încercat mai multe abordări:
Am încercat să folosesc serviciul de redare. Redă html complet din șablonul html.html.twig, dar elemente precum blocurile din pagină lipsesc. Bănuiesc că nu are tot contextul de care are nevoie.
$view_builder = \Drupal::entityTypeManager()->getViewBuilder('node');
$conținut = $view_builder->view($node);
$build = [
'#type' => 'html',
'pagina' => [
'#type' => 'pagina',
'#theme' => 'pagina',
'#title' => $node->get("titlu")->valoare,
'conținut' => $conținut,
],
];
$pagina = \Drupal::service('renderer')->renderPlain($build);
Foarte similar, am încercat să folosesc twig_render_template. În mod similar, redă html complet, dar elemente precum blocurile de pe pagină lipsesc.
$markup = twig_render_template(drupal_get_path('theme', 'neato') . '/templates/base/html.html.twig', array(
'pagina' => [
'#type' => 'pagina',
'#theme' => 'pagina',
'#title' => $node->get("titlu")->valoare,
'conținut' => $conținut,
],
// Necesar pentru a preveni notificările când depanarea Twig este activată.
'theme_hook_original' => 'nu se aplică',
));
$corp = (șir) $markup;
Ca o abordare separată, am încercat să fac o „subsolicitare”. Cu această abordare, obțin codul HTML randat, dar provoacă erori fatale de randare timpurie, cum ar fi „O invocare a renderRoot() rătăcită provoacă ruperea bulelor de active atașate”.
$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();
Am încercat chiar să imit „bootstrap” complet drupal
$autoloader = necesită „/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();