วิธีฝังมุมมองในโหนดที่ระบุ?


13

ฉันพยายามฝังมุมมองในโหนดที่ระบุ ฉันพบบทเรียนสำหรับการทำเช่นนี้กับ Drupal 7 และ PHP-Templates:

<?php print views_embed_view('view_name'); ?>

แต่ฉันก็มองหาวิธีใน Drupal 8 ที่มี twig-Templates ฉันพยายามเรียกใช้views_embed_view()ฟังก์ชันในhook_node_view()และกำหนดให้โหนดเพื่อให้ฉันสามารถพิมพ์ออกมาในแม่แบบทวิ แต่ดูเหมือนว่าเบ็ดนี้ไม่เคยถูกเรียก

คำแนะนำ / วิธีแก้ปัญหาใดบ้างใน Drupal 8 way?

คำตอบ:


19

ฝังการดู Twig

โมดูลนี้อนุญาตให้ฝังมุมมองด้วยฟังก์ชันทวิก

{{ views_embed_view('view_name', 'view_id') }}

โมดูลข้างต้นถูกคิดค่าเสื่อมราคาในความโปรดปรานของ

Twig Tweak

โมดูล Twig Tweak มอบส่วนขยาย Twig พร้อมฟังก์ชั่นและตัวกรองที่มีประโยชน์ซึ่งสามารถปรับปรุงประสบการณ์ผู้พัฒนาได้

Ex: <dd>{{ drupal_view('view_name', 'view_machine_name') }}</dd>

คุณสามารถหาที่view_machine_name นี่


@TiMESPLiNTER เพียงแค่ให้คุณหัวขึ้น
ไม่มี Sssweat

ตั้งแต่เมื่อไหร่ รุ่น?
Vishal Kumar Sahu

1
@VishalKumarSahu ตั้งแต่คำตอบของฉันถูกโพสต์เมื่อวันที่ 18 มีนาคม 16 ฉันคิดว่าโมดูลยังคงใช้งานได้เป็นเพียงแค่ว่ามันไม่ได้รับการบำรุงรักษาหรือพัฒนาต่อไปอีก
ไม่มี Sssweat

สมบูรณ์แบบสมบูรณ์แบบ มันใช้งานได้ดีและฉันมีประสบการณ์ที่ดีกับมัน ขอบคุณ
Vishal Kumar Sahu

Twig Tweak! Good Module
Harish ST

5

นี่คือวิธีการทำงานสำหรับฉันในธีมย่อยของ Drupal 8 beta 12 ของ Classy

ในไฟล์ your_theme.info.theme

function stjameskidsclub_preprocess_node(&$variables){
  $stuff  = views_embed_view('policy_documents', 'embed_1', 28);
  $variables["my_view"] = \Drupal::service('renderer')->renderRoot($stuff);
}  

ฉันคัดลอก node.html.twig และล้อมรอบแท็กบทความ (หรือพื้นที่ที่คุณต้องการแทนที่) ด้วยบล็อกกิ่ง ฉันวางสิ่งนี้ลงในโฟลเดอร์ / template / content

{% block replace_area %}
  <article{{ attributes.addClass(classes) }}>

    ...

  </article>  
{% endblock replace_area %}

จากนั้นฉันสร้างโหนด - 2.html.twig (แทนที่ 2 ด้วยโหนดที่ต้องการ) ในโฟลเดอร์ / template / content ด้วยรหัสต่อไปนี้

{% extends "node.html.twig" %}

{% block replace_page %}
  {{ my_view }}
{% endblock %}

4

ปัญหาแรกที่คุณต่อสู้คือเอนทิตีที่แสดงผลเช่นโหนดจะถูกแคชตามค่าเริ่มต้นดังนั้น hook_node_view () จะถูกเรียกใช้เพียงครั้งเดียวหลังจากแคชล้าง / บันทึกโหนดนั้น

อย่างไรก็ตามการปิดใช้งานค่อนข้างง่ายดูที่ settings.local.php

จากนั้นการวางเอาต์พุตของมุมมองใน $ build นั้นค่อนข้างง่ายและมากหรือน้อยเช่นใน 7.x แทนที่จะใช้ฟังก์ชันฝังให้พิจารณาใช้$ views = Views :: getView ()จากนั้น$ views-> buildRenderable ()

