Bir görünümü belirli bir düğüme nasıl yerleştirebilirim?


13

Bir görünümü belirli bir düğüme gömmeye çalışıyorum. Drupal 7 ve PHP-Templates ile bunu yapmak için öğreticiler buldum:

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

Ama dal Şablonları ile Drupal 8'de bir yol arıyorum. Ben dal-Şablon yazdırmak böylece views_embed_view()işlevini çağırmak ve hook_node_view()düğüme atamak için çalıştı . Ama öyle görünüyor ki bu kanca asla çağrılmaz.

Herhangi bir ipucu / çözüm nasıl Drupal 8 şekilde yapmak için?

Yanıtlar:


19

Dal Görünümleri Göm

Bu modül, bir dal fonksiyonu ile görünümlerin gömülmesine izin verir.

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

Yukarıdaki modül amortismana tabi tutuldu

Dal Tweak

Twig Tweak modülü, geliştirici deneyimini geliştirebilecek bazı yararlı işlevlere ve filtrelere sahip bir Twig uzantısı sağlar.

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

Burada bulabilirsinview_machine_name


@TiMESPLiNTER sadece size kulak veriyor.
— Hayır Sssweat

Ne zamandan beri? Sürüm?
— Vishal Kumar Sahu

1
@VishalKumarSahu Cevabımın yayınlanmasından bu yana, 18 Mar '16. Bence modül hala çalışıyor, sadece artık muhafaza edilmiyor veya daha fazla geliştirilmiyor.
— Hayır Sssweat

Mükemmel mükemmel. Harika çalışıyor ve onunla iyi bir deneyim yaşıyorum. Teşekkürler
— Vishal Kumar Sahu

Dal Tweak! Good Module
— Harish ST

5

Classy'nin Drupal 8 beta 12 alt temasında bu benim için çalıştı.

Your_theme.info.theme dosyasında

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 dosyasını kopyaladım ve makale etiketlerini (veya değiştirmek istediğiniz alanı) bir dal bloğu ile çevreledim. Bunu / template / content klasörüne yerleştirdim.

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

    ...

  </article>  
{% endblock replace_area %}

Sonra / template / content klasöründe aşağıdaki kodla bir düğüm - 2.html.twig (2 yerine istediğiniz düğüm ile) oluşturdum.

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

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

4

Dövüştüğünüz ilk sorun, düğümler gibi oluşturulmuş varlıkların artık varsayılan olarak önbelleğe alınmasıdır, bu nedenle hook_node_view (), bu düğümü temizledikten / kaydettikten sonra yalnızca bir kez çağrılır.

Ancak, devre dışı bırakılması oldukça kolaydır, bkz. Settings.local.php.

Daha sonra, bir görünümün çıktısını $ build'e koymak oldukça kolaydır ve 7.x'teki gibi az çok çalışır. Gömme işlevini kullanmak yerine, $ views = Views :: getView () ve ardından $ views-> buildRenderable () yöntemini kullanın.

İki ipucu:

  • $ Build için kullandığınız anahtarı hook_entity_extra_field_info () ' da fazladan bir alan olarak kullanılabilir hale getirin , ardından bileşenin etkin olup olmadığını görüntülemek için ekranı kontrol edin ( user_user_view () yönteminin bunu nasıl yaptığına bakın . Arayüz ve ayrıca belirli görünüm modlarında gizleyin.
  • Görünümünüzde bir sayfa varsa, düğüm çıkışı önbelleğe alındığından sayfa biraz daha karmaşıktır. Önbellek anahtarını çağrı cihazından haberdar etmelisiniz, bir örnek için comment_entity_build_defaults_alter () işlevine bakın ( görünüm değil, ancak çekirdeğin sahip olduğu en yakın örnek).

Her şeyden önce bu harika cevap için teşekkürler. Peki "etkin" settings.local.phpve tüm önbellekleri temizledi. Ama benim kanca themename_node_view()içinde themename.themehala aramadı alır. Bunun neden böyle olabileceğine dair bir fikrin var mı?
— TiMESPLiNTER

1
Settings.php dosyasında (sonunda) açmanız gereken bir pasaj vardır. settings.local.php dosyasının yüklendiğinden emin olmak için, önemli bir hataya neden olan geçersiz PHP ekleyin. siteniz başarısız olmazsa dosya yüklenmez.
— Berdir

2

Berdir, View-> buildRenderable için aradığınız şeydir, ancak bir modülde biraz daha bağlam vermek için aşağıdakileri yapmanız gerekir.

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

}

Ardından sayfa şablonunuzda

{{ page.content.theme_name_content }}

1
Tüm bunlar Drupal 7'de tek bir astardı. İlginç.
— WM

0

Görünümler içinde, ilgili verilerinizle bir blok oluşturabilirsiniz.

Blok oluşturduktan sonra, bloğu istediğiniz içerik alanında (altbilgi / başlık / içerik / vb.) Görünecek şekilde atayabilirsiniz. Atayın ve ardından "yapılandır" ı tıklayın. "Belirli sayfalarda blok gösterebilmeniz" gerekir. "Yalnızca listelenen sayfalar" ı seçmek ve sayfa özelliklerine / düğüm / düğüm numaranızı eklemek, bu görünümü / bloğu yalnızca istediğiniz düğümle görünecek şekilde sınırlamalıdır.

Şerefe!


Cevabınız için teşekkürler :-). Ama sonra her vaka için bir içerik alanı oluşturmak zorundayım. Bu yüzden ilk metne sahip olmak istersem, o zaman görünüm ve sonra tekrar metin. Veya ilk metin ve sonra görünüm veya önce görünüm ve sonra metin olmasını isterseniz. Daha sonra belirli düğüm şablonlarında oluşturduğum 3 farklı içerik alanı oluşturmam gerekiyor. Ama views_embed_view()yaklaşım sanırım çok daha kolay ve daha temiz.
— TiMESPLiNTER

0

Dal şablonlarını kullanmak istediğinizi belirttiğinizi biliyorum, ancak şablonlarda gezinmek zorunda kalmamak için Görünüm Referans Alanı modülünü kullanabilirsiniz. Ayrıca, içerik düzenleyicilerinin görünümü / çıktıyı yapılandırabilmesi için onu herhangi bir çalışılabilir öğeye ekleyebilme avantajı sağlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.