substituir node.tpl.php em um módulo

8

Eu criei um módulo que deve ser capaz de exibir o conteúdo de um determinado tipo de conteúdo. A exibição é meio complexa e para poder desligá-lo e agrupar tudo, criei um módulo para isso.

Mas no final, ele deve substituir o node.tpl.php normal por um arquivo .tpl.php personalizado. Quando coloco o arquivo na minha pasta de modelo, ele é selecionado e as páginas são exibidas conforme o esperado, mas não consigo fazê-lo funcionar quando o arquivo está na pasta do módulo.

Eu li muitas coisas sobre regsiter o arquivo .tpl e o pré-processo, mas nada que combine as peças necessárias.

Isto é o que eu tenho até agora

function apps_theme($existing, $type, $theme, $path) {
    $items = array(
        'node--app' => array(
            'template' =>  drupal_get_path('module', 'app') . '/node--app',
            'variables' => array('node' => (object)array())
        )
    );
    return $items;
}

function apps_preprocess_node(&$vars) {
    $variables['theme_hook_suggestions'][] = 'node__app';
}
deslumbrar
fonte
11
Eu posso ser chamado a isso, mas, na minha (não tão) humilde opinião, um módulo não deve se importar com a aparência de um nó quando exibido, tudo o que importa é passar esses dados para o tema, o que então faz o porção de exibição. Agora, se você deseja que seu módulo crie um objeto personalizado que é exibido em um nó, isso é outra história, então você pode criar um modelo para isso. Mas, se você deseja dar um curto-circuito nessa etapa, colocar o node.tpl.php no diretório do tema é a única maneira 'certa' de fazê-lo.
Jimajamma
Se alguém está olhando para fazer isso especificamente no Drupal 6, veja esta resposta: stackoverflow.com/a/6153043/1154642
bryanbraun

Respostas:

3

Não está claro na sua pergunta se você está colocando seu modelo dentro sites/all/custom/modulesou dentro sites/all/custom/modules/the_name_of_mymodule. Precisa ser o mais tarde.

No entanto, se você:

  • Coloque seu modelo no local apropriado.
  • Visitei o admin/appearancecaminho para forçar uma atualização do registro de tema.
  • Limpou todos os caches posteriormente.

... mas ainda sem dados, você sempre pode especificar em sua implementação hook_theme () a theme_pathchave:

<?php
function apps_theme($existing, $type, $theme, $path) {
    $items = array(
        'node_app' => array(
            // Don't specify the path in the template name.
            // Unless you have your template inside a directory within this module.
            'template' =>  'node--app',
            'variables' => array('node' => (object)array()),
            // If you want to put the tpl in another location, you can use this key.
            'theme path' => drupal_get_path('module', 'another_module'),
        ),
    );
    return $items;
}
barista amador
fonte
ainda não funciona, preciso do theme_hook_suggestions ou devo buscá-lo por conta própria? 'App' é o tipo de conteúdo, 'Apps' é o nome do módulo
dazz 13/12/11
Talvez o problema que você está tendo seja o nome da função do tema node--app. Um nome melhor seria node_app, e você chamaria a função de tema fazendo theme('node_app', [$vars]);Não sei se theme('node--app')é algo que já vi e quase certo de que não funcionaria.
Barista amador
Além disso, a variável $ path é fornecida para que você não precise executar a dança drupal_get_path (). $ path é o local do módulo que está implementando o hook_theme; nesse caso, o módulo denominado apps.
barista amador
11
o nome do tema precisa ser 'node__app'(sublinhado duplo) não #'node_app'
Junaid 19/02
3

Pensei em publicar a solução que encontrei:

function MYMODULE_theme($existing, $type, $theme, $path) {
  return array(
    'node__NODETYPE' => array(
      'render element' => 'content',
      'base hook' => 'node',
      'template' => 'node--NODETYPE',
      'path' => drupal_get_path('module', 'MYMODULE') . '/templates',
    ),
  );
}
Aronanda
fonte