Question

Quelle est la meilleure méthode pour inclure un fichier CSS ou Javascript pour un nœud spécifique dans Drupal 6.

Je souhaite créer une page sur mon site dans laquelle une petite application javascript est en cours d'exécution. Le CSS et le javascript sont donc spécifiques à cette page et ne voudraient pas être inclus dans d'autres chargements de page.

Était-ce utile?

La solution 4

La meilleure solution que j'ai trouvée jusqu'ici consiste à activer le mode de saisie PHP, puis à appeler drupal_add_css et drupal_add_js selon le cas dans un bloc PHP dans le début du corps de votre noeud.

Autres conseils

Je vous déconseille d'utiliser hook_nodeapi pour cela. L'ajout de CSS et de Javascript est lié à la mise en page. hook_nodeapi n'est donc pas l'endroit pour cela: utilisez un thème. De cette façon, vous pouvez remplacer ces fichiers lorsque vous développez un nouveau thème. Faire cela avec l’approche nodeapi serait un peu plus difficile (il faudrait chercher dans la liste js / css les fichiers, les supprimer et les remplacer par les vôtres).

Quoi qu'il en soit, vous devez ajouter une fonction de prétraitement de noeud qui ajoute ces fichiers à votre place. Vous pouvez le faire dans un module ou dans un thème personnalisé. Pour un module, ce serait:

function mymodule_preprocess_node(&$variables) {
  $node = $variables['node'];
  if (!empty($node) && $node->nid == $the_specific_node_id) {
    drupal_add_js(drupal_get_path('module', 'mymodule') . "/file.js", "module");
    drupal_add_css(drupal_get_path('module', 'mymodule') . "/file.css", "module");
  }
}

ou pour un thème:

function mytheme_preprocess_node(&$variables) {
  $node = $variables['node'];
  if (!empty($node) && $node->nid == $the_specific_node_id) {
    drupal_add_js(path_to_theme() . "/file.js", "theme");
    drupal_add_css(path_to_theme(). "/file.css", "theme");
  }
}

N'oubliez pas de vider le cache en premier.

Ces fonctions sont appelées avant que le nœud soit thématisé. Spécifier le fichier js / css permet une approche en cascade: vous pouvez inclure les éléments génériques / de base dans le module et fournir des fonctionnalités améliorées ou spécifiques dans le thème.

J'utilise les fonctions de prétraitement, mais cela pose quelques problèmes. $ variables ['styles'] est généralement défini avant que ne soit appelée la fonction de prétraitement du noeud. En d'autres termes, drupal_get_css est déjà appelé, ce qui vous rend inutile l'appel de drupal_add_css . Il en va de même pour drupal_add_js . Je travaille autour de cela en réinitialisant la valeur $ variables ['styles'] .

function mytheme_preprocess_node(&$variables) {
  $node = $variables['node'];
  if (!empty($node) && $node->nid == $the_specific_node_id) {
    drupal_add_js(path_to_theme() . "/file.js", "theme");
    drupal_add_css(path_to_theme(). "/file.css", "theme");
    $variables['styles'] = drupal_get_css();
    $variables['script'] = drupal_get_js();
  }
}

Cela semble fonctionner dans la plupart des cas.

P.S. Il n’est pratiquement jamais nécessaire de créer un module pour résoudre un problème de thème.

A bientôt.

Cela semble être une bonne solution:

http://drupal.org/project/js_injector et http://drupal.org/project/css_injector

Cela fonctionne lorsque vous souhaitez insérer du code en ligne dans autre chose que techniquement un nœud, il n'y a donc pas d'identifiant de nœud ni d'option d'entrée PHP disponible. Comme si je l’utilisais pour injecter de petites modifications jQuery dans quelques pages d’administrateur. Cela fonctionne par chemin plutôt que par id de noeud.

Cela devrait faire l'affaire - un module de résumé utilisant le hook_nodeapi insérer le fichier JS / CSS lors de la visualisation du nœud.

function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  // the node ID of the node you want to modify
  $node_to_modify = 6;

  // do it!
  if($op == 'view' && $node->nid == $node_to_modify) {
    drupal_add_js(drupal_get_path('module', 'mymodule') . '/mymodule.js');
    drupal_add_css(drupal_get_path('module', 'mymodule') . '/mymodule.css');
  }
}

Cela évite les problèmes de sécurité liés à l'activation du filtre d'entrée PHP et ne nécessite pas de fichier de modèle de nœud distinct, qui pourrait devenir obsolète si vous mettiez à jour le modèle de nœud principal et oubliez votre modèle personnalisé.

Vous pouvez avoir un modèle personnalisé pour ce nœud (node-needsjs.tpl.php) qui appelle le javascript. C’est un peu plus propre que d’utiliser PHP directement dans le corps du nœud et facilite les modifications de contenu à l’avenir.

EDIT: je ne pense pas avoir été très clair ci-dessus. Vous souhaitez nommer le fichier de modèle node- (nodeid) .tpl.php. Donc, s'il s'agissait du nœud 1, appelez le fichier node-1.tpl.php

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top