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.