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.
drupal_render()
? Il attend un booléentemplates/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()
Réponses:
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()
:… 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#creatingDonc, depuis votre bloc:
la source