2010-07-06 110 views
1

通過動態我的意思是我希望能夠根據用戶輸入更改SQL查詢。使用自定義動態查詢與Drupal視圖

說如果這是我的自定義查詢,我該如何更改它,以便它在用戶單擊列時按降序和升序之間切換?當你重寫Views生成的查詢時,這甚至是可能的嗎?

<?php 
function views_views_pre_execute(&$view) { 
    if($view->name=="hud_downloads") { 
    $view->build_info['query']="SELECT node.nid AS nid, 
     node.title AS node_title, 
     SUM(pubdlcnt.count) AS pubdlcnt_count 
     FROM node node 
     LEFT JOIN pubdlcnt pubdlcnt ON node.nid = pubdlcnt.nid 
     WHERE (node.type in ('huds')) AND (node.status <> 0) 
     GROUP BY node.nid ORDER BY pubdlcnt_count DESC"; 
    } 
} 
?> 

回答

1

小心,這裏躺着龍。 以下是我完成這件事的方式。首先,您創建顯示感興趣內容的視圖。在你感興趣的所有領域添加排序(數量,價格,標題等)不要擔心它們都不能很好地協同工作,你將在代碼中動態地刪除/改變它們。

我創建了一個模塊來包含一個函數來處理排序。創建一個類型爲「Global:Null」的參數。它可以在任何時候出現在你的列表中,但是該URL地址必須存在一個參數,否則代碼將不會執行。我通常會添加標題或搜索類型。設置參數以顯示所有值(如果不存在)並添加驗證程序。選擇一個PHP驗證器並添加以下內容。

return _mymodule_handle_sortables($view); 

這將允許您快速/方便地編輯功能的內容,而無需編輯/保存視圖/預覽視圖在每次迭代。請注意,我傳遞了$ _GET變量。這不是必須的,因爲無論如何它都應該在函數中可用。我只是爲了便於閱讀而做。

第一步,得到了排序字段的名稱與devel模塊

function _mymodule_handle_sortables(&$view) { 
    dpm($view->sort); 
} 

預覽視圖並注意字段的名稱。獲得它們後,可以執行以下操作來更改視圖的輸出。

function _mymodule_handle_sortables(&$view) { 
    switch ($_GET['sort']) { 
     case 'sell_price_asc': 
      unset($view->sort['title']); 
      $view->sort['sell_price']->options['order'] = 'ASC'; 
      break; 
     case 'sell_price_desc': 
      unset($view->sort['title']); 
      $view->sort['sell_price']->options['order'] = 'DESC'; 
      break; 
     case 'alpha_asc': 
      unset($view->sort['sell_price']); 
      $view->sort['title']->options['order'] = 'ASC'; 
      break; 
     case 'alpha_desc': 
      unset($view->sort['sell_price']); 
      $view->sort['title']->options['order'] = 'DESC'; 
      break; 
    } 
    return true; 
} 

一個PHP頭添加到您的視圖,並添加以下代碼行

<?php echo _mymodule_sortables($_GET); ?> 

現在,您可以動態顯示一個排序標題。這是一個公認的過度的功能來做到這一點。

function _emunications_sortables($g) { 
    // Collect all the relevant GET parameters 
    $gopts = array(); 
    foreach ($g as $k=>$v) { 
     if ($k == 'q') continue; 
     $gopts[$k] = $v; 
    } 

    $opts = http_build_query($gopts); 

    // Preserve the sort choice for selection 
    $s1 = $s2 = $s3 = $s4 = ''; 

    switch ($gopts['sort']) { 
     case 'alpha_asc' : $s1 = 'selected="selected"';break; 
     case 'alpha_desc' : $s2 = 'selected="selected"';break; 
     case 'sell_price_asc' : $s3 = 'selected="selected"';break; 
     case 'sell_price_desc' : $s4 = 'selected="selected"';break; 
    } 

    // Unset the sort option so that it can be set in the url manually below 
    unset($gopts['sort']); 
    $opts_sort = http_build_query($gopts); 

    $output = " 
    <div class='product_index_header'> 
     <div class='view-selection'> 
     <span class='descript'>View: </span> 
     <a class='list' href='/products?$opts'>&nbsp;</a> 
     <span class='bar'>|</span> 
     <a class='grid' href='/products/grid/list?$opts'>&nbsp;</a> 
     </div> 
     <div class='sortable'> 
     <select name='droppy' class='droppy kitteh' onchange=\"window.location.href=$('select.droppy').val()\"> 
      <option value='#'>Sort</option> 
      <option $s1 value='?sort=alpha_asc&amp;$opts_sort'>a-z</option> 
      <option $s2 value='?sort=alpha_desc&amp;$opts_sort'>z-a</option> 
      <option $s3 value='?sort=sell_price_asc&amp;$opts_sort'>$ - $$</option> 
      <option $s4 value='?sort=sell_price_desc&amp;$opts_sort'>$$ - $</option> 
     </select> 
     </div> 
    </div> 
    "; 

    return $output; 
} 
+0

哇,別開玩笑!真棒,但這應該幫助我定製不少東西(不僅僅是排序)。謝謝! – Radu 2010-07-06 15:27:03