Пользовательский запрос в представлениях?

В какой-то момент я нашел необходимость изменить SQL-запрос, сгенерированный Views, в конце концов я переделал views_pre_execute и изменил запрос для этого конкретного представления.

Это кажется уродливым взломом для меня, и мне интересно, есть ли более элегантный и удобный способ сделать это. Идеал был бы способом, который позволил бы мне напрямую модифицировать запрос из пользовательского интерфейса Views.

24 голоса | спросил Mad Scientist 3 MaramThu, 03 Mar 2011 00:33:50 +03002011-03-03T00:33:50+03:0012 2011, 00:33:50

4 ответа


24

Вы также можете использовать hook_views_query_alter(), чтобы изменить запрос до его запуска. Я думаю, что это похоже на hook_views_pre_execute, но облегчает изменение запроса. В основном вы получаете доступ к каждой части запроса с помощью массива с ключом. Я не нашел много официальной документации, но есть хороший пример этого на http: //www. appnovation.com/using-hook-views-query-alter . Это также подход, который мне пришлось использовать для исправления ошибки даты в модуле Calendar.

ответил Chaulky 3 MaramThu, 03 Mar 2011 05:12:36 +03002011-03-03T05:12:36+03:0005 2011, 05:12:36
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' => '=',
          );
        }
      }
    }
  }
}
ответил Daniel Wehner 6 MarpmSun, 06 Mar 2011 12:15:57 +03002011-03-06T12:15:57+03:0012 2011, 12:15:57
3

Я использовал hook_views_query_alter(), чтобы изменить запрос mysql views. Следующий пример проверяется в 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'
     );
   }
 }
ответил Cyclonecode 27 PMpFri, 27 Apr 2012 15:21:17 +040021Friday 2012, 15:21:17
1

Я не знаю, можете ли вы напрямую изменить sql, но вы можете написать свой собственный обработчик полей и обработать свой собственный запрос.

ответил EricSchaefer 3 MaramThu, 03 Mar 2011 00:37:04 +03002011-03-03T00:37:04+03:0012 2011, 00:37:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132