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?


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.


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
}

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


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
  }
}

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.