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.