hook_preprocess_page (): ¿cómo decir una página de visitas?

10

Estoy escribiendo un módulo personalizado que necesita insertar algunos archivos javascript y css solo en una página de Vistas.

Estoy usando hook_preprocess_page, pero no puedo decir si la página actual es de una vista:

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

Sé que podría usar un archivo de plantilla (page-my_view_page_path.tpl.php), pero el js y el css adicional deben incluirse solo si mi módulo está habilitado; así que me gusta mantener estas cosas directamente dentro del código de mi módulo .

Ideas?

Strae
fuente
Puede usar archivos de plantilla en su módulo.
Jeremy French
@Jeremy: agrega tu respuesta explicando cómo, para que la gente pueda votar y discutir.
Strae
No estaba directamente relacionado con la respuesta, solo señalaba que se podía incluir un archivo tpl en un módulo. un DANieL parecía estar indicando que no podía.
Jeremy French
bueno ... podría incluir el tema page.tpl, pero mi objetivo es mantener este módulo totalmente independiente del tema ...
Strae
Puede implementar las plantillas de Vistas preprocesando su módulo, como se sugiere en la respuesta de Jeremy French.
Pierre Buyle

Respuestas:

12

views_get_page_view()descubre qué vista de página, si hay alguna, está actualmente en uso. Si devuelve NULL, la página actual no es una página de visitas.

Pero usar drupal_add_js()y drupal_add_css()en a hook_preprocess_page()no funcionará como se esperaba porque la variable $scripty las $stylevariables ya han sido establecidas por template_preprocess_page(). El preprocesamiento de plantillas de Views (vea la respuesta de Jeremy French) es probablemente un mejor lugar para agregar su CSS y JavaScript.

Pierre Buyle
fuente
Actualicé mi respuesta para el segundo párrafo: sé que es una buena práctica agregar css o js en el tema (theme_preprocess_ *), pero mi necesidad depende del módulo.
Strae
Excelente, views_get_page_view solo obtiene la vista ya cargada del caché, por lo que no debería tener un impacto en el rendimiento. En mi humilde opinión, esta debería ser la respuesta aceptada.
marcvangend
@Strae Mi sugerencia fue utilizar HOOK_preprocess_views_view(&$variables)u otro enlace de preproceso de plantilla de Vistas en lugar de HOOK_preprocess_page(&$variables). De esta manera usted puede obtener las vistas en $variablesy uso drupal_add_js()y drupal_add_css()de forma segura.
Pierre Buyle
11

Aquí hay un hilo largo en los preprocesadores para las vistas . Este comentario me parece muy 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
fuente
Estoy de acuerdo en que el preprocesamiento de la salida de la Vista en lugar de la página completa es probablemente el enfoque más correcto.
Garrett Albright
8

Si está en un hook_preprocess_page (), entonces, por definición, su vista tiene una visualización de página y una ruta de menú, que debe ser única, por lo que puede hacer esto:

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 tiene argumentos que se pasan a esta página, por lo que necesita partes $_GET['q'], haga esto con la arg()función de Drupal :

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

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

Greg
fuente
No recomendaría examinar $ _GET ['q']. Utilice menu_get_item () o menu_get_object () en su lugar. Ninguno requiere un argumento si está inspeccionando la página actual, y ambos almacenan en caché sus resultados.
Mikey P
El uso de drupal_add_js () y drupal_add_css () en un hook_preprocess_page () no funcionará como se esperaba porque la variable $ script y $ style variables ya han sido establecidas por template_preprocess_page (). El usuario views_get_page_view () para recuperar la vista de la página actual (si existe).
Pierre Buyle
3

Para mí este funciona:

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

Si está agregando JS o CSS a una devolución de llamada específica, mejor usar hook_page_build():

Simon Poulston
fuente