anular node.tpl.php en un módulo

8

Creé un módulo que debería poder mostrar el contenido de un determinado tipo de contenido. La visualización es un poco compleja y para poder apagarla y agrupar todo, creé un módulo para esto.

Pero al final solo debería anular el nodo normal.tpl.php con un archivo .tpl.php personalizado. Cuando coloco el archivo en la carpeta de mi plantilla, se recoge y las páginas se muestran como se esperaba, pero no puedo hacer que funcione cuando el archivo está en la carpeta del módulo.

Leí muchas cosas sobre registrar el archivo .tpl y el preproceso, pero nada que combine las piezas que necesito.

Esto es lo que tengo hasta ahora

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';
}
deslumbramiento
fuente
1
Es posible que me llamen así, pero en mi (no tan) humilde opinión, un módulo no debería preocuparse por el aspecto de un nodo cuando se muestra, todo lo que debería importar es pasar esos datos al tema, que luego hace el parte de la pantalla Ahora, si desea que su módulo cree un objeto personalizado que se muestre en un nodo, esa es otra historia, entonces podría crear una plantilla para eso. Pero, si desea hacer un cortocircuito en ese paso, entonces poner su node.tpl.php en el directorio de temas es la única forma 'correcta' de hacerlo.
Jimajamma
Si alguien está buscando hacer esto específicamente en Drupal 6, consulte esta respuesta: stackoverflow.com/a/6153043/1154642
bryanbraun

Respuestas:

3

No está claro en su pregunta si está colocando su plantilla en sites/all/custom/moduleso dentro sites/all/custom/modules/the_name_of_mymodule. Tiene que ser el posterior.

Sin embargo, si usted:

  • Tenga su plantilla en el lugar adecuado.
  • Visité la admin/appearanceruta para forzar una actualización del registro de temas.
  • Despejó todas las cachés después.

... pero aún sin dados, siempre puede especificar en su implementación hook_theme () la theme_pathclave:

<?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 aficionado
fuente
todavía no funciona, ¿necesito el theme_hook_suggestions o debo elegirlo para recoger la plantilla por su cuenta? 'Aplicación' es tipo de contenido, 'Aplicaciones' el nombre del módulo
dazz
Quizás el problema que está teniendo es el nombre de la función del tema node--app. Sería un nombre mejor node_app, y llamaría a la función de tema haciendo theme('node_app', [$vars]);No estoy seguro de que theme('node--app')sea ​​algo que haya visto alguna vez, y estoy casi seguro de que no funcionaría.
barista aficionado
Además, se proporciona la variable $ path para que no tenga que hacer el baile drupal_get_path (). $ path es la ubicación del módulo que está implementando el hook_theme, en este caso el módulo denominado aplicaciones.
barista aficionado
1
el nombre del tema debe ser 'node__app'(subrayado doble) no'node_app'
Junaid
3

Pensé que publicaría la solución que encontré:

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
fuente