Спеціальний запит у переглядах?


24

У якийсь момент я виявив необхідність змінити SQL-запит, що генерується Views, врешті-решт я переоцінив views_pre_executeі змінив запит для цього конкретного представлення.

Мені це здається некрасивим злом, і мені цікаво, чи існує більш елегантний і доцільний спосіб зробити це. Ідеальним було б спосіб, який дозволив би мені безпосередньо змінити запит із інтерфейсу Views.


1
Це залежить від того, як ви хотіли змінити цей запит. Що саме ви намагалися досягти?
— Джейсон Сміт

@Jason Я опублікував це запитання на тему SO: stackoverflow.com/questions/3147916/… Але ця проблема вирішена зараз, я просто шукаю елегантний спосіб змінити будь-який запит Views, якщо мені доведеться.
— Mad Scientist

Я не переконаний, що ви не можете виконати те, що намагалися зробити в іншій темі, просто використовуючи представлення. Це означає, що існує набагато більше, ніж один спосіб зіштувати цю кішку.
— Джейсон Сміт

Якщо будь-яка з відповідей нижче - те, що ви шукали, ви повинні прийняти один (натисніть прапорець під підрахунком голосів)
— Chaulky

ho_views_pre_execute може бути не найелегантнішим, але у нього є місце для складних перекриття запитів (див. користувацькі перегляди 3 запити в Drupal 7 )
— 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
Я підтвердив, що це працює в Переглядах-3.
— Маркдорісон

1
@Fabian ви повинні прийняти цю відповідь, якщо вона була для вас корисною, або прокоментувати, чому це не так, ми можемо зробити це кращим
— Chaulky

Інший приклад посилань на запити користувальницьких поглядів 3 в Drupal 7, використовуючи hook_views_pre_execute()простий модуль користувача.
— mrP

4

Загалом це залежить від вашого випадку використання.

Якщо ви хочете мати поле / фільтр / аргумент, який повинен вести себе певним чином, рекомендується написати обробник для нього. Додаткову інформацію див. У розширеній довідці переглядів.

Якщо ви хочете змінити деякі частини запиту, ви також можете скористатись пунктом_ук__запрошення () . Погано в тому 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 view. Наступний приклад тестується в рамках 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, але ви можете написати власний обробник поля та оформити власний запит.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.