Come incorporare una vista in un nodo specifico?


13

Provo a incorporare una vista in un nodo specifico. Ho trovato tutorial per farlo con Drupal 7 e PHP-Templates:

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

Ma cerco un modo in Drupal 8 con i ramoscelli. Ho provato a chiamare la views_embed_view()funzione in hook_node_view()e assegnarla al nodo in modo da poterla stampare nel ramoscello-Template. Ma sembra che questo hook non venga mai chiamato.

Qualche suggerimento / soluzione su come farlo nel modo Drupal 8?

Risposte:


19

Twig Views Embed

Questo modulo consente di incorporare viste con una funzione ramoscello.

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

Il modulo sopra è stato ammortizzato a favore di

Twig Tweak

Il modulo Twig Tweak fornisce un'estensione Twig con alcune utili funzioni e filtri che possono migliorare l'esperienza degli sviluppatori.

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

Puoi trovare view_machine_name qui


@TiMESPLiNTER ti sta solo dando un avvertimento.
No Sssweat

Da quando? Versione?
Vishal Kumar Sahu,

1
@VishalKumarSahu da quando è stata pubblicata la mia risposta, 18 marzo 16. Penso che il modulo funzioni ancora, è solo che non viene più mantenuto o sviluppato ulteriormente.
No Sssweat,

Perfettamente perfetto Funziona benissimo e sto avendo una buona esperienza con esso. Grazie
Vishal Kumar Sahu,

Twig Tweak! Good Module
Harish ST

5

Questo è il modo in cui ha funzionato per me nel sotto-tema Drupal 8 beta 12 di Classy.

Nel file 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);
}  

Ho copiato node.html.twig e circondato i tag articolo (o l'area che desideri sostituire) con un blocco ramoscello. L'ho inserito nella cartella / template / content.

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

    ...

  </article>  
{% endblock replace_area %}

Quindi ho creato un nodo - 2.html.twig (sostituisci 2 con il nodo desiderato) nella cartella / template / content con il seguente codice.

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

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

4

Il primo problema con cui stai combattendo è che le entità renderizzate come i nodi sono ora memorizzate nella cache per impostazione predefinita, quindi hook_node_view () viene chiamato solo una volta dopo che una cache cancella / salva quel nodo.

Tuttavia, questo è abbastanza facile da disabilitare, vedi settings.local.php.

Quindi, mettere l'output di una vista in $ build è abbastanza facile e più o meno funziona come in 7.x. Invece di usare la funzione embed, considera l'utilizzo di $ views = Views :: getView () e quindi $ views-> buildRenderable ()

Due consigli:

  • Rendi disponibile la chiave che usi per $ build come campo aggiuntivo in hook_entity_extra_field_info () , quindi controlla il display se il componente è abilitato (vedi come lo fa user_user_view () . Ciò ti consente di configurare il peso / posizionamento della vista nella UI e anche nasconderlo in determinate modalità di visualizzazione.
  • Se la tua vista ha una pagina, allora è un po 'più complicato, poiché l'output del nodo viene memorizzato nella cache. Devi quindi rendere la chiave della cache consapevole del cercapersone, vedi comment_entity_build_defaults_alter () per un esempio (non una vista, ma questo è l'esempio più vicino che ha il core).

Prima di tutto grazie per questa grande risposta. Bene ho "abilitato" il settings.local.phpe cancellato tutte le cache. Ma il mio hook themename_node_view()in themename.themenon viene ancora chiamato. Hai idea del perché questo potrebbe essere il caso?
TiMESPLiNTER,

1
C'è un frammento in settings.php che devi decommentare (alla fine). per assicurarti che settings.local.php sia caricato, aggiungi PHP non valido che provoca un errore fatale. se il tuo sito non fallisce, il file non viene caricato.
Berdir,

2

Come Berdir ha accennato a View-> buildRenderable è quello che stai cercando, ma per dare un po 'più di contesto in un modulo dovrai fare quanto segue.

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

}

Quindi nel modello di pagina puoi accedervi con

{{ page.content.theme_name_content }}

1
Tutto questo era una sola riga in Drupal 7. Interessante.
WM,

0

Nelle viste, puoi creare un blocco con i tuoi dati rilevanti.

Dopo la creazione del blocco, è possibile assegnare il blocco affinché appaia nell'area di contenuto desiderata (piè di pagina / intestazione / contenuto / ecc.). Assegnalo, quindi fai clic su "configura". Dovresti essere in grado di "Mostra blocco su pagine specifiche". La selezione di "Solo le pagine elencate" e l'aggiunta di / node / your-node-number alla specifica della pagina dovrebbe limitare la visualizzazione / il blocco alla visualizzazione solo con il nodo desiderato.

Saluti!


Grazie per la tua risposta :-). Ma poi devo creare un'area di contenuto per ogni caso. Quindi, se mi piace avere il primo testo, quindi la vista e poi di nuovo il testo. O se mi piace avere prima il testo e poi la vista o prima la vista e poi il testo. Quindi devo creare 3 diverse aree di contenuto che eseguo il rendering nei nodi tematici specifici. Ma l' views_embed_view()approccio è molto più semplice e pulito, immagino.
TiMESPLiNTER,

0

So che hai detto che ti piacerebbe usare i modelli di ramoscelli ma potresti usare il modulo Campo di riferimento di Views per evitare di dover scavare nei template. Offre inoltre il vantaggio di poterlo aggiungere a qualsiasi entità fieldable in modo che gli editor di contenuti possano configurare la vista / output.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.