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


24

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 đã ghi đè views_pre_executevà 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 trực tiếp sửa đổi truy vấn từ Giao diện người dùng.


1
Nó phụ thuộc vào cách bạn muốn sửa đổi truy vấn đó. Chính xác thì bạn đang cố gắng đạt được điều gì?
Jason Smith

@Jason Tôi đã đăng câu hỏi lên SO vào thời điểm đó: stackoverflow.com/questions/3147916/ Nhưng Nhưng vấn đề đó đã được giải quyết ngay bây giờ, tôi chỉ tìm một cách thanh lịch để sửa đổi bất kỳ truy vấn Lượt xem nào nếu tôi phải.
Nhà khoa học điên

Tôi không tin rằng bạn không thể hoàn thành những gì bạn đang cố gắng thực hiện trong luồng khác chỉ bằng cách sử dụng chế độ xem. Điều đó nói rằng, có nhiều hơn một cách để da con mèo này.
Jason Smith

Nếu bất kỳ câu trả lời nào dưới đây là những gì bạn đang tìm kiếm, bạn nên chấp nhận một câu trả lời (nhấp vào dấu kiểm bên dưới số phiếu)
Chaulky

hook_view_pre_execute có thể không thanh lịch nhất, nhưng nó có chỗ cho các ghi đè truy vấn phức tạp (xem Truy vấn tùy chỉnh 3 trong Drupal 7 )
mrP

Câu trả lời:


25

Bạn cũng có thể sử dụng hook_views_query_alter()để thay đổi truy vấn trước khi nó chạy. Tôi nghĩ rằng điều này tương tự 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.


Điều này có hoạt động với Views-3 không?
markdorison

@markdorison Tôi tin là như vậy, nhưng chưa xác nhận điều đó
Chaulky

3
Tôi đã xác nhận rằng điều này hoạt động trong Lượt xem-3.
markdorison

1
@Fabian bạn nên chấp nhận câu trả lời này nếu nó hữu ích cho bạn hoặc nhận xét về lý do tại sao nó không để chúng tôi có thể làm cho nó tốt hơn
Chaulky

Một tham chiếu ví dụ khác cho các truy vấn Custom Views 3 trong Drupal 7 bằng cách sử dụng hook_views_pre_execute()trong một mô-đun tùy chỉnh đơn giản.
mrP

4

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 hook_views_query_alter()là bạn không thể thực sự 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' => '=',
          );
        }
      }
    }
  }
}

3

Tôi đã sử dụng hook_views_query_alter()để thay đổi một truy vấn mysql xem. Ví dụ sau được thử nghiệm trong Drupal 7 với 7.x-3.0, nó thêm một ORDER BYmệnh đề tùy chỉnh vào 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'
     );
   }
 }

1

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.