it-swarm-eu.dev

Vlastní dotaz v zobrazeních?

V určitém okamžiku jsem zjistil, že je třeba upravit SQL dotaz generovaný pomocí Views, nakonec jsem overrode views_pre_execute a změnil dotaz pro toto konkrétní zobrazení.

Připadá mi to jako ošklivý hack a já přemýšlím, jestli existuje elegantnější a udržovatelnější způsob, jak to udělat. Ideální by byl způsob, který by mi umožnil přímo upravit dotaz z uživatelského rozhraní Pohledy.

24
Mad Scientist

Můžete také použít hook_views_query_alter() ke změně dotazu před jeho spuštěním. Myslím, že je to podobné hook_views_pre_execute, ale usnadňuje úpravu dotazu. V podstatě získáte přístup ke každé části dotazu pomocí klíčového pole. Našel jsem mnoho oficiálních dokumentů, ale je to docela dobrý příklad na https://www.appnovation.com/blog/using-hook-views-query-alter . To je také přístup, který jsem musel použít k opravě datové chyby v modulu Calendar.

25
Chaulky

Obecně to záleží na vašem případu použití.

Pokud chcete mít pole/filtr/argument, který by se měl chovat určitým způsobem, doporučuje se pro něj napsat popisovač. Další informace naleznete v pokročilé nápovědě k pohledům.

Pokud chcete změnit některé části dotazu, můžete také použít hook_views_query_alter () . Špatnou věcí na hook_views_query_alter() je to, že tam opravdu nemůžete znovu použít kód.

Toto je ukázkový kód zobrazený v dokumentaci. Je příkladem toho, co může háček udělat.

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

Použil jsem hook_views_query_alter() ke změně pohledu mysql dotazu. Následující příklad je testován pod Drupal 7 s 7.x-3.0, přidá vlastní ORDER BY klauzule dotazu:

 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

Nevím, jestli můžete přímo změnit SQL, ale můžete napsat svůj vlastní popisovač pole a vytvořit svůj vlastní dotaz.

1
EricSchaefer