Come eseguire il rendering di un modello in Drupal 8


12

Sto provando a eseguire il rendering di un modello in Drupal 8. In Drupal 7, creerei un tema con hook_theme, creerei una directory di modelli nel mio modulo, lascerei cadere il file modello e potrei visualizzarlo con theme (). Come faccio l'eqivilent con Drupal 8? Ho provato quanto segue, ma si verificano errori:

In twitter_pull.module

/ **
 * Implementa hook_theme ().
 * /
funzione twitter_pull_theme ($ esistente, $ tipo, $ tema, $ percorso) {
  matrice di ritorno (
    'twitter_pull_tweet_listing' => array (
      'variabili' => array (
        'description' => array (),
      ),
      'template' => 'templates / twitter_pull_tweet_listing',
    ),
  );
}

All'interno di twitter_pull / modelli: il twitter_pull_tweet_listing.html.twig

Nel mio blocco:

$ tweet_template = array ('# theme' => 'twitter_pull_tweet_listing', '#attributes' => array ('params' => $ params));
$ output = drupal_render ($ tweet_template, array ('params' => $ params));
stampa $ output;

Ricevo il seguente errore nei miei registri:

Errore utente: "contenuto" è una chiave dell'array di rendering non valida in Drupal \ Core \ Render \ Element :: children () (riga 89 di C: \ xampp \ htdocs \ drupal \ core \ lib \ Drupal \ Core \ Render \ Element. php).

EDIT: un altro errore:

Twig_Error_Loader: impossibile trovare il modello "moduli / personalizzato / twitter_pull / modelli / modelli / twitter_pull_tweet_listing.html.twig" (esaminato in: C: \ xampp \ htdocs \ drupal). in Twig_Loader_Filesystem-> findTemplate () (riga 202 di C: \ xampp \ htdocs \ drupal \ core \ vendor \ twig \ twig \ lib \ Twig \ Loader \ Filesystem.php).

Immagino che questo errore stia accadendo perché non sto usando gli spazi dei nomi e il caricamento automatico non è corretto. Dove metto il mio file modello? Sulla base del messaggio di errore, ho persino provato a inserirlo in C: \ xampp \ htdocs \ drupal \ templates \ ma non ha ancora funzionato.


Cosa c'è in twitter_pull_tweet_listing.html.twig?
Clive

solo un segnaposto: il testo 'questo è un modello di ramoscello'
user1015214

Qualche motivo particolare per cui stai passando un array di parametri come secondo argomento drupal_render()? Si aspetta un booleano
Clive

No, è stato un errore. Ho eliminato il secondo parametro di drupal_render e ho ancora lo stesso problema. Sto modificando la mia domanda sopra, per includere un secondo errore che vedo.
user1015214

La templates/templates/parte nel secondo messaggio di errore mi fa pensare che dovresti provare 'template' => 'twitter_pull_tweet_listing',invece di 'template' => 'templates/twitter_pull_tweet_listing',inhook_theme()
Clive

Risposte:


24

In generale in Drupal 8 dovresti lasciare la linea del modello e nominare il modello come il tuo hook, convertendo i trattini bassi in trattini. Ciò è stato modificato perché i modelli sono il formato di output predefinito per l'output tematico in D8. Quindi nel tuo caso questo hook_theme():

/**
 *  Implements hook_theme().
 */
function twitter_pull_theme($existing, $type, $theme, $path) {
  return [
    'twitter_pull_tweet_listing' => [
      'variables' => [
        'description' => [],
      ],
    ],
  ];
}

... indicherebbe un modello in templates/twitter-pull-tweet-listing.html.twig. (Sta usando una sintassi di array breve .)

Record delle modifiche rilevanti: https://www.drupal.org/node/2231673

Inoltre, da un blocco o controller, si prega di restituire un array di rendering anziché una stringa. In questo modo i risultati possono essere manipolati in seguito e i dati grezzi sono ancora accessibili lungo la linea. In altre parole, evita di chiamare drupal_render()dal tuo codice ogni volta che è possibile. Questo vale anche per Drupal 7: https://www.drupal.org/node/930760#creating

Quindi dal tuo blocco:

return [
  '#theme' => 'twitter_pull_tweet_listing',
  '#description' => 'foo',
  '#attributes' => [],
];

1
Buono a sapersi, è intenzionale :)
Clive

Grazie per la risposta! Ma puoi spiegare un po 'di più perché potrei semplicemente restituire l'array come output? A un certo punto il rendering drupal deve essere chiamato per eseguirlo, quindi se non lo chiamo, chi lo fa?
user1015214

A proposito, puoi farlo anche in Drupal 7. Proverò a trovare alcuni documenti da aggiungere alla risposta.
Cottser,

1
Un po 'in ritardo, ma ho aggiunto un link a drupal.org/node/930760#creating nella risposta.
Cottser,

1
Esattamente quello di cui avevo bisogno, anche un chiaro espianto! Grazie.
Johan Haest,
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.