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?


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.


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
}

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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.