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


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.