web-gelistirme-sc.com

Views'daki özel sorgu?

Bir noktada Views tarafından oluşturulan bir SQL sorgusunu değiştirme ihtiyacını buldum, sonunda views_pre_execute ve söz konusu görünümün sorgusunu değiştirdi.

Bu bana çirkin bir saldırı gibi geliyor ve bunu yapmanın daha zarif ve sürdürülebilir bir yolu olup olmadığını merak ediyorum. İdeal olanı, doğrudan Görünümler arayüzünden sorguyu değiştirmeme izin verecek bir yol olacaktır.

23
Mad Scientist

Sorguyu çalıştırmadan önce değiştirmek için hook_views_query_alter() öğesini de kullanabilirsiniz. Bence bu hook_views_pre_execute, ancak sorguyu değiştirmeyi kolaylaştırır. Temel olarak, sorgunun her bir bölümüne anahtarlı bir dizi aracılığıyla erişebilirsiniz. Çok fazla resmi belge bulamadım, ancak bunun güzel bir örneği var https://www.appnovation.com/blog/using-hook-views-query-alter . Bu aynı zamanda Takvim modülündeki bir tarih hatasını düzeltmek için kullanmak zorunda olduğum yaklaşımdır.

25
Chaulky

Genel olarak bu sizin kullanım durumunuza bağlıdır.

Belirli bir şekilde davranması gereken bir alan/filtre/bağımsız değişkene sahip olmak istiyorsanız, bunun için bir işleyici yazmanız önerilir. Daha fazla bilgi için gelişmiş görünüm yardımına bakın.

Sorgunun bazı bölümlerini değiştirmek istiyorsanız hook_views_query_alter () öğesini de kullanabilirsiniz. hook_views_query_alter() ile ilgili kötü olan şey, kodu gerçekten orada yeniden kullanamayacağınızdır.

Bu, belgelerde gösterilen örnek koddur. Kancanın neler yapabileceğine bir örnek verir.

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

Bir görünüm mysql sorgusu değiştirmek için hook_views_query_alter() kullandık. Aşağıdaki örnek Drupal 7 ile 7.x-3.0, özel bir ORDER BY sorgusu:

 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

Doğrudan sql değiştirip değiştiremeyeceğinizi bilmiyorum, ancak kendi alan işleyicinizi yazabilir ve kendi sorgunuzu oluşturabilirsiniz.

1
EricSchaefer