[RESOLU]Image header dependant des sections

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.

J'ai une question concernant toujours l'affichage d'image dans mon header.
J'ai différents type de contenus (article, page, verbiages,...), et différentes sections (visiter, connaître, vivre...). j'aimerais que dans chaque section l'image de mon header soit différente sachant que toutes ces sections utiliserons les mêmes type de contenu. Exemple:
--> dans ma home mon image de header est le Vatican (c'est un exemple lol)
--> dans ma section visiter j'aimerais que ça soit l'image des châteaux de la Loire
--> dans ma section connaître autre chose...et ainsi de suite.

Comment dois-je procéder? Merci

Version de Drupal : 

L'avantage de Drupal (et le piège également) est que plusieurs solutions existent pour un seul est même problème. A toi de choisir la solution la plus adaptée à la situation et à tes connaissances.

En voici une parmis d'autre.

Dans le document de thème flow (http://drupal.org/files/theme_flow_6_0.pdf) tu verras la liste des functions de preprocess qui sont appellées à chaque fois que la fonction theme est appellée.

Ces fonctions de preprocess définissent les variables qui sont disponibles dans ton template. L'idée est donc de définir une fonction de preprocess pour le theme "page" et de définir une variable $image_header selon la situation.

exemple :

function montheme_preprocess_page(&$variables) {
$image_header = "images/vatican.jpg";
    if(arg(0) == "section1") {
       $image_header = "images/section1.jpg";
   }
  $variables["image_header"] = $image_header;
}

Dans ton page.tpl.php tu auras donc une variable $image_header qui contiendra l'adresse de ton image : vatican.jpg par défaut, section1.jpg si le 1ème argument de l'adresse (ex: section1/qui-sommes-nous) est section1.

A toi de définir les conditions...

Une autre solution serait d'utiliser des blocs avec des règles de visibilité.

Une méthode serait de faire un page.tpl.php pour chaque type de contenu en utilisant les suggestions. :-)

Tu as page.tpl.php pour les pages par défauts.
Tu crée page-front.tpl.php pour la page d'accueil (tu copies le contenu de page.tpl.php dedans)

Tu fais la même chose avec page-story.tpl.php pour les pages de types articles (story est le nom de variable du type de contenu article sauf si tu l'as modifié bien sûr)
Et par exemple, page-verbiages.tpl.php pour tes types de contenu verbiages

Il faut dans cet exemple que verbiages soit le nom de variable du type de contenu verbiages.
Tu peux vérifier ça dans la liste des types de contenu, c'est dans la colonne "type" juste à côté de "nom". :-)

Une fois que t'as un template pour chaque type de contenu, tu personnalises les attributs html dans chacun pour avoir ce que tu veux.

Dans la balise du header par exemple, tu mettras un id ou class = "headerhome" pour page-front.tpl.php; puis "headerstory" pour les articles etc.

PS: J'ai fait un tuto sur ce genre de chose, tu peux y jeter un oeil si tu veux. ;-)

Merci A tous pour vos contributions, c'est vraiment très sympa de votre part. J'essaierais ces méthodes afin de m'y familiariser et je ne manquerais pas de faire une retour à ce propos. Encore une fois, merci

L'idée de DavP est trés bonne. Tu auras un template différent pour chaque type de contenu.

Tu peux mixer les deux idées en ajouter des suggestion de template dans la fonction de preprocess en utilisant la variables "template_files" :

<?php
function montheme_preprocess_page(&$variables) {
 
$variables['template_files'][] = 'page-section1';
}
?>

Ainsi, la fonction theme('page') utilisera le template page-section1.tpl.php à la place du page.tpl.php

A mixer avec tes conditions.

En effet ça semble un excellent compromis merci. Cela dis, ça veux signifier qu'il faudra définir dans "function montheme_preprocess_page(&$variables)" toute les sections manuellement comme dans ton exemple Blaise. C'est bien ça?

Oui c'est cela.

Ensuite tout dépend de la manière dont sont conçus tes sections : par le menu ? par la taxonomie ?

Si c'est par le menu tu peux inspecter le trail actuel (menu_get_active_trail()) pour déterminer la section principale

<?php
function montheme_preprocess_page(&$variables) {
$trail = menu_get_active_trail();
if(
$trail[1]) {
 
$variables['template_files'][] = 'page-section-'.$trail[1]['mlid'];
}
}
?>

Dans cet exemple, tu te basera sur le mlid du menu item de la section.

Voilà donc comment j'ai défini mes sections dans mon template.php :

<?php
function france_preprocess_page(&$variables)
    {
 
$trail = menu_get_active_trail();
      if(
$trail[1]) {
         
$variables['template_files'][] = 'page-connaitre-'.$trail[1]['mlid'];
       
$variables['template_files'][] = 'page-visiter-'.$trail[1]['mlid'];
         
$variables['template_files'][] = 'page-vivre-'.$trail[1]['mlid'];
       
$variables['template_files'][] = 'page-etudier-'.$trail[1]['mlid'];
         
$variables['template_files'][] = 'page-travailler-'.$trail[1]['mlid'];
      
$variables['template_files'][] = 'page-entreprendre-'.$trail[1]['mlid'];
       }
  }
?>

Qu'en penses-tu?

Je pensais plus a quelque chose du genre :

<?php
function france_preprocess_page(&$variables) {
   
$trail = menu_get_active_trail();
  switch(
$trail[1]) {
        case
1082: // tu te base sur le mlid de ta section principale
       
$variables['template_files'][] = 'page-connaitre';
       case
1092:
      
$variables['template_files'][] = 'page-visiter';
     [...]
  }
}
?>

Tu as tout à fais raison. En testant même de cette façon:

<?php
function montheme_preprocess_page(&$variables) {
$trail = menu_get_active_trail();
if(
$trail[1]) {
 
$variables['template_files'][] = 'page-section-'.$trail[1]['mlid'];
}
}
?>

et en faisant un dsm($trail) j'obtiens bien la distinction de mes sections (une fois le menu bien organisé). Mais ce n'est certe pas complet; Je ferais suivant les 'case'.

Mille Merci

Salut à tous,
Pour résoudre mon soucis, j'ai suivis les pistes qui m'avaient été données et voilà donc ce que j'ai fais:

<?php
function montheme_preprocess_page(&$variables)
  {
  
$trail = menu_get_active_trail();
    
$trails = $trail[1]['page_arguments'][0];
    foreach(
$trails as $key =>$value)
   {
     if(
$key == 'nid'){
           switch(
$value){
            case
'3':
               
$variables['template_files'][] = 'page-connaitre';
             break;
         case
'11':
              
$variables['template_files'][] = 'page-visiter';
               break;
         case
'7':
               
$variables['template_files'][] = 'page-vivre';
             break;
         case
'8':
               
$variables['template_files'][] = 'page-etudier';
               break;
         case
'9':
               
$variables['template_files'][] = 'page-travailler';
                break;
         case
'10':
              
$variables['template_files'][] = 'page-entreprendre';
              break;
         }
      }
   }
 }
?>

Comme vous le remarquerez je suis passé par les 'nid' et ça semble marcher pluto bien. Je tiens à remercier tous ceux qui ont eu l'amabilité de me guider sur ce sujet. Merci à tous

Hello
juste une petite question, je suis pas sur d'avoir suivi : tu crées 6 templates (= maintenance 6 fois plus embetante) juste pour pouvoir changer la bannière ? C'est pas un peu disproportionné comme solution, alors qu'un bloc avec des paramètres de visibilité peut faire la même chose -si j'ai bien suivi la demande initiale- ?

En utilisant les blocs, il faudrait faire un bloc par bannière et ajouter à chaque bloc un script pour qu'il s'affiche en fonction du type de contenu (sauf pour la page d'accueil où il suffit juste de cocher la case et ajouter <front>.

Je sais pas si c'est plus simple mais c'est une autre possibilité en effet.

Salut nyl auster,
Tu n'as pas totalement tors, mais je ne faisais que donner une suite, en pensant aux autres personnes qui auraient suivis ce sujet, ou qui seraient intéressé car pouvant rencontrer ce cas de figure à l'avenir. Cela dit, il est clair que ça serait un peu long également en terme de temps de développement.

"En utilisant les blocs, il faudrait faire un bloc par bannière et ajouter à chaque bloc un script pour qu'il s'affiche en fonction du type de contenu"

ok j'avais mal compris la première question (ceci la première piste de blaise 35 me parait quand même plus simple :-) ).

Sinon j'utilise souvent ce module
http://drupal.org/project/context

il sert typiquement à créer des "sections" sur un site.

il permet par exemple d'afficher un bloc seulement quand on se trouve sur un type de contenu particulier, ou bien sur un élément de menu particulier etc...

attention toutefois, un bloc ne doit pas être placé dans la page classique des blocs pour pouvoir être placé par contexte.

Juste une piste en plus pour ceux qui cherchent à obtenir cela (je procède souvent avec context pour ma part pour obtenir ce résultat) :-)