hook_preprocess_page (): come raccontare una pagina di visualizzazioni?


10

Sto scrivendo un modulo personalizzato che deve inserire alcuni file javascript e css solo in una pagina Views.

Sto usando hook_preprocess_page, ma non posso dire se la pagina corrente proviene da 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
    }
}

So che potrei usare un file modello (page-my_view_page_path.tpl.php), ma js e extra css devono essere inclusi solo se il mio modulo è abilitato; quindi mi piace tenere queste cose direttamente nel mio codice del modulo .

Idee?


Puoi utilizzare i file modello nel tuo modulo.
Jeremy French

@Jeremy: aggiungi la tua risposta spiegando come, così le persone possono votare e discutere.
Strae

Non era direttamente correlato alla risposta, sottolineando solo che un file tpl può essere incluso in un modulo. un DANieL sembrava indicare che non poteva.
Jeremy French

bene .. potrei includere il tema page.tpl, ma il mio obiettivo è mantenere questo modulo totalmente indipendente dal tema ..
Strae

Puoi implementare i template di Views pre-processando il tuo modulo, come suggerito nella risposta di Jeremy French.
Pierre Buyle,

Risposte:


12

views_get_page_view()scopre quale, se presente, la visualizzazione della pagina è attualmente in uso. Se restituisce NULL, la pagina corrente non è una pagina di visualizzazioni.

Ma usare drupal_add_js()e drupal_add_css()in a hook_preprocess_page()non funzionerà come previsto perché la variabile $scripte le $stylevariabili sono già state impostate da template_preprocess_page(). La preelaborazione del modello di Views (vedi la risposta di Jeremy French) è probabilmente un posto migliore per aggiungere CSS e JavaScript.


Ho aggiornato la mia risposta per te secondo paragrafo: so che è una buona pratica aggiungere css o js al tema (theme_preprocess_ *), ma il mio bisogno è dipendente dal modulo.
Strae

Eccellente, views_get_page_view ottiene solo la vista già caricata dalla cache, quindi non dovrebbe avere un impatto sulle prestazioni. IMHO questa dovrebbe essere la risposta accettata.
marcvangend,

@Strae Il mio suggerimento era di utilizzare HOOK_preprocess_views_view(&$variables)o un altro hook di pre-elaborazione del modello di Views invece di HOOK_preprocess_page(&$variables). In questo modo è possibile ottenere il punto di vista di $variablesveicoli e sull'uso drupal_add_js()e drupal_add_css()in modo sicuro.
Pierre Buyle,

11

C'è un lungo thread sui preprocessori per le viste qui. Questo commento mi sembra molto semplice.

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
}

Concordo sul fatto che la preelaborazione dell'output della vista anziché dell'intera pagina sia probabilmente l'approccio più corretto.
Garrett Albright,

8

Se ti trovi in ​​hook_preprocess_page (), quindi, per definizione, la tua vista ha una visualizzazione di pagina e un percorso di menu, che devono essere univoci, quindi puoi farlo:

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([...]);
    }
}

Se hai argomenti passati a questa pagina, quindi hai bisogno di parti di $_GET['q'], allora fallo con la arg()funzione di Drupal :

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

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


Non consiglierei di esaminare $ _GET ['q']. Utilizzare invece menu_get_item () o menu_get_object () . Nessuno dei due richiede un argomento se si sta ispezionando la pagina corrente ed entrambi memorizzano nella cache i risultati.
Mikey P

L'uso di drupal_add_js () e drupal_add_css () in un hook_preprocess_page () non funzionerà come previsto perché la variabile $ script e le variabili $ style sono già state impostate da template_preprocess_page (). L'utente views_get_page_view () per recuperare la vista per la pagina corrente (se presente).
Pierre Buyle,

3

Per me questo funziona:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.