remplacer node.tpl.php dans un module

8

J'ai créé un module qui devrait pouvoir afficher le contenu d'un certain type de contenu. L'affichage est un peu complexe et pour pouvoir l'éteindre et tout regrouper j'ai créé un module pour ça.

Mais à la fin, il devrait simplement remplacer le node.tpl.php normal par un fichier .tpl.php personnalisé. Lorsque je mets le fichier dans mon dossier de modèles, il est récupéré et les pages s'affichent comme prévu, mais je ne peux pas le faire fonctionner lorsque le fichier est dans le dossier du module.

J'ai lu beaucoup de choses sur regsiter le fichier .tpl et le prétraitement mais rien qui combine les pièces dont j'ai besoin.

C'est ce que j'ai jusqu'à présent

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';
}
éblouir
la source
1
Je peux être appelé à ce sujet, mais à mon humble avis (pas si), un module ne devrait pas se soucier de l'apparence d'un nœud lorsqu'il est affiché, il ne doit se soucier que de transmettre ces données au thème, qui fait ensuite la partie d'affichage. Maintenant, si vous vouliez que votre module crée un objet personnalisé qui est affiché dans un nœud, c'est une autre histoire, alors vous pourriez créer un modèle pour cela. Mais, si vous voulez court-circuiter cette étape, mettre votre node.tpl.php dans le répertoire du thème est la seule 'bonne' façon de le faire.
Jimajamma
Si quelqu'un cherche à le faire spécifiquement dans Drupal 6, consultez cette réponse: stackoverflow.com/a/6153043/1154642
bryanbraun

Réponses:

3

Il n'est pas clair dans votre question si vous placez votre modèle dans sites/all/custom/modulesou dans sites/all/custom/modules/the_name_of_mymodule. Ce doit être le plus tard.

Cependant, si vous:

  • Ayez votre modèle au bon endroit.
  • Visité le admin/appearancechemin pour forcer une actualisation du registre de thème.
  • Après avoir effacé toutes les caches.

... mais toujours pas de dés, vous pouvez toujours spécifier dans votre implémentation hook_theme () la theme_pathclé:

<?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 amateur
la source
ne fonctionne toujours pas, ai-je besoin de theme_hook_suggestions ou devrais-je le ramasser seul? 'App' est le type de contenu, 'Apps' le nom du module
dazz
Le problème que vous rencontrez est peut-être le nom de la fonction de thème node--app. Un meilleur nom serait node_app, et vous appelleriez la fonction de thème en faisant theme('node_app', [$vars]);Je ne suis pas sûr que theme('node--app')c'est quelque chose que j'ai jamais vu, et presque sûr que cela ne fonctionnerait pas.
barista amateur
De plus, la variable $ path est fournie pour que vous n'ayez pas à faire la danse drupal_get_path (). $ path est l'emplacement du module qui implémente le hook_theme, dans ce cas le module nommé apps.
barista amateur
1
le nom du thème ne doit pas être 'node__app'(double soulignement)'node_app'
Junaid
3

J'ai pensé publier la solution que j'ai trouvée:

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
la source