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.