Score:2

ฉันเปิดรับคำแนะนำและข้อเสนอแนะใด ๆ และทั้งหมด ฉันซาบซึ้งจริงๆ

ธง cn

ฉันจะโหลดเทมเพลตจากโมดูลที่กำหนดเองในบางหน้าได้อย่างไร

เราจัดเตรียมเนื้อหาของเราผ่านทาง API บางครั้งเราใช้วิธี Views Restful และในบางครั้งใช้ JSONAPI

เราจำเป็นต้องเพิ่มฟิลด์ API บนโหนดที่มีการเรนเดอร์ HTML แบบเต็มของหน้าโหนดนั้นตามธีม (ในทางเทคนิคแล้วฉันแค่ต้องการ ... แต่ฉันจะใช้เอกสารทั้งหมดหากหาได้)

ฉันได้ลองหลายวิธี:

ฉันพยายามใช้บริการเรนเดอร์ มันแสดง html แบบเต็มจากเทมเพลต html.html.twig แต่ไม่มีรายการเช่นบล็อกในหน้า ฉันคิดว่ามันไม่มีบริบททั้งหมดที่ต้องการ
$view_builder = \Drupal::entityTypeManager()->getViewBuilder('โหนด');
$content = $view_builder->view($node);
$ สร้าง = [
  '#type' => 'html',
  'หน้า' => [
    '#type' => 'หน้า',
    '#theme' => 'หน้า',
    '#title' => $node->get("title")->value,
    'เนื้อหา' => $เนื้อหา,
  ]
];
$page = \Drupal::service('renderer')->renderPlain($build);

ในทำนองเดียวกัน ฉันลองใช้ twig_render_template มันแสดง html แบบเต็มในทำนองเดียวกัน แต่รายการเช่นบล็อกในหน้านั้นหายไป
$markup = twig_render_template(drupal_get_path('theme', 'neato') . '/templates/base/html.html.twig', อาร์เรย์(
  'หน้า' => [
    '#type' => 'หน้า',
    '#theme' => 'หน้า',
    '#title' => $node->get("title")->value,
    'เนื้อหา' => $เนื้อหา,
  ]
  // จำเป็นเพื่อป้องกันการแจ้งให้ทราบเมื่อเปิดใช้งานการดีบัก Twig
  'theme_hook_original' => 'ไม่เกี่ยวข้อง',
));
$body = (สตริง) $markup;

ในแนวทางที่แยกจากกัน ฉันพยายามสร้าง 'คำขอย่อย' ด้วยวิธีนี้ ฉันได้รับ 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();

ฉันยังพยายามเลียนแบบ 'bootstrap' ของ drupal แบบเต็ม
$autoloader = ต้องการ '/app/web/autoload.php';
$sub_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();

john Smith avatar
gr flag
เช่นเดียวกับวิธีที่ "ไม่ค่อยมีประสิทธิภาพ" และไม่ใช่ drupal ให้ใช้ file_get_contents บน url ของหน้า ...
john Smith avatar
gr flag
PS: ฉันเพิ่งเจอ `\Drupal::service('renderer')->renderRoot(` ในโค้ดบางส่วนของฉัน บางทีมันอาจจะช่วยได้แทนที่จะใช้ `renderPlain`
4uk4 avatar
cn flag
โดยปกติคุณไม่จำเป็นต้องเรนเดอร์ตัวแปรเลย แต่ถ้าคุณต้องการ ให้ใช้ `\Drupal::service('renderer')->render()` สองวิธีข้างต้นใช้สำหรับกรณีการใช้งานเฉพาะเท่านั้น ไม่ใช่สำหรับการแสดงผลหน้าปกติ
cn flag
เห็นด้วย นี่ไม่ใช่วิธีการแสดงผลหน้าเว็บตามปกติ มันเป็นเคสขอบสำหรับสเป็คของฉัน ฉันลอง \Drupal::service('renderer')->renderRoot และ render() หลายวิธี มันไม่เคยมีบริบททั้งหมด ฉันได้โครงสร้าง HTML ของหน้าแล้ว แต่บล็อกและบล็อกเหล่านั้นยังขาดหายไป ฉันพบว่าคุณจะต้องเลียนแบบคำขอ Drupal แบบเต็ม ซึ่งซับซ้อน และเริ่มรู้สึกว่าเป็นทิศทางที่แย่กว่า เราไปเส้นทางที่คล้ายกันกับ @johnSmith's rec ของการใช้ file_get_contents() เมื่อโหนดถูกบันทึก เราจะใช้ httpClient เพื่อส่งคำขอครั้งที่ 2 ไปยังไซต์การตอบสนองนั้นจะถูกบันทึกไว้ในฟิลด์และรวมอยู่ใน API ขอบคุณ!!
Score:1
ธง cn

เราไปเส้นทางที่คล้ายกันกับ @johnSmith's rec ของการใช้ file_get_contents() ขอบคุณ!

TL;DR; เมื่อโหนดถูกบันทึก เราจะใช้ httpClient เพื่อส่งคำขอครั้งที่ 2 ไปยังไซต์ การตอบสนองนั้นจะถูกบันทึกไว้ในฟิลด์และรวมอยู่ใน API ขอบคุณ!!

รายละเอียด

  • มีการเพิ่มฟิลด์ใหม่ให้กับประเภทเนื้อหาที่เกี่ยวข้อง ฟิลด์นี้จะใช้เพื่อจัดเก็บ HTML ของหน้าที่แสดงผล

  • มีการเขียนโมดูลแบบกำหนดเอง เมื่อมีการสร้างหรืออัปเดตโหนดของประเภทเนื้อหาที่เกี่ยวข้อง คำขอที่ตามมาจะถูกสร้างโดยใช้ httpClient คำขอนี้ส่งไปยังหน้าโหนด การตอบสนอง HTML นั้นจะถูกบันทึกไว้ในฟิลด์ใหม่

    // เราได้บันทึกชื่อโดเมนที่กำหนดค่าไว้ซึ่งจะทำการร้องขอการเรนเดอร์นี้ในการกำหนดค่าของ Drupal

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

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

    // ขอหน้าแสดงผลของโหนดนี้

    $nid = $node->id();

    $client = \Drupal::httpClient();

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

    $render = (สตริง) $request->getBody();

  • API ของเราได้รับการขยายเพื่อรวมฟิลด์นี้เป็นทางเลือก เมื่อ API ทำงาน หากฟิลด์ใหม่ว่างเปล่า คำขอ httpClient เดียวกันที่ตามมาจะเกิดขึ้นในทันที

  • เราสร้างกระบวนการแบบกลุ่มที่อัปเดตฟิลด์ 'หน้าที่แสดงผล' สำหรับเนื้อหาทั้งหมด สามารถใช้งานได้หากมีการอัพเดตธีม ในที่สุดเราอาจเรียกใช้จากสคริปต์สร้างธีม/gulp/CI

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา