Görünümlerde özel sorgu?


24

Bir noktada, Views tarafından oluşturulan bir SQL sorgusu üzerinde değişiklik yapma gereği duydum, sonunda geçersiz kıldım views_pre_executeve o belirli görünüm için sorguyu değiştirdim.

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


1
Bu sorguyu nasıl değiştirmek istediğinize bağlı. Tam olarak ne yapmaya çalışıyordun?
Jason Smith

@Jason O sırada soruyu SO'ya gönderdim: stackoverflow.com/questions/3147916/… Ancak bu sorun şu an çözüldü, gerekirse herhangi bir Görünüm sorgusunu değiştirmenin zarif bir yolunu arıyorum.
Mad Scientist

Diğer konu içerisinde sadece görünümleri kullanarak yapmaya çalıştığınız şeyi başaramayacağınıza ikna olmadım. Bununla birlikte, bu kediyi cildin birden fazla yolu var dedi.
Jason Smith

Aşağıdaki cevaplardan herhangi biri aradığınız
şeyse

hook_views_pre_execute en şık olmayabilir, ancak karmaşık sorgu geçersiz kılmalar için yerine sahip (bkz. Özel Görünümler, Drupal 7'deki 3 sorguları )
mrP

Yanıtlar:


25

hook_views_query_alter()Sorguyu çalıştırılmadan önce değiştirmek için de kullanabilirsiniz . Bunun benzer olduğunu düşünüyorum hook_views_pre_execute, ancak sorguyu değiştirmeyi kolaylaştırıyor. Temelde, sorgunun her bir bölümüne anahtarlı bir dizi aracılığıyla erişebilirsiniz. Çok fazla resmi belge bulamadım, ancak https://www.appnovation.com/blog/using-hook-views-query-alter adresinde bunun güzel bir örneği var . Takvim modülünde bir tarih hatasını düzeltmek için kullanmam gereken yaklaşım budur.


Bu, Views-3 ile de çalışacak mı?
markdorison

@ markdorison Buna inanıyorum, ancak bunu doğrulamadım
Chaulky

3
Bunun Gösterim-3'te çalıştığını onayladım.
markdorison

1
@Fabian eğer sizin için yararlı olsaydı bu cevabı kabul etmeli ya da neden daha iyi olamayacağına dair yorum yapmalısınız
Chaulky

Özel Görünümler için başka bir örnek referans hook_views_pre_execute()basit bir özel modül kullanarak , Drupal 7'deki sorgular .
mrP

4

Genelde bu kullanım durumunuza bağlıdır.

Belirli bir şekilde davranması gereken bir alan / filtre / argüman olmasını 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ı kısımlarını değiştirmek istiyorsanız, hook_views_query_alter () yöntemini de kullanabilirsiniz . Kötü olan şey hook_views_query_alter()şu ki, oradaki kodu tekrar kullanamazsın.

Bu, belgelerde gösterilen örnek koddur. Kancanın neler yapabileceğine dair 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' => '=',
          );
        }
      }
    }
  }
}

3

hook_views_query_alter()Bir görünüm mysql sorguyu değiştirmek için kullandım . Aşağıdaki örnek Drupal 7 altında test edilmiştir , sorguya 7.x-3.0özel bir ORDER BYmadde ekler :

 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'
     );
   }
 }

1

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.