it-swarm-vi.com

Truy vấn tùy chỉnh trong Lượt xem?

Tại một số điểm, tôi thấy cần phải sửa đổi một truy vấn SQL được tạo bởi Lượt xem, cuối cùng tôi đã vượt qua views_pre_execute và thay đổi truy vấn cho chế độ xem cụ thể đó.

Cảm giác này giống như một bản hack xấu xí đối với tôi và tôi tự hỏi liệu có cách nào thanh lịch và dễ bảo trì hơn để làm điều đó không. Lý tưởng sẽ là một cách cho phép tôi sửa đổi trực tiếp truy vấn từ Giao diện người dùng.

23
Mad Scientist

Bạn cũng có thể sử dụng hook_views_query_alter() để thay đổi truy vấn trước khi chạy. Tôi nghĩ rằng điều này tương tự với hook_views_pre_execute, nhưng làm cho nó dễ dàng hơn để sửa đổi truy vấn. Về cơ bản, bạn có quyền truy cập vào từng phần của truy vấn thông qua một mảng có khóa. Tôi chưa tìm thấy nhiều tài liệu chính thức, nhưng có một ví dụ khá hay về nó tại https://www.appnovation.com/blog/USE-hook-view-query-alter . Đây cũng là cách tiếp cận tôi phải sử dụng để sửa lỗi ngày trong mô-đun Lịch.

25
Chaulky

Nói chung điều này phụ thuộc vào trường hợp sử dụng của bạn.

Nếu bạn muốn có một trường/bộ lọc/đối số nên hoạt động theo một cách nhất định, bạn nên viết một trình xử lý cho nó. Xem trợ giúp nâng cao về quan điểm để biết thêm thông tin.

Nếu bạn muốn thay đổi một số phần của truy vấn, bạn cũng có thể sử dụng hook_view_query_alter () . Điều tệ hại về hook_views_query_alter() là bạn thực sự không thể sử dụng lại mã ở đó.

Đây là mã ví dụ được hiển thị từ tài liệu. Nó đưa ra một ví dụ về những gì hook có thể làm.

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

Tôi đã sử dụng hook_views_query_alter() để thay đổi truy vấn mysql. Ví dụ sau được kiểm tra theo Drupal 7 với 7.x-3.0, nó thêm một tùy chỉnh ORDER BY mệnh đề cho truy vấn:

 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

Tôi không biết nếu bạn có thể trực tiếp thay đổi sql, nhưng bạn có thể viết trình xử lý trường của riêng bạn và tạo truy vấn của riêng bạn.

1
EricSchaefer