J'essaie d'ajouter des feuilles de style conditionnellement à mon site Drupal 6. J'ai ajouté le code suivant à mon fichier template.php pour le tester, et cela ne fonctionne pas. Le fichier css n'est pas ajouté à mon site.

function ben_preprocess_page(&$vars) {
drupal_add_css('/sites/all/themes/ben/advice.css','theme','all',FALSE);}

Ce code fonctionne bien lorsque je le mets dans un module personnalisé que j'ai créé à l'aide de hook_init() mais je pense que je dois le mettre dans mon fichier template.php car je veux vérifier la page sur laquelle je suis.

Toute aide serait très appréciée.

Ben

2
Ben 27 janv. 2010 à 19:36
@benmango : J'ai mis à jour ma réponse ci-dessous en fonction de vos précisions dans les commentaires - HTH
 – 
Henrik Opel
28 janv. 2010 à 12:21

2 réponses

Meilleure réponse

IIRC, les liens de la feuille de style ont déjà été rendus lorsque les fonctions *_preprocess_page() sont appelées et le balisage généré a été placé dans $variables['styles']. Il est donc trop tard pour utiliser drupal_add_css() d'ici là.

Vous pouvez soit assembler vous-même le balisage <link ...> pour vos ajouts et l'ajouter à $variables['styles'], soit trouver un meilleur endroit pour votre appel à drupal_add_css() plus tôt dans la chaîne de traitement (probablement à partir de dans un module).

Il est difficile de dire à quel endroit ce serait sans savoir ce que vous entendez exactement par "vérifier la page sur laquelle je suis", mais si nous parlons de pages de nœuds, hook_nodeapi() serait un candidat.


EDIT après clarification dans les commentaires : Si la décision sur les feuilles de style à ajouter est basée uniquement sur le chemin, hook_init (dans un module personnalisé) serait un bon endroit pour le faire, car le chemin ne changera pas après cela. Le seul élément « difficile » dans ce cas serait d'accéder aux URL propres. Si (comme je suppose) vous utilisez des URL propres, vous ne pouvez pas utiliser arg(0) pour obtenir le premier élément du chemin, car cela renverrait le premier élément du chemin interne de Drupal (par exemple « nœud » pour les pages de nœud). Vous devez donc d'abord obtenir la version propre de l'URL :

// Get current path alias, if any (will return original path, if no alias set)
$path = drupal_get_path_alias($_GET['q']);
// Extract first element
$path_elements = explode('/', $path);
// Do we have at least one element?
if (0 < count($path_elements) {
  // Yes, add stylesheet based on that
  switch ($path_elements[0]) {
    case 'advice':
      drupal_add_css('path/to/advice.css');
      break;
    case 'services':
      drupal_add_css('path/to/services.css');
      break;
    // TODO: Add other variations ...
    default:
      // Might add a default alternative here
      break;
  }
}

(REMARQUE : code non testé, attention aux fautes de frappe)

3
Alp 18 mars 2012 à 20:45
Désolé de ne pas être plus précis sur la "page sur laquelle je suis". Je souhaite appliquer différents styles (images d'arrière-plan et autres couleurs) à différentes sections de mon site. Les différentes sections sont accessibles via le menu principal, donc les différentes sections seront décidées par le chemin de l'url. Par exemple, /conseils, /services, /événements, etc. Cela aide-t-il à décider quel endroit serait le mieux pour passer l'appel ?
 – 
Ben
27 janv. 2010 à 20:18
Merci beaucoup pour votre réponse. J'ai réussi à créer une solution hier soir. J'ai créé ma propre variable à l'aide d'une fonction de pré-traitement en utilisant le chemin du menu, puis en ajoutant cette variable à mon page.tpl.php. J'utilise cette variable comme classe pour css. Je posterai la réponse ci-dessous.
 – 
Ben
28 janv. 2010 à 13:56

J'ai mis le code suivant dans un module personnalisé et il ajoute maintenant le fichier css :

function defprofile_preprocess_page(&$vars) {
drupal_add_css('sites/all/themes/ben/advice.css','theme','all',FALSE);
$vars['styles'] = drupal_get_css(); }
3
Ben 27 janv. 2010 à 20:34
Exactement, c'est la solution. Cependant, la solution ne réside pas dans le fait que vous mettez cela dans un module personnalisé ; ce code fonctionnerait également dans template.php. La clé pour résoudre ce problème consiste à utiliser drupal_get_css pour mettre à jour $vars['styles'] après avoir ajouté le css.
 – 
marcvangend
27 janv. 2010 à 20:52
J'ai essayé de mettre exactement le même code (en changeant le nom de la fonction pour l'adapter à mon thème) dans mon template.php et cela n'a pas fonctionné...
 – 
Ben
27 janv. 2010 à 20:57