Cómo renderizar una plantilla en Drupal 8

12

Estoy tratando de representar una plantilla en Drupal 8. En Drupal 7, crearía un tema con hook_theme, crearía un directorio de plantillas en mi módulo, colocaría el archivo de plantilla y podría mostrarlo con theme (). ¿Cómo hago el eqivilent con Drupal 8? Intenté lo siguiente, pero falla:

En twitter_pull.module

/ **
 * Implementa hook_theme ().
 * /
función twitter_pull_theme ($ existente, $ tipo, $ tema, $ ruta) {
  matriz de retorno (
    'twitter_pull_tweet_listing' => array (
      'variables' => array (
        'description' => array (),
      ),
      'template' => 'templates / twitter_pull_tweet_listing',
    ),
  );
}

Dentro de twitter_pull / templates: twitter_pull_tweet_listing.html.twig

Dentro de mi bloque:

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

Me sale el siguiente error en mis registros:

Error de usuario: "contenido" es una clave de matriz de procesamiento no válida en Drupal \ Core \ Render \ Element :: children () (línea 89 de C: \ xampp \ htdocs \ drupal \ core \ lib \ Drupal \ Core \ Render \ Element. php).

EDITAR: Otro error:

Twig_Error_Loader: no se puede encontrar la plantilla "modules / custom / twitter_pull / templates / templates / twitter_pull_tweet_listing.html.twig" (examinado: C: \ xampp \ htdocs \ drupal). en Twig_Loader_Filesystem-> findTemplate () (línea 202 de C: \ xampp \ htdocs \ drupal \ core \ vendor \ twig \ twig \ lib \ Twig \ Loader \ Filesystem.php).

Me imagino que este error está ocurriendo porque no estoy usando espacios de nombres y carga automática correctamente. ¿Dónde pongo mi archivo de plantilla? Basado en el mensaje de error, incluso intenté ponerlo en C: \ xampp \ htdocs \ drupal \ templates \ pero aún así no funcionó.

usuario1015214
fuente
¿Qué hay en twitter_pull_tweet_listing.html.twig?
Clive
solo un marcador de posición: el texto 'esta es una plantilla de ramita'
user1015214
¿Alguna razón particular por la que está pasando una matriz de parámetros como segundo argumento drupal_render()? Se espera un booleano
Clive
No, eso fue un error. Saqué el segundo parámetro de drupal_render y todavía tengo el mismo problema. Estoy editando mi pregunta anterior, para incluir un segundo error que veo.
user1015214
La templates/templates/parte en el segundo mensaje de error que me hace pensar que debe tratar 'template' => 'twitter_pull_tweet_listing',en lugar de 'template' => 'templates/twitter_pull_tweet_listing',enhook_theme()
Clive

Respuestas:

24

En general, en Drupal 8 debe omitir la línea de la plantilla y nombrar la plantilla igual que su gancho, convirtiendo los guiones bajos en guiones. Esto se modificó porque las plantillas son el formato de salida predeterminado para la salida con tema en D8. Entonces en tu caso esto hook_theme():

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

... apuntaría a una plantilla en templates/twitter-pull-tweet-listing.html.twig. (Eso está usando una sintaxis de matriz corta ).

Registro de cambio relevante: https://www.drupal.org/node/2231673

Y también, desde un bloque o controlador, devuelva una matriz de representación en lugar de una cadena. De esa manera, los resultados se pueden manipular después y los datos sin procesar aún son accesibles en el futuro. En otras palabras, evite llamar drupal_render()desde su código siempre que sea posible. Esto también se aplica a Drupal 7: https://www.drupal.org/node/930760#creating

Entonces de tu bloque:

return [
  '#theme' => 'twitter_pull_tweet_listing',
  '#description' => 'foo',
  '#attributes' => [],
];
Cottser
fuente
1
Es bueno saber que es intencional :)
Clive
¡Gracias por la respuesta! Pero, ¿puedes explicar un poco más por qué podría devolver la matriz como salida? En algún momento es necesario llamar a drupal render para ejecutarlo, así que si no lo llamo, ¿quién lo hace?
user1015214
Por cierto, también puedes hacer eso en Drupal 7. Trataré de encontrar algunos documentos para agregar a la respuesta.
Cottser
1
Un poco retrasado pero agregué un enlace a drupal.org/node/930760#creating en la respuesta.
Cottser
1
Exactamente lo que necesitaba, ¡también una explicación clara! Gracias.
Johan Haest