Làm thế nào để nhúng một khung nhìn trong một nút cụ thể?


13

Tôi cố gắng nhúng một khung nhìn trong một nút cụ thể. Tôi đã tìm thấy các hướng dẫn để làm điều này với Drupal 7 và PHP-Mẫu:

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

Nhưng tôi tìm cách trong Drupal 8 với twig-Template. Tôi đã cố gắng gọi views_embed_view()hàm trong hook_node_view()và gán nó cho nút để tôi có thể in nó ra trong Twig-Template. Nhưng dường như cái móc này không bao giờ được gọi.

Bất kỳ gợi ý / giải pháp nào để làm điều này theo cách 8 của Drupal?

Câu trả lời:


19

Twig Lượt xem nhúng

Mô-đun này cho phép nhúng các khung nhìn với chức năng twig.

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

Các mô-đun trên đã được khấu hao có lợi cho

Twig Tweak

Mô-đun Twig Tweak cung cấp tiện ích mở rộng Twig với một số chức năng và bộ lọc hữu ích có thể cải thiện trải nghiệm của nhà phát triển.

Ví dụ: <dd>{{ drupal_view('view_name', 'view_machine_name') }}</dd>

Bạn có thể tìm thấy view_machine_name ở đây


@TiMESPLiNTER chỉ giúp bạn ngẩng cao đầu.
Không có Sssweat

Kể từ khi? Phiên bản?
Vishal Kumar Sahu

1
@VishalKumarSahu kể từ khi câu trả lời của tôi được đăng, 18/03/2016. Tôi nghĩ rằng mô-đun vẫn hoạt động, chỉ là nó không còn được duy trì hoặc được phát triển thêm nữa.
Không có Sssweat

Hoàn toàn hoàn hảo. Nó hoạt động rất tốt và tôi đang có kinh nghiệm tốt với nó. Cảm ơn
Vishal Kumar Sahu

Twig Tweak! Mô-đun tốt
Harish ST

5

Đây là cách nó hoạt động với tôi trong chủ đề phụ Drupal 8 beta 12 của Classy.

Trong tệp 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);
}  

Tôi đã sao chép node.html.twig và bao quanh các thẻ bài viết (hoặc khu vực bạn muốn thay thế) bằng một khối twig. Tôi đặt cái này trong thư mục / template / content.

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

    ...

  </article>  
{% endblock replace_area %}

Sau đó, tôi đã tạo một nút - 2.html.twig (thay thế 2 bằng nút mong muốn) trong thư mục / template / content bằng mã sau đây.

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

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

4

Vấn đề đầu tiên bạn gặp phải là các thực thể được kết xuất như các nút hiện được lưu trong bộ nhớ cache theo mặc định, do đó hook_node_view () chỉ được gọi một lần sau khi xóa bộ nhớ cache / lưu nút đó.

Tuy nhiên, điều này khá dễ dàng để vô hiệu hóa, xem settings.local.php.

Sau đó, việc đưa đầu ra của một khung nhìn vào $ build khá dễ dàng và ít nhiều hoạt động như trong 7.x. Thay vì sử dụng hàm nhúng, hãy xem xét sử dụng $ Views = Views :: getView () và sau đó $ view-> buildRenderable ()

Hai lời khuyên:

  • Làm cho khóa bạn sử dụng cho $ build có sẵn dưới dạng trường bổ sung trong hook_entity_extra_field_info () , sau đó kiểm tra màn hình nếu thành phần được bật (xem cách user_user_view () thực hiện điều đó. Điều đó cho phép bạn định cấu hình trọng lượng / vị trí của chế độ xem trong UI và cũng ẩn nó trên các chế độ xem nhất định.
  • Nếu chế độ xem của bạn có một trang, thì nó phức tạp hơn một chút, vì đầu ra nút được lưu trữ. Sau đó, bạn cần làm cho khóa bộ nhớ cache của máy nhắn tin, xem comment_entity_build_defaults_alter () để biết ví dụ (không phải là chế độ xem, nhưng đó là ví dụ gần nhất mà lõi có).

Trước hết thx cho câu trả lời tuyệt vời này. Vâng, tôi "kích hoạt" settings.local.phpvà xóa tất cả bộ nhớ cache. Nhưng móc của tôi themename_node_view()themename.themevẫn bị không được gọi. Bạn có biết tại sao điều này có thể là trường hợp?
TiMESPLiNTER 19/12/14

1
Có một đoạn mã trong settings.php mà bạn cần bỏ ghi chú (ở cuối). để đảm bảo rằng settings.local.php được tải, hãy thêm PHP không hợp lệ dẫn đến lỗi nghiêm trọng. nếu trang web của bạn không bị lỗi, tập tin sẽ không được tải.
Berdir

2

Vì Berdir đã ám chỉ View-> buildRenderable là những gì bạn đang tìm kiếm, nhưng để cung cấp thêm một số bối cảnh trong một mô-đun, bạn sẽ cần phải làm như sau.

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

}

Sau đó, trong mẫu trang của bạn, bạn có thể truy cập nó với

{{ page.content.theme_name_content }}

1
Tất cả điều này là một lớp lót duy nhất trong Drupal 7. Thú vị.
WM

0

Trong chế độ xem, bạn có thể tạo một khối với dữ liệu liên quan của mình.

Sau khi tạo khối, bạn có thể chỉ định khối xuất hiện trong khu vực nội dung mong muốn của bạn (chân trang / tiêu đề / nội dung / v.v.). Chỉ định nó, và sau đó nhấp vào "cấu hình". Bạn sẽ có thể "Hiển thị khối trên các trang cụ thể". Việc chọn "Chỉ các trang được liệt kê" và thêm / nút / số nút của bạn vào đặc tả trang sẽ giới hạn chế độ xem / khối đó chỉ xuất hiện với nút mong muốn của bạn.

Chúc mừng!


Thx cho câu trả lời của bạn :-). Nhưng sau đó tôi phải tạo một khu vực nội dung cho từng trường hợp sau đó. Vì vậy, nếu tôi muốn có văn bản đầu tiên, sau đó xem và sau đó lại văn bản. Hoặc nếu tôi muốn có văn bản đầu tiên và sau đó xem hoặc đầu tiên xem và sau đó văn bản. Sau đó, tôi phải tạo 3 vùng nội dung khác nhau mà tôi kết xuất trong temapltes nút cụ thể. Nhưng views_embed_view()cách tiếp cận dễ dàng hơn và sạch sẽ hơn tôi đoán.
TiMESPLiNTER

0

Tôi biết bạn đề cập đến việc bạn muốn sử dụng các mẫu twig nhưng bạn có thể sử dụng mô-đun Khung tham chiếu trường để tránh phải đào sâu trong các mẫu. Cũng mang lại lợi thế là có thể thêm nó vào bất kỳ thực thể có thể điền nào để người chỉnh sửa nội dung có thể định cấu hình chế độ xem / đầu ra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.