Comment rendre un modèle dans Drupal 8

12

J'essaie de rendre un modèle dans Drupal 8. Dans Drupal 7, je créerais un thème avec hook_theme, créerais un répertoire de modèles dans mon module, déposerais le fichier de modèle dedans et je pourrais l'afficher avec theme (). Comment faire l'eqivilent avec Drupal 8? J'ai essayé ce qui suit, mais cela donne des erreurs:

Dans twitter_pull.module

/ **
 * Implémente hook_theme ().
 * /
fonction twitter_pull_theme ($ existant, $ type, $ thème, $ chemin) {
  tableau de retour (
    'twitter_pull_tweet_listing' => tableau (
      'variables' => tableau (
        'description' => tableau (),
      ),
      'template' => 'templates / twitter_pull_tweet_listing',
    ),
  );
}

À l'intérieur de twitter_pull / templates: le twitter_pull_tweet_listing.html.twig

Dans mon bloc:

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

J'obtiens l'erreur suivante dans mes journaux:

Erreur utilisateur: "contenu" est une clé de tableau de rendu non valide dans Drupal \ Core \ Render \ Element :: children () (ligne 89 de C: \ xampp \ htdocs \ drupal \ core \ lib \ Drupal \ Core \ Render \ Element. php).

EDIT: Une autre erreur:

Twig_Error_Loader: impossible de trouver le modèle "modules / custom / twitter_pull / templates / templates / twitter_pull_tweet_listing.html.twig" (examiné dans: C: \ xampp \ htdocs \ drupal). dans Twig_Loader_Filesystem-> findTemplate () (ligne 202 de C: \ xampp \ htdocs \ drupal \ core \ vendor \ twig \ twig \ lib \ Twig \ Loader \ Filesystem.php).

J'imagine que cette erreur se produit parce que je n'utilise pas correctement les espaces de noms et le chargement automatique. Où dois-je mettre mon fichier modèle? Sur la base du message d'erreur, j'ai même essayé de le mettre dans C: \ xampp \ htdocs \ drupal \ templates \ mais cela ne fonctionnait toujours pas.

user1015214
la source
Que contient twitter_pull_tweet_listing.html.twig?
Clive
juste un espace réservé: le texte «ceci est un modèle de brindille»
user1015214
Une raison particulière pour laquelle vous passez un tableau de paramètres comme deuxième argument drupal_render()? Il attend un booléen
Clive
Non, c'était une erreur. J'ai supprimé le deuxième paramètre de drupal_render et j'ai toujours le même problème. J'édite ma question ci-dessus, pour inclure une deuxième erreur que je vois.
user1015214
La templates/templates/partie dans le 2ème message d'erreur me fait penser que vous devriez essayer au 'template' => 'twitter_pull_tweet_listing',lieu de 'template' => 'templates/twitter_pull_tweet_listing',danshook_theme()
Clive

Réponses:

24

En général, dans Drupal 8, vous devez supprimer la ligne de modèle et nommer le modèle de la même manière que votre crochet, en convertissant les traits de soulignement en tirets. Cela a été modifié car les modèles sont le format de sortie par défaut pour la sortie thématique dans D8. Donc dans votre cas, ceci hook_theme():

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

… Pointerait vers un modèle sur templates/twitter-pull-tweet-listing.html.twig. (Cela utilise une syntaxe de tableau courte .)

Enregistrement des modifications pertinentes: https://www.drupal.org/node/2231673

Et aussi, à partir d'un bloc ou d'un contrôleur, veuillez renvoyer un tableau de rendu au lieu d'une chaîne. De cette façon, les résultats peuvent être manipulés par la suite et les données brutes sont toujours accessibles sur toute la ligne. En d'autres termes, évitez d'appeler à drupal_render()partir de votre code autant que possible. Cela s'applique également à Drupal 7: https://www.drupal.org/node/930760#creating

Donc, depuis votre bloc:

return [
  '#theme' => 'twitter_pull_tweet_listing',
  '#description' => 'foo',
  '#attributes' => [],
];
Cottser
la source
1
Bon à savoir c'est intentionnel :)
Clive
Merci d'avoir répondu! Mais pouvez-vous expliquer un peu plus pourquoi je pourrais simplement retourner le tableau en sortie? À un certain moment, le rendu drupal doit être appelé pour l'exécuter, donc si je ne l'appelle pas, qui le fait?
user1015214
Vous pouvez également le faire dans Drupal 7. Je vais essayer de trouver des documents à ajouter à la réponse.
Cottser
1
Un peu retardé mais j'ai ajouté un lien vers drupal.org/node/930760#creating dans la réponse.
Cottser
1
Exactement ce dont j'avais besoin, explication claire aussi! Je vous remercie.
Johan Haest