Bagaimana cara menanamkan tampilan dalam simpul tertentu?

13

Saya mencoba menyematkan tampilan dalam node tertentu. Saya menemukan tutorial untuk melakukan ini dengan Drupal 7 dan PHP-Templates:

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

Tapi saya mencari cara di Drupal 8 dengan ranting-Template. Saya mencoba memanggil views_embed_view()fungsi di hook_node_view()dan menetapkannya ke node sehingga saya bisa mencetaknya di ranting-Templat. Tetapi tampaknya kait ini tidak pernah dipanggil.

Adakah petunjuk / solusi bagaimana melakukan ini dengan cara Drupal 8?

TiMESPLiNTER
sumber

Jawaban:

19

Embed Tampilan Ranting

Modul ini memungkinkan untuk menanamkan tampilan dengan fungsi ranting.

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

Modul di atas disusutkan untuk mendukung

Ranting Tweak

Modul Twig Tweak menyediakan ekstensi Twig dengan beberapa fungsi dan filter bermanfaat yang dapat meningkatkan pengalaman pengembang.

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

Anda dapat menemukannya di view_machine_name sini

Tidak ada Sssweat
sumber
@TiMESPLiNTER hanya memberi Anda kepala.
No Sssweat
Sejak kapan? Versi: kapan?
Vishal Kumar Sahu
1
@VishalKumarSahu sejak jawaban saya diposting, 18 Maret 16. Saya pikir modul ini masih berfungsi, hanya saja tidak lagi dipertahankan atau dikembangkan lebih lanjut.
No Sssweat
Sangat sempurna. Ini bekerja dengan baik dan saya memiliki pengalaman yang baik dengannya. Terima kasih
Vishal Kumar Sahu
Ranting Tweak! Good Module
Harish ST
5

Ini adalah cara kerjanya untuk saya di sub-tema Drupal 8 beta 12 Classy.

Dalam file your_theme.info.theme Anda

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

Saya menyalin node.html.twig dan mengelilingi tag artikel (atau area yang ingin Anda ganti) dengan ranting blok. Saya menempatkan ini di folder / templat / konten.

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

    ...

  </article>  
{% endblock replace_area %}

Kemudian saya membuat simpul - 2.html.twig (ganti 2 dengan simpul yang diinginkan) di folder / template / content dengan kode berikut.

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

{% block replace_page %}
  {{ my_view }}
{% endblock %}
George
sumber
4

Masalah pertama yang Anda hadapi adalah entitas yang dirender seperti node sekarang di-cache secara default, jadi hook_node_view () hanya dipanggil satu kali setelah cache membersihkan / menyimpan simpul itu.

Namun, ini cukup mudah untuk dinonaktifkan, lihat setting.local.php.

Kemudian, menempatkan output view dalam $ build cukup mudah dan lebih atau kurang berfungsi seperti pada 7.x. Alih-alih menggunakan fungsi sematan, pertimbangkan untuk menggunakan $ views = Views :: getView () dan kemudian $ views-> buildRenderable ()

Dua tips:

  • Jadikan kunci yang Anda gunakan untuk $ build tersedia sebagai bidang tambahan di hook_entity_extra_field_info () , lalu periksa tampilan jika komponen diaktifkan (lihat bagaimana pengguna_user_view () melakukannya. Itu memungkinkan Anda untuk mengonfigurasi bobot / penempatan tampilan di UI dan juga menyembunyikannya pada mode tampilan tertentu.
  • Jika tampilan Anda memiliki halaman, maka itu sedikit lebih rumit, karena output node di-cache. Anda perlu membuat kunci cache mengetahui pager kemudian, lihat comment_entity_build_defaults_alter () untuk contoh (bukan tampilan, tapi itu adalah contoh terdekat yang dimiliki core).
Berdir
sumber
Pertama-tama terima kasih untuk jawaban yang bagus ini. Yah aku "mengaktifkan" settings.local.phpdan membersihkan semua cache. Tapi kail saya themename_node_view()di themename.thememasih akan tidak disebut. Apakah Anda tahu mengapa ini bisa terjadi?
TiMESPLiNTER
1
Ada cuplikan di settings.php yang harus Anda batalkan komentarnya (pada akhirnya). untuk memastikan bahwa settings.local.php dimuat, tambahkan PHP tidak valid yang menghasilkan kesalahan fatal. jika situs Anda tidak gagal, file tidak dimuat.
Berdir
2

Ketika Berdir menyinggung View-> buildRenderable adalah apa yang Anda cari, tetapi untuk memberikan lebih banyak konteks dalam modul Anda harus melakukan hal berikut.

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

}

Kemudian dalam templat halaman Anda, Anda dapat mengaksesnya

{{ page.content.theme_name_content }}
ummdorian
sumber
1
Semua ini adalah satu liner di Drupal 7. Menarik.
WM
0

Dalam tampilan, Anda dapat membuat blok dengan data yang relevan.

Setelah pembuatan blok, Anda dapat menetapkan blok untuk muncul di area konten yang Anda inginkan (footer / header / konten / dll). Tetapkan, lalu klik "konfigurasikan". Anda harus dapat "Tampilkan blok pada halaman tertentu". Memilih "Hanya halaman yang terdaftar" dan menambahkan / node / your-node-number ke spesifikasi halaman harus membatasi bahwa tampilan / blok hanya muncul dengan node yang Anda inginkan.

Bersulang!

Luke Rehmann
sumber
Terima kasih atas jawaban Anda :-). Tapi kemudian saya harus membuat area konten untuk setiap kasus itu. Jadi jika saya ingin memiliki teks pertama, maka lihat dan kemudian lagi teks. Atau jika saya ingin memiliki teks pertama dan kemudian tampilan atau tampilan pertama dan kemudian teks. Kemudian saya harus membuat 3 area konten yang berbeda yang saya render dalam node spesifik temapltes. Tapi views_embed_view()pendekatannya jauh lebih mudah dan lebih bersih saya kira.
TiMESPLiNTER
0

Saya tahu Anda menyebutkan Anda ingin menggunakan templat ranting tetapi Anda bisa menggunakan modul Bidang Referensi Tampilan untuk menghindari keharusan menggali di dalam templat. Juga memberikan keuntungan karena dapat menambahkannya ke entitas yang dapat bidang sehingga editor konten dapat mengonfigurasi tampilan / output.

tukang ojek
sumber