hook_preprocess_page (): comment dire une page de vues?

10

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?

Strae
la source
Vous pouvez utiliser des fichiers de modèle dans votre module.
Jeremy French
@Jeremy: ajoutez votre réponse en expliquant comment, afin que les gens puissent voter et discuter.
Strae
Ce n'était pas directement lié à la réponse, soulignant simplement qu'un fichier tpl peut être inclus dans un module. un DANieL semblait indiquer qu'il ne pouvait pas.
Jeremy French
bien .. je pourrais inclure le thème page.tpl, mais mon objectif est de garder ce module totalement indépendant du thème ..
Strae
Vous pouvez implémenter des modèles de vues prétraitant votre module, comme suggéré dans la réponse de Jeremy French.
Pierre Buyle

Réponses:

12

views_get_page_view()découvre, le cas échéant, la vue de page 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 hook_preprocess_page()ne fonctionnera pas comme prévu car la variable $scriptet les $stylevariables 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.

Pierre Buyle
la source
J'ai mis à jour ma réponse pour vous deuxième paragraphe - je sais que c'est une bonne pratique pour ajouter css ou js dans le thème (theme_preprocess_ *), mais mon besoin est le module dependandt.
Strae
Excellent, views_get_page_view obtient simplement la vue déjà chargée du cache, donc cela ne devrait pas avoir d'impact sur les performances. À mon humble avis, cela devrait être la réponse acceptée.
marcvangend
@Strae Ma suggestion était d'utiliser HOOK_preprocess_views_view(&$variables)ou un autre crochet de prétraitement de modèle de vues au lieu de HOOK_preprocess_page(&$variables). De cette façon , vous pouvez obtenir les vues $variableset l' utilisation drupal_add_js()et en drupal_add_css()toute sécurité.
Pierre Buyle
11

Il y a un long fil sur les 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
}
Jeremy French
la source
Je suis d'accord que le prétraitement de la sortie de la vue au lieu de la page entière est probablement l'approche la plus correcte.
Garrett Albright
8

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 vous avez des arguments passés à cette page, vous avez donc besoin de parties de $_GET['q'], alors faites-le à la place avec la arg()fonction de Drupal :

if(arg(0) == 'my' && arg(1) == 'view' && arg(2) == 'path')

http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/arg

Greg
la source
Je ne recommanderais pas d'examiner $ _GET ['q']. Utilisez plutôt menu_get_item () ou menu_get_object () . Aucun des deux ne nécessite d'argument si vous inspectez la page en cours et ils mettent tous les deux en cache leurs résultats.
Mikey P
L'utilisation de drupal_add_js () et drupal_add_css () dans une 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 (). L'utilisateur views_get_page_view () pour récupérer la vue de la page actuelle (le cas échéant).
Pierre Buyle
3

Pour moi celui-ci fonctionne:

function MYMODULE_preprocess_page(&$vars) {
  $view = (array)views_get_page_view();
  if (!empty($view)) {
    // do stuff
  }
}
leymannx
la source