it-swarm.dev

뷰의 맞춤 검색어?

어느 시점에서 뷰에 의해 생성 된 SQL 쿼리를 수정해야한다는 것을 알게되었습니다. 결국에는 views_pre_execute하고 해당 특정보기에 대한 검색어를 변경했습니다.

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

23
Mad Scientist

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

25
Chaulky

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

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

쿼리의 일부를 변경하려면 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' => '=',
          );
        }
      }
    }
  }
}
4
Daniel Wehner

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

SQL을 직접 변경할 수 있는지 모르겠지만 자체 필드 핸들러를 작성하고 자체 쿼리를 작성할 수 있습니다.

1
EricSchaefer