J'essaie de rendre un modèle dans Drupal 8. Dans Drupal 7, je créerais un thème avec hook_theme, ferais un répertoire de modèles dans mon module, déposerais le fichier de modèle dans et je pourrais l'afficher avec theme (). Comment puis-je faire l'eqivilent avec Drupal 8? J'ai essayé ce qui suit, mais il se trompe:
Dans Twitter_pull.module
/** * Implémente la fonction hook_theme (). */ Twitter_pull_theme ($ existant, $ type, $ thème, $ chemin d'accès) { return array ( 'Twitter_pull_Tweet_listing' => array ( 'variables' => array ( 'description' => array (), ), 'template' => 'templates/Twitter_pull_Tweet_listing', ), ); }
À l'intérieur de Twitter_pull/templates: 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)); imprime $ output;
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 n'a toujours pas fonctionné.
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 hook, 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 en D8. Dans votre cas, cette 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 à templates/Twitter-pull-Tweet-listing.html.twig
. (Cela utilise syntaxe de tableau court .)
Enregistrement des modifications pertinentes: https://www.drupal.org/node/223167
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' => [],
];