สองเคล็ดลับ:

  • ทำให้คีย์ที่คุณใช้สำหรับ $ build พร้อมใช้งานเป็นฟิลด์พิเศษในhook_entity_extra_field_info ()จากนั้นตรวจสอบการแสดงผลว่ามีการเปิดใช้งานคอมโพเนนต์หรือไม่ (ดูวิธีที่user_user_view ()ทำซึ่งช่วยให้คุณสามารถกำหนดน้ำหนัก / UI และซ่อนไว้ในบางโหมดการดู
  • หากมุมมองของคุณมีหน้าแสดงว่ามันซับซ้อนกว่านี้เล็กน้อยเนื่องจากเอาต์พุตของโหนดถูกแคช คุณต้องทำให้คีย์แคชทราบถึงเพจเจอร์ดูที่comment_entity_build_defaults_alter ()สำหรับตัวอย่าง (ไม่ใช่มุมมอง แต่นั่นเป็นตัวอย่างที่ใกล้เคียงที่สุดที่แกนมี)

ก่อนอื่นขอบคุณสำหรับคำตอบที่ยอดเยี่ยมนี้ ฉัน "เปิดใช้งาน" settings.local.phpและล้างแคชทั้งหมดแล้ว แต่ขอของเราthemename_node_view()ในthemename.themeยังคงได้รับไม่ได้เรียกว่า คุณมีความคิดใด ๆ ว่าทำไมถึงเป็นเช่นนี้?
TiMESPLiNTER

1
มีตัวอย่างอยู่ใน settings.php ที่คุณต้องไม่แสดงข้อคิดเห็น (ในตอนท้าย) เพื่อให้แน่ใจว่าโหลด settings.local.php แล้วให้เพิ่ม PHP ที่ไม่ถูกต้องซึ่งส่งผลให้เกิดข้อผิดพลาดร้ายแรง หากไซต์ของคุณไม่ล้มเหลวไฟล์จะไม่ถูกโหลด
Berdir

2

ดังที่ Berdir พูดถึงView-> buildRenderableเป็นสิ่งที่คุณกำลังมองหา แต่เพื่อให้บริบทเพิ่มเติมในโมดูลคุณจะต้องทำสิ่งต่อไปนี้

//use core libraries
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;

//use views class
use \Drupal\views\Views;

function hook_node_view(&$build, $node, $display, $view_mode){

 $thisView = Views::getView('view_name');

 $build['arbitrary_render_array_key_here'] = $thisView->buildRenderable('block_1',array($your_arguments));

}

จากนั้นในเทมเพลตหน้าคุณสามารถเข้าถึงได้ด้วย

{{ page.content.theme_name_content }}

1
ทั้งหมดนี้เป็นซับเดี่ยวใน Drupal 7 ที่น่าสนใจ
WM

0

ภายในมุมมองคุณสามารถสร้างบล็อกด้วยข้อมูลที่เกี่ยวข้องของคุณ

หลังจากการสร้างบล็อกคุณสามารถกำหนดให้บล็อกปรากฏในพื้นที่เนื้อหาที่คุณต้องการ (ส่วนท้าย / ส่วนหัว / เนื้อหา / ฯลฯ ) กำหนดจากนั้นคลิก "กำหนดค่า" คุณควรจะสามารถ "แสดงบล็อคในหน้าเว็บเฉพาะ" การเลือก "เฉพาะหน้าที่ระบุไว้ในรายการ" และการเพิ่ม / node / your-node-number ของข้อกำหนดหน้าควร จำกัด การดู / บล็อกนั้นให้ปรากฏเฉพาะกับโหนดที่คุณต้องการ

ไชโย!


ขอบคุณสำหรับคำตอบของคุณ :-) แต่ฉันต้องสร้างพื้นที่เนื้อหาสำหรับแต่ละกรณี ดังนั้นถ้าฉันต้องการมีข้อความแรกมุมมองแล้วข้อความอีกครั้ง หรือถ้าฉันต้องการมีข้อความแรกแล้วดูหรือก่อนดูแล้วข้อความ จากนั้นฉันต้องสร้างพื้นที่เนื้อหาที่แตกต่างกัน 3 แห่งซึ่งฉันสร้างไว้ในโหนดเทมเพลตเฉพาะ แต่views_embed_view()วิธีนี้ง่ายกว่าและสะอาดกว่าฉันเดา
TiMESPLiNTER

0

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.