hook_preprocess_page (): bagaimana cara memberitahu halaman tampilan?


10

Saya sedang menulis modul khusus yang perlu memasukkan beberapa file javascript dan css hanya di halaman Views.

Saya menggunakan hook_preprocess_page, tapi saya tidak tahu apakah halaman saat ini dari tampilan:

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

Saya tahu saya bisa menggunakan file templat (halaman-my_view_page_path.tpl.php), tetapi js dan css tambahan harus disertakan hanya jika modul saya diaktifkan; jadi saya ingin menyimpannya langsung di dalam kode modul saya .

Ide ide?


Anda dapat menggunakan file templat dalam modul Anda.
— Jeremy French

@ Jeremy: tambahkan jawaban Anda menjelaskan caranya, sehingga orang dapat memilih dan berdebat.
— Strae

Itu tidak terkait langsung dengan jawabannya, hanya menunjukkan bahwa file tpl dapat dimasukkan dalam modul. DANieL tampaknya menunjukkan bahwa itu tidak bisa.
— Jeremy French

baik .. saya bisa memasukkan theme page.tpl, tetapi tujuan saya adalah untuk menjaga modul ini benar-benar independen dari tema ..
— Strae

Anda dapat mengimplementasikan templat Views 'sebelum memproses modul Anda, seperti yang disarankan dalam jawaban Jeremy French.
— Pierre Buyle

Jawaban:


12

views_get_page_view()mencari tahu apa, jika ada, tampilan halaman sedang digunakan. Jika mengembalikan NULL, maka halaman saat ini bukan halaman tampilan.

Tetapi menggunakan drupal_add_js()dan drupal_add_css()dalam hook_preprocess_page()tidak akan berfungsi seperti yang diharapkan karena variabel $scriptdan $stylevariabel telah ditetapkan oleh template_preprocess_page(). Pembuatan pratinjau templat Views (lihat jawaban Jeremy French) mungkin merupakan tempat yang lebih baik untuk menambahkan CSS dan JavaScript Anda.


Saya memperbarui jawaban saya untuk Anda paragraf kedua - saya tahu adalah praktik yang baik untuk menambahkan css atau js dalam tema (theme_preprocess_ *), tetapi kebutuhan saya adalah modul dependandt.
— Strae

Luar biasa, views_get_page_view baru saja mendapatkan tampilan yang sudah dimuat dari cache, sehingga seharusnya tidak memiliki dampak kinerja. IMHO ini harus menjadi jawaban yang diterima.
— marcvangend

@ Trae Saran saya adalah untuk menggunakan HOOK_preprocess_views_view(&$variables)atau kait preprocess templat Views lainnya HOOK_preprocess_page(&$variables). Dengan cara ini Anda bisa mendapatkan pandangan di $variablesdan penggunaan drupal_add_js()dan drupal_add_css()aman.
— Pierre Buyle

11

Ada utas panjang tentang preprosesor untuk dilihat di sini. Komentar ini terlihat sangat sederhana bagi saya.

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
}

Saya setuju bahwa preprocessing output dari View bukannya seluruh halaman mungkin merupakan pendekatan yang lebih tepat.
— Garrett Albright

8

Jika Anda menggunakan hook_preprocess_page () maka, menurut definisi, tampilan Anda memiliki tampilan halaman dan jalur menu, yang harus unik - sehingga Anda dapat melakukan ini:

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

Jika Anda memiliki argumen yang diteruskan ke halaman ini, jadi Anda perlu bagian $_GET['q'], maka lakukan ini dengan arg()fungsi Drupal :

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

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


Saya tidak akan merekomendasikan memeriksa $ _GET ['q']. Gunakan menu_get_item () atau menu_get_object () sebagai gantinya. Tidak ada yang membutuhkan argumen jika Anda memeriksa halaman saat ini, dan keduanya menyimpan hasilnya.
— Mikey P

Menggunakan drupal_add_js () dan drupal_add_css () di hook_preprocess_page () tidak akan berfungsi seperti yang diharapkan karena variabel $ script dan variabel $ style telah ditetapkan oleh template_preprocess_page (). Pengguna views_get_page_view () untuk mengambil tampilan untuk halaman saat ini (jika ada).
— Pierre Buyle

3

Bagi saya yang ini berfungsi:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.