Como renderizar um modelo no Drupal 8

12

Estou tentando renderizar um modelo no Drupal 8. No Drupal 7, eu criaria um tema com hook_theme, criaria um diretório de modelos no meu módulo, soltaria o arquivo de modelo e eu poderia exibi-lo com theme (). Como eu faço o eqivilent com o Drupal 8? Eu tentei o seguinte, mas ele errou:

No twitter_pull.module

/ **
 * Implementa hook_theme ().
 * /
função twitter_pull_theme ($ existente, $ tipo, $ tema, $ caminho) {
  matriz de retorno (
    'twitter_pull_tweet_listing' => matriz (
      'variable' => array (
        'description' => array (),
      ),
      'template' => 'templates / twitter_pull_tweet_listing',
    ),
  );
}

Por dentro twitter_pull / templates: the twitter_pull_tweet_listing.html.twig

Dentro do meu bloco:

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

Eu recebo o seguinte erro nos meus logs:

Erro do usuário: "content" é uma chave de matriz de renderização inválida em Drupal \ Core \ Render \ Element :: children () (linha 89 de C: \ xampp \ htdocs \ drupal \ core \ lib \ Drupal \ Core \ Render \ Element. php).

EDIT: Outro erro:

Twig_Error_Loader: Não foi possível encontrar o modelo "modules / custom / twitter_pull / templates / templates / twitter_pull_tweet_listing.html.twig" (olhou para: C: \ xampp \ htdocs \ drupal). em Twig_Loader_Filesystem-> findTemplate () (linha 202 de C: \ xampp \ htdocs \ drupal \ core \ vendedor \ twig \ twig \ lib \ Twig \ Loader \ Filesystem.php).

Imagino que esse erro esteja ocorrendo porque não estou usando espaços para nome e carregamento automático corretamente. Onde coloco meu arquivo de modelo? Com base na mensagem de erro, tentei colocá-lo em C: \ xampp \ htdocs \ drupal \ templates \, mas ainda não funcionou.

user1015214
fonte
O que há no twitter_pull_tweet_listing.html.twig?
Clive
apenas um espaço reservado: o texto 'este é um modelo de galho' #
user1015214 07/11
Algum motivo específico para o qual você está passando uma matriz de parâmetros como o segundo argumento drupal_render()? Está esperando um booleano
Clive
Não, isso foi um erro. Tirei o segundo parâmetro do drupal_render e ainda tenho o mesmo problema. Estou editando minha pergunta acima, para incluir um segundo erro que vejo.
precisa saber é o seguinte
A templates/templates/parte da 2ª mensagem de erro me faz pensar que você deveria tentar em 'template' => 'twitter_pull_tweet_listing',vez de 'template' => 'templates/twitter_pull_tweet_listing',emhook_theme()
Clive

Respostas:

24

Em geral, no Drupal 8, você deve deixar de fora a linha do modelo e nomeá-lo da mesma forma que o seu gancho, convertendo os sublinhados em traços. Isso foi alterado porque os modelos são o formato de saída padrão para saída utilizável no D8. Então, no seu caso, isso hook_theme():

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

… Apontaria para um modelo em templates/twitter-pull-tweet-listing.html.twig. (Isso está usando sintaxe de matriz curta .)

Registro de alteração relevante: https://www.drupal.org/node/2231673

E também, de um bloco ou controlador, retorne uma matriz de renderização em vez de uma string. Dessa forma, os resultados podem ser manipulados posteriormente e os dados brutos ainda estão acessíveis na linha. Em outras palavras, evite ligar drupal_render()do seu código sempre que possível. Isso também se aplica ao Drupal 7: https://www.drupal.org/node/930760#creating

Então, do seu bloco:

return [
  '#theme' => 'twitter_pull_tweet_listing',
  '#description' => 'foo',
  '#attributes' => [],
];
Cottser
fonte
1
É bom saber que é intencional :)
Clive
Obrigado pela resposta! Mas você pode explicar um pouco mais por que eu poderia retornar a matriz como saída? Em algum momento, a renderização drupal precisa ser chamada para executá-la; portanto, se eu não ligar, quem o fará?
user1015214
Você também pode fazer isso no Drupal 7. Vou tentar encontrar alguns documentos para adicionar à resposta.
Cottser
1
Um pouco atrasado, mas adicionei um link para drupal.org/node/930760#creating na resposta.
Cottser
1
Exatamente o que eu precisava, também explante claro! Obrigado.
Johan Haest