Làm cách nào tôi có thể tải mẫu từ mô-đun tùy chỉnh trên một trang nhất định?
Chúng tôi cung cấp nội dung của mình thông qua API. Đôi khi, chúng tôi sử dụng phương pháp Chế độ xem yên tĩnh và đôi khi sử dụng JSONAPI.
Chúng tôi cần thêm một trường API trên các nút là kết xuất HTML đầy đủ của trang của nút đó theo chủ đề (về mặt kỹ thuật, tôi chỉ cần ... nhưng tôi sẽ lấy toàn bộ tài liệu nếu tôi có thể lấy được).
Tôi đã thử một số cách tiếp cận:
Tôi đã thử sử dụng dịch vụ kết xuất đồ họa. Nó hiển thị html đầy đủ từ mẫu html.html.twig nhưng các mục như khối trên trang bị thiếu. Tôi đoán nó không có tất cả ngữ cảnh cần thiết.
$view_builder = \Drupal::entityTypeManager()->getViewBuilder('node');
$content = $view_builder->view($node);
xây dựng $ = [
'#type' => 'html',
'trang' => [
'#type' => 'trang',
'#theme' => 'trang',
'#title' => $node->get("title")->value,
'nội dung' => $nội dung,
],
];
$page = \Drupal::service('renderer')->renderPlain($build);
Rất giống tôi đã thử sử dụng twig_render_template. Tương tự, nó hiển thị toàn bộ html nhưng các mục như khối trên trang bị thiếu.
$markup = twig_render_template(drupal_get_path('theme', 'neato') . '/templates/base/html.html.twig', mảng(
'trang' => [
'#type' => 'trang',
'#theme' => 'trang',
'#title' => $node->get("title")->value,
'nội dung' => $nội dung,
],
// Cần thiết để ngăn thông báo khi gỡ lỗi Twig được bật.
'theme_hook_ original' => 'không áp dụng',
));
$body = (chuỗi) $markup;
Là một cách tiếp cận riêng biệt, tôi đã cố gắng thực hiện một 'yêu cầu phụ'. Với cách tiếp cận này, tôi nhận được HTML được kết xuất nhưng nó gây ra các lỗi kết xuất ban đầu nghiêm trọng, chẳng hạn như "Lệnh gọi renderRoot() đi lạc đang khiến nội dung đính kèm bị vỡ bong bóng."
$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();
Tôi thậm chí đã cố gắng bắt chước 'bootstrap' đầy đủ của drupal
$autoloader = yêu cầu '/app/web/autoload.php';
$sub_request = Yêu cầu::tạo("/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();