Điểm:2

Tôi cởi mở với bất kỳ và tất cả các gợi ý và đề xuất. Tôi rất trân trọng điều này.

lá cờ cn

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();

john Smith avatar
lá cờ gr
giống như một cách có thể "không hiệu quả" và không drupal, hãy sử dụng file_get_contents trên url của trang ...
john Smith avatar
lá cờ gr
Tái bút: tôi vừa tình cờ thấy `\Drupal::service('renderer')->renderRoot(` trong một số mã của tôi, có thể nó hữu ích thay vì sử dụng `renderPlain`
4uk4 avatar
lá cờ cn
Thông thường, bạn hoàn toàn không cần kết xuất các biến. Nhưng nếu bạn cần, hãy sử dụng `\Drupal::service('renderer')->render()`. Hai phương pháp trên chỉ dành cho các trường hợp sử dụng cụ thể, không dành cho kết xuất trang bình thường.
lá cờ cn
Đã đồng ý. Đây không phải là cách các trang thường được hiển thị. Đó là một trường hợp cạnh cho thông số kỹ thuật của tôi. Tôi đã thử \Drupal::service('renderer')->renderRoot và render() theo nhiều cách. Nó không bao giờ có tất cả bối cảnh. Tôi đã nhận được bộ khung HTML của trang nhưng các khối và như vậy vẫn bị thiếu. Tôi nhận thấy rằng bạn sẽ phải bắt chước toàn bộ yêu cầu Drupal, điều này rất phức tạp và bắt đầu cảm thấy đó là một hướng đi tồi tệ hơn. Chúng tôi đã đi theo con đường tương tự với cách sử dụng file_get_contents() của @johnSmith. Khi các nút được lưu, chúng tôi sử dụng httpClient để thực hiện yêu cầu thứ 2 đối với trang web.Phản hồi đó được lưu trong một trường và được đưa vào API. Cám ơn!!
Điểm:1
lá cờ cn

Chúng tôi đã đi theo con đường tương tự với cách sử dụng file_get_contents() của @johnSmith. Cảm ơn!

TL;DR; Khi các nút được lưu, chúng tôi sử dụng httpClient để thực hiện yêu cầu thứ 2 đối với trang web. Phản hồi đó được lưu trong một trường và được đưa vào API. Cám ơn!!

Chi tiết

  • Một trường mới đã được thêm vào các kiểu nội dung được liên kết. Trường này sẽ được sử dụng để lưu trữ trang HTML được hiển thị.

  • Một mô-đun tùy chỉnh đã được viết. Khi các nút của các loại nội dung được liên kết được tạo hoặc cập nhật, một yêu cầu tiếp theo được thực hiện bằng cách sử dụng httpClient. Yêu cầu này được thực hiện cho trang nút. Phản hồi HTML đó được lưu trong trường mới.

    // Chúng tôi đã lưu tên miền được định cấu hình để thực hiện yêu cầu hiển thị này trong cấu hình của Drupal.

    $config = \Drupal::service('config.factory')->getEditable('myApi.static_server_settings');

    $domain = $config->get('myApi.theme_domain');

    // Yêu cầu trang kết xuất của nút này

    $nid = $node->id();

    $client = \Drupal::httpClient();

    $request = $client->get($domain.'/node/'.$nid);

    $render = (chuỗi) $request->getBody();

  • API của chúng tôi đã được mở rộng để bao gồm trường này.Như một phương án dự phòng, khi API chạy, nếu trường mới trống thì yêu cầu httpClient tương tự tiếp theo sẽ được thực hiện nhanh chóng.

  • Chúng tôi đã xây dựng một quy trình hàng loạt để cập nhật trường 'trang được hiển thị' cho tất cả nội dung. Điều này có thể được chạy nếu chủ đề được cập nhật. Cuối cùng, chúng tôi có thể kích hoạt nó từ nội dung script/gulp/CI xây dựng chủ đề của chúng tôi.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.