hook_preprocess_page (): Wie kann man eine Ansichtsseite erkennen?

10

Ich schreibe ein benutzerdefiniertes Modul, das einige Javascript- und CSS-Dateien nur in eine Ansichtsseite einfügen muss.

Ich benutze hook_preprocess_page, aber ich kann nicht sagen, ob die aktuelle Seite aus einer Ansicht ist:

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

Ich weiß, dass ich eine Vorlagendatei (page-my_view_page_path.tpl.php) verwenden könnte, aber js und extra css dürfen nur enthalten sein, wenn mein Modul aktiviert ist. Deshalb möchte ich diese Dinge direkt in meinem Modulcode behalten .

Ideen?

Strae
quelle
Sie können Vorlagendateien in Ihrem Modul verwenden.
Jeremy French
@Jeremy: Fügen Sie Ihre Antwort hinzu und erklären Sie, wie, damit die Leute abstimmen und streiten können.
Strae
Es war nicht direkt mit der Antwort verbunden, sondern wies nur darauf hin, dass eine tpl-Datei in einem Modul enthalten sein kann. ein DANieL schien anzuzeigen, dass es nicht konnte.
Jeremy French
Nun, ich könnte das Thema page.tpl einschließen, aber mein Ziel ist es, dieses Modul völlig unabhängig vom Thema zu halten.
Strae
Sie können die Vorlagen von Views implementieren, die Ihr Modul vorverarbeiten, wie in der Antwort von Jeremy French vorgeschlagen.
Pierre Buyle

Antworten:

12

views_get_page_view()findet heraus, welche Seitenansicht derzeit verwendet wird. Wenn NULL zurückgegeben wird, ist die aktuelle Seite keine Ansichtsseite.

Die Verwendung von drupal_add_js()und drupal_add_css()in a hook_preprocess_page()funktioniert jedoch nicht wie erwartet, da die Variable $scriptund die $styleVariablen bereits von festgelegt wurden template_preprocess_page(). Die Vorlagenvorverarbeitung von Views (siehe Antwort von Jeremy French) ist wahrscheinlich ein besserer Ort, um CSS und JavaScript hinzuzufügen.

Pierre Buyle
quelle
Ich habe meine Antwort für Ihren zweiten Absatz aktualisiert - ich weiß, dass es eine gute Praxis ist, CSS oder JS in das Thema (theme_preprocess_ *) einzufügen, aber meine Notwendigkeit ist modulabhängig.
Strae
Hervorragend, views_get_page_view ruft nur die bereits geladene Ansicht aus dem Cache ab, sodass sie keine Auswirkungen auf die Leistung haben sollte. IMHO sollte dies die akzeptierte Antwort sein.
Marcvangend
@Strae Mein Vorschlag war, HOOK_preprocess_views_view(&$variables)anstelle eines anderen Views-Template-Preprocess- Hooks zu verwenden HOOK_preprocess_page(&$variables). Auf diese Weise können Sie die Ansichten in $variablesund verwenden drupal_add_js()und drupal_add_css()sicher.
Pierre Buyle
11

Es gibt hier einen langen Thread zu Präprozessoren für Ansichten . Dieser Kommentar sieht für mich sehr einfach aus.

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
quelle
Ich bin damit einverstanden, dass die Vorverarbeitung der Ausgabe der Ansicht anstelle der gesamten Seite wahrscheinlich der korrektere Ansatz ist.
Garrett Albright
8

Wenn Sie sich in einer hook_preprocess_page () befinden, verfügt Ihre Ansicht per Definition über eine Seitenanzeige und einen Menüpfad, die eindeutig sein müssen. Sie können dies also tun:

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

Wenn an diese Seite Argumente übergeben werden, für die Sie Teile benötigen $_GET['q'], tun Sie dies stattdessen mit der arg()Funktion von Drupal :

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

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

Greg
quelle
Ich würde nicht empfehlen, $ _GET ['q'] zu untersuchen. Verwenden Sie stattdessen menu_get_item () oder menu_get_object () . Beides erfordert kein Argument, wenn Sie die aktuelle Seite überprüfen, und beide speichern ihre Ergebnisse im Cache.
Mikey P
Die Verwendung von drupal_add_js () und drupal_add_css () in einer hook_preprocess_page () funktioniert nicht wie erwartet, da die Variablen $ script und $ style bereits von template_preprocess_page () festgelegt wurden. Benutzer views_get_page_view (), um die Ansicht für die aktuelle Seite abzurufen (falls vorhanden).
Pierre Buyle
3

Für mich funktioniert dieser:

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

Wenn Sie einem bestimmten Rückruf JS oder CSS hinzufügen, sollten Sie Folgendes verwenden hook_page_build():

Simon Poulston
quelle