hook_preprocess_page():ビューページを通知する方法?


10

いくつかのjavascriptおよびcssファイルをビューページにのみ挿入する必要があるカスタムモジュールを書いています。

私はhook_preprocess_pageを使用していますが、現在のページがビューからのものかどうかわかりません:

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

テンプレートファイル(page-my_view_page_path.tpl.php)を使用できることはわかっていますが、jsと追加のcssは、モジュールが有効な場合にのみ含める必要があります。だから私はこのことを私のモジュールコードの中に直接入れておきたいです

アイデア?


モジュールでテンプレートファイルを使用できます。
ジェレミーフランス語、

@ジェレミー:人々が投票して議論できるように、方法を説明する回答を追加してください。
Strae

これは回答に直接関係するものではなく、tplファイルをモジュールに含めることができることを指摘しただけです。DANieLは、それができなかったことを示しているようです。
ジェレミーフランスの

まあ..私はテーマpage.tplを含めることができますが、私の目標はこのモジュールをテーマから完全に独立させることです..
Strae

Jeremy Frenchの回答で提案されているように、モジュールを前処理するビューのテンプレートを実装できます。
Pierre Buyle、2015年

回答:


12

views_get_page_view()現在使用中のページビューがある場合は、それを見つけます。NULLを返す場合、現在のページはビューのページではありません。

ただし、変数と変数は既にによって設定されているため、drupal_add_js()drupal_add_css()での使用hook_preprocess_page()は期待どおりに動作しません。ビューのテンプレートの前処理(Jeremy Frenchの回答を参照)は、おそらくCSSとJavaScriptを追加するためのより良い場所です。$script$styletemplate_preprocess_page()


2番目の段落の回答を更新しました。テーマ(theme_preprocess_ *)にcssまたはjsを追加することをお勧めしますが、モジュールに依存する必要があります。
Strae

すばらしい、views_get_page_viewは既にロードされているビューをキャッシュから取得するだけなので、パフォーマンスに影響を与えることはありません。私見これは受け入れられる答えであるべきです。
marcvangend 2011年

@Strae私の提案は、のHOOK_preprocess_views_view(&$variables)代わりにまたは別のビューのテンプレート前処理フックを使用することでしたHOOK_preprocess_page(&$variables)。この方法は、あなたの中のビューを取得することができます$variablesし、使用drupal_add_js()してdrupal_add_css()安全に。
Pierre Buyle 2015年

11

ここでは、ビューのプリプロセッサに長いスレッドがあります。このコメントは私には非常にシンプルに見えます。

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
}

ページ全体ではなくビューの出力を前処理する方がおそらくより正しいアプローチであることに同意します。
Garrett Albright、

8

あなたがhook_preprocess_page()にいる場合、定義により、ビューにはページ表示とメニューパスがあり、これらは一意でなければならないので、これを行うことができます:

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

このページに渡される引数があるため$_GET['q']、の一部が必要な場合は、代わりにDrupalのarg()関数を使用してこれを行います。

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

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


$ _GET ['q']を調べることはお勧めしません。代わりに、menu_get_item()またはmenu_get_object()を使用してください。現在のページを検査する場合、どちらも引数を必要としません。どちらも結果をキャッシュします。
Mikey P

変数$ scriptと$ style変数は既にtemplate_preprocess_page()によって設定されているため、dookal_add_js()とdrupal_add_css()をhook_preprocess_page()で使用すると、期待どおりに機能しません。現在のページ(存在する場合)のビューを取得するには、views_get_page_view()を使用します。
Pierre Buyle

3

私にとってこれはうまくいきます:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.