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?


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.


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
}

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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.