Permintaan khusus dalam Tampilan?

24

Pada beberapa titik saya menemukan kebutuhan untuk memodifikasi permintaan SQL yang dihasilkan oleh Views, pada akhirnya saya mengesampingkan views_pre_executedan mengubah permintaan untuk tampilan tertentu.

Ini terasa seperti peretasan yang buruk bagi saya dan saya ingin tahu apakah ada cara yang lebih elegan dan dapat dipelihara untuk melakukan itu. Ideal akan menjadi cara yang memungkinkan saya untuk secara langsung memodifikasi kueri dari UI Tampilan.

Ilmuwan gila
sumber
1
Itu tergantung pada bagaimana Anda ingin memodifikasi kueri itu. Apa yang sebenarnya ingin Anda capai?
Jason Smith
@Jason Saya memposting pertanyaan ke SO pada waktu itu: stackoverflow.com/questions/3147916/... Tapi masalah itu terpecahkan sekarang, saya hanya mencari cara yang elegan untuk memodifikasi permintaan Views jika saya harus.
Mad Scientist
Saya tidak yakin bahwa Anda tidak dapat mencapai apa yang Anda coba lakukan di utas lainnya hanya menggunakan pandangan. Yang mengatakan, ada lebih dari satu cara untuk menguliti kucing ini.
Jason Smith
Jika salah satu jawaban di bawah ini adalah apa yang Anda cari, Anda harus menerimanya (klik tanda centang di bawah penghitungan suara)
Chaulky
hook_views_pre_execute mungkin bukan yang paling elegan, tetapi memang memiliki tempatnya untuk penimpaan kueri yang rumit (lihat permintaan Kustom Tampilan 3 kueri di Drupal 7 )
mrP

Jawaban:

25

Anda juga dapat menggunakan hook_views_query_alter()untuk mengubah kueri sebelum dijalankan. Saya pikir ini mirip dengan hook_views_pre_execute, tetapi membuatnya lebih mudah untuk memodifikasi kueri. Pada dasarnya Anda mendapatkan akses ke setiap bagian dari kueri melalui array yang diketik. Saya belum menemukan banyak dokumentasi resmi, tetapi ada contoh yang cukup bagus di https://www.appnovation.com/blog/using-hook-views-query-alter . Ini juga pendekatan yang harus saya gunakan untuk memperbaiki bug tanggal di modul Kalender.

Chaulky
sumber
Akankah ini bekerja dengan Views-3 juga?
markdorison
@markdorison Saya percaya begitu, tetapi belum mengkonfirmasi itu
Chaulky
3
Saya telah mengkonfirmasi bahwa ini berfungsi di Views-3.
markdorison
1
@Fabian Anda harus menerima jawaban ini jika itu berguna bagi Anda, atau mengomentari mengapa itu tidak terjadi sehingga kami dapat membuatnya lebih baik
Chaulky
Contoh referensi lain untuk kueri Tampilan Kustom 3 di Drupal 7 menggunakan hook_views_pre_execute()dalam modul kustom sederhana.
mrP
4

Secara umum ini tergantung pada kasus penggunaan Anda.

Jika Anda ingin memiliki bidang / filter / argumen yang harus berperilaku dengan cara tertentu, disarankan untuk menulis handler untuk itu. Lihat bantuan tampilan lanjutan untuk informasi lebih lanjut.

Jika Anda ingin mengubah beberapa bagian dari kueri, Anda juga dapat menggunakan hook_views_query_alter () . Hal buruknya hook_views_query_alter()adalah Anda tidak bisa menggunakan kembali kode di sana.

Ini adalah contoh kode yang ditunjukkan dari dokumentasi. Ini memberikan contoh tentang apa yang dapat dilakukan oleh pengait.

function mymodule_views_query_alter(&$view, &$query) {
  // (Example assuming a view with an exposed filter on node title.)
  // If the input for the title filter is a positive integer, filter against
  // node ID instead of node title.
  if ($view->name == 'my_view' && is_numeric($view->exposed_raw_input['title']) && $view->exposed_raw_input['title'] > 0) {
    // Traverse through the 'where' part of the query.
    foreach ($query->where as &$condition_group) {
      foreach ($condition_group['conditions'] as &$condition) {
        // If this is the part of the query filtering on title, chang the
        // condition to filter on node ID.
        if ($condition['field'] == 'node.title') {
          $condition = array(
            'field' => 'node.nid', 
            'value' => $view->exposed_raw_input['title'], 
            'operator' => '=',
          );
        }
      }
    }
  }
}
Daniel Wehner
sumber
3

Saya telah menggunakan hook_views_query_alter()untuk mengubah permintaan tampilan mysql. Contoh berikut ini diuji di bawah Drupal 7 dengan 7.x-3.0, itu menambahkan ORDER BYklausa kustom ke kueri:

 function MYTHEME_views_query_alter(&$view, &$query) {
   // check so it's the correct view
   if($view->name == 'product_view') {
     // set a custom 'ORDER BY' clause in the query
     $query->orderby[0] = array(
       'field' => 'SUBSTR(taxonomy_term_data_name,3,4)',
       'direction' => 'ASC'
     );
     $query->orderby[1] = array(
       'field' => 'SUBSTR(taxonomy_term_data_name,1,2)',
       'direction' => 'ASC'
     );
   }
 }
Cyclonecode
sumber
1

Saya tidak tahu apakah Anda bisa langsung mengubah sql, tetapi Anda bisa menulis field handler Anda sendiri dan membuat kueri Anda sendiri.

EricSchaefer
sumber