어느 시점에서 Views에 의해 생성 된 SQL 쿼리를 수정해야한다는 것을 알았으므로 결국 views_pre_execute
특정 뷰에 대한 쿼리를 대체 하고 변경했습니다.
이것은 나에게 추악한 해킹처럼 느껴지고 더 우아하고 유지 관리가 가능한 방법이 있는지 궁금합니다. 뷰 UI에서 쿼리를 직접 수정할 수있는 방법이 이상적입니다.
어느 시점에서 Views에 의해 생성 된 SQL 쿼리를 수정해야한다는 것을 알았으므로 결국 views_pre_execute
특정 뷰에 대한 쿼리를 대체 하고 변경했습니다.
이것은 나에게 추악한 해킹처럼 느껴지고 더 우아하고 유지 관리가 가능한 방법이 있는지 궁금합니다. 뷰 UI에서 쿼리를 직접 수정할 수있는 방법이 이상적입니다.
답변:
hook_views_query_alter()
쿼리를 실행하기 전에 쿼리를 변경하는 데 사용할 수도 있습니다 . 나는 이것이 비슷 hook_views_pre_execute
하지만 쿼리를 쉽게 수정할 수 있다고 생각 합니다. 기본적으로 키 배열을 통해 쿼리의 각 부분에 액세스 할 수 있습니다. 공식 문서를 많이 찾지 못했지만 https://www.appnovation.com/blog/using-hook-views-query-alter에 좋은 예가 있습니다 . 이것은 또한 일정 모듈에서 날짜 버그를 수정하는 데 사용해야했던 접근 방식입니다.
hook_views_pre_execute()
.
일반적으로 이것은 사용 사례에 따라 다릅니다.
특정 방식으로 작동해야하는 필드 / 필터 / 인수를 가지려면 처리기를 작성하는 것이 좋습니다. 자세한 내용은보기의 고급 도움말을 참조하십시오.
쿼리의 일부를 변경하려면 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' => '=',
);
}
}
}
}
}
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'
);
}
}