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?

Strae
sumber
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.

Pierre Buyle
sumber
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
}
Jeremy French
sumber
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

Greg
sumber
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
  }
}
leymannx
sumber
2

Jika Anda menambahkan JS atau CSS ke panggilan balik tertentu, maka lebih baik menggunakan hook_page_build():

Simon Poulston
sumber