Dans le template.php, comment indiquer à drupal d'utiliser un tpl.php pour des types de contenus ?

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour à tous, ou bonsoir,

J'ai 3 types de contenus utilisant le même node.tpl.php. Plutôt que dupliquer 3 fois le fichier node.tpl.php par type de contenu, je souhaiterai le faire dans le template.php, mais je ne trouve pas comment assigner un type de contenu à un .tpl.php.

C'est possible ?

Merci d'avance et à bientôt.

Heuuu, c'est pas clair.

Au final, tu veux quoi ? un seul fichier node.tpl.php mais un comportement un peu different definie dans template.php

ou

plusieur fichier node.tpl.php, genre node-type1.tpl.php, node-type2.tpl.php, ... ?

Oui, je vois que ce n'est pas clair.

En fait, j'ai 3 types de contenus nommé : 'annuaire_club', 'annuaire_coach', 'annuaire_boutique'. Pour surcharger le fichier node.tpl.php j'ai du écrire :

  • node-annuaire_club.tpl.php
  • node-annuaire_coach.tpl.php
  • node-annuaire_boutique.tpl.php

Ce qui me dérange, c'est que dans ces trois .tpl.php, on retrouve le même code. J'aurai voulu indiquer dans le template.php un truc dans le genre

<?php
switch ($content_type) {
 ...
 case
'annuaire_club' :
 case
'annuaire_coach' :
 case
'annuaire_boutique' : theme('annuaire.tpl.php'); // le fichier générique
}
?>

Un truc dans le genre, mais ça ne marche pas.

<?php
function phptemplate_preprocess_node(&$vars, $hook) {
 
$node = $vars['node'];
  if (
$node->type == "content_type1") {
    
$vars['MaVarSpecifique'] = "content type 1"
  }
  if (
$node->type == "content_type2") {
    
$vars['MaVarSpecifique'] = "content type 2"
  }
}

?>

Puis dans le node.tpl.php

<?php
if ($MaVarSpecifique) {
  print
$MaVarSpecifique;
}
?>

C'est le cas où ta VarSpeficique se place au meme endroit, mais avec diverses valeurs.
Rien ne t'empeche de jouer avec MaVar1, MaVar2, ... et de vérifier ensuite dans le node.tpl.php si la var existe.
Comme ca, un seul node.tpl.php, mais avec du contenu (des variables) differentes en fonction du content type.

ca doit marcher :)

Merci de cette réponse rapide, mais le petit hic est que j'ai une 10zaine de type de contenu, du coup, je ne peux pas utiliser le node.tpl.php, il faut que j'utilise un autre type, d'ou l'idée d'avoir un annuaire.tpl.php...

J'ai pourtant déjà vu ça qq part, mais je n'arrive plus à mettre la main dessus...

arghh... Ca doit être la fatigue, j'ai passé plus de 8h sur un bug aujourd'hui, et il est déjà presque 1h chez moi.

En fait, je souhaiterai assigner dans le fichier template.php (par des preprocess_) des types de contenus à des fichier de type nimporteQuelNomIci.tpl.php plutot que d'avoir le cas standard node-typcontenu.tpl.php.

...

<?php
function phptemplate_preprocess_node(&$vars, $hook) {
 
$node = $vars['node'];
  if (
$node->type == "content_type1") {
    
$vars['template_files'][] = "content-type-1"
  }
  if (
$node->type == "content_type2") {
    
$vars['template_files'][] = "content-type-2"
  }
}

?>

Et la tu peux utiliser content-type-1.tpl.php et content-type-2.tpl.php

c'est ca ?

ca aurait pu, mais ça ne fonctinone pas. Voici le code que j'ai dans le template.php pour cette fonction :

<?php
 
  $node
= $vars['node'];
if (
$node->type == "annuaire_coach") {
    
$vars['annuaire.tpl.php'][] = "annuaire_coach"
  }
?>

Donc, 'annuaire_coach' est bien mon type de contenu actuel, et je voudrais (pour l'exemple) que ce soit le fichier de template annuaire.tpl.php qui soit utilisé

Mais ca ne fonctionne pas... j'ai bien compris ?

non, le $vars['template_files'][], il ne faut pas toucher. il faut le garder tel quel.
(template_files est un tableau contenant la liste des fichiers potentiellement utilisable pour le theme, tu peux faire un print_r($vars['template_files']) pour voir, c'est toujours interressant de savoir ce qu'il y a dedans).

Donc ton code, donnerais :

if ($node->type == "annuaire_coach") {
     $vars['template_files'][] = "annuaire";  // sans le .tpl.php
  }

Penser à faire un clear cache des qu'on touche a ça, ces trucs là sont mis assez fortement en cache.

Ok, ça fonctionne ! Merci beaucoup Haza. Là tu m'as bien aidé, ça fonctionne, il est 1h30, demain la journée sera dur alors je vais dormir.

Si je peux faire qq chose pour te remercier, n'hésite pas... Je me demande comment vous faites pour connaitre tout ça ! En tout cas, encore merci, mon code ne sera que plus propre !

Bonne soirée, W.