it-swarm-id.com

Permintaan khusus dalam Tampilan?

Pada titik tertentu saya menemukan kebutuhan untuk memodifikasi query SQL yang dihasilkan oleh Views, pada akhirnya saya mengesampingkan views_pre_execute dan mengubah kueri untuk tampilan spesifik itu.

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

23
Mad Scientist

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.

25
Chaulky

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 buruk tentang hook_views_query_alter() adalah Anda tidak dapat 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' => '=',
          );
        }
      }
    }
  }
}
4
Daniel Wehner

Saya telah menggunakan hook_views_query_alter() untuk mengubah permintaan tampilan mysql. Contoh berikut diuji di bawah Drupal 7 dengan 7.x-3.0, itu menambahkan custom ORDER BY klausa 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'
     );
   }
 }
3
Cyclonecode

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

1
EricSchaefer