Im écrit un module personnalisé qui doit insérer des fichiers javascript et css uniquement dans une page Vues.
J'utilise hook_preprocess_page, mais je ne peux pas dire si la page actuelle provient d'une vue:
function mymodule_preprocess_page(&vars)
{
var_dump($vars); //output: nothings that reference the views!
if([view page])
{
drupal_add_js([...]);
drupal_add_css([...]);
// Rebuild scripts
$scripts = drupal_get_js();
$vars['scripts'] = $scripts;
// Same for css
}
}
Je sais que je pourrais utiliser un fichier de modèle (page-my_view_page_path.tpl.php), mais le js et le CSS supplémentaire ne doivent être inclus que si mon module est activé; donc j'aime garder ces choses directement dans le code de mon module.
Des idées?
views_get_page_view()
découvre quelle vue de page, le cas échéant, est actuellement utilisée. S'il renvoie NULL, la page en cours n'est pas une page de vues.
Mais l'utilisation de drupal_add_js()
et drupal_add_css()
dans un hook_preprocess_page()
ne fonctionnera pas comme prévu car les variables $script
Et $style
Ont déjà été définies par template_preprocess_page()
. Le prétraitement des modèles de vues (voir la réponse de Jeremy French) est probablement un meilleur endroit pour ajouter votre CSS et JavaScript.
Il y a un long thread sur préprocesseurs pour les vues ici. Ce commentaire me semble très simple.
function mymodule_theme_registry_alter(&$theme_registry) {
//dpm($theme_registry);
$theme_registry['views_view__YOUR_VIEW_NAME_HERE']['preprocess functions'][] = 'mymodule_preprocess_func';
}
// now go on and play with your new preprocess function
function mymodule_preprocess_func(&$vars) {
// etc
}
Si vous êtes dans une hook_preprocess_page (), par définition, votre vue a un affichage de page et un chemin de menu, qui doivent être uniques - vous pouvez donc le faire:
function mymodule_preprocess_page(&vars)
{
var_dump($vars); //output: nothings that reference the views!
if($_GET['q'] == 'my/view/path')
{
drupal_add_js([...]);
drupal_add_css([...]);
}
}
Si des arguments sont passés à cette page, vous avez donc besoin de parties de $_GET['q']
, Faites-le à la place avec la fonction arg()
de Drupal:
if(arg(0) == 'my' && arg(1) == 'view' && arg(2) == 'path')
http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/arg
Pour moi celui-ci fonctionne:
function MYMODULE_preprocess_page(&$vars) {
$view = (array)views_get_page_view();
if (!empty($view)) {
// do stuff
}
}
Si vous ajoutez JS ou CSS à un rappel spécifique, il vaut mieux utiliser hook_page_build()
: