뷰의 맞춤 검색어?


24

어느 시점에서 Views에 의해 생성 된 SQL 쿼리를 수정해야한다는 것을 알았으므로 결국 views_pre_execute특정 뷰에 대한 쿼리를 대체 하고 변경했습니다.

이것은 나에게 추악한 해킹처럼 느껴지고 더 우아하고 유지 관리가 가능한 방법이 있는지 궁금합니다. 뷰 UI에서 쿼리를 직접 수정할 수있는 방법이 이상적입니다.


1
해당 쿼리를 수정하려는 방법에 따라 다릅니다. 정확히 무엇을 달성하려고 했습니까?
Jason Smith

@Jason 나는 그때 질문을 SO에 게시했습니다 : stackoverflow.com/questions/3147916/… 그러나 그 문제는 이제 해결되었습니다. 필요하다면 Views 쿼리를 수정하는 우아한 방법을 찾고 있습니다.
미친 과학자

뷰를 사용하여 다른 스레드에서 수행하려는 작업을 수행 할 수 없다고 확신하지 않습니다. 즉,이 고양이를 껍질을 벗기는 방법은 여러 가지가 있습니다.
Jason Smith

아래 답변 중 원하는 답변이 있으면 하나를 수락해야합니다 (투표 수 아래에있는 확인 표시를 클릭하십시오)
Chaulky

hook_views_pre_execute는 가장 우아하지는 않지만 복잡한 쿼리 재정의를 대신 할 수 있습니다 ( Drupal 7의 사용자 지정 뷰 3 쿼리 참조 )
mrP

답변:


25

hook_views_query_alter()쿼리를 실행하기 전에 쿼리를 변경하는 데 사용할 수도 있습니다 . 나는 이것이 비슷 hook_views_pre_execute하지만 쿼리를 쉽게 수정할 수 있다고 생각 합니다. 기본적으로 키 배열을 통해 쿼리의 각 부분에 액세스 할 수 있습니다. 공식 문서를 많이 찾지 못했지만 https://www.appnovation.com/blog/using-hook-views-query-alter에 좋은 예가 있습니다 . 이것은 또한 일정 모듈에서 날짜 버그를 수정하는 데 사용해야했던 접근 방식입니다.


이것이 Views-3에서도 작동합니까?
markdorison

@markdorison 나는 그렇게 믿고 있지만, 그것을 확인하지 않았습니다
Chaulky

3
이것이 Views-3에서 작동 함을 확인했습니다.
markdorison

1
@Fabian이 답변이 도움이 되었으면이 답변을 수락해야하거나 그렇지 않은 이유에 대해 의견을
말해야합니다.

간단한 사용자 정의 모듈에서 사용 하는 Drupal 7의 사용자 정의보기 3 쿼리에 대한 다른 예제 참조 hook_views_pre_execute().
mrP

4

일반적으로 이것은 사용 사례에 따라 다릅니다.

특정 방식으로 작동해야하는 필드 / 필터 / 인수를 가지려면 처리기를 작성하는 것이 좋습니다. 자세한 내용은보기의 고급 도움말을 참조하십시오.

쿼리의 일부를 변경하려면 hook_views_query_alter ()를 사용할 수도 있습니다 . 나쁜 점은 hook_views_query_alter()실제로 코드를 재사용 할 수 없다는 것입니다.

이것은 문서에서 보여지는 예제 코드입니다. 후크가 수행 할 수있는 작업의 예를 제공합니다.

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()뷰를 사용하여 mysql 쿼리를 변경했습니다. 다음 예제는 Drupal 7에서 테스트되었으며 7.x-3.0사용자 지정 ORDER BY절을 쿼리에 추가 합니다.

 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을 직접 변경할 수 있는지 모르겠지만 자체 필드 핸들러를 작성하고 자체 쿼리를 작성할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.