使用带有drupal视图的自定义动态查询

时间:2010-07-06 14:54:30

标签: drupal drupal-views sql

动态我的意思是我希望能够根据用户输入更改sql查询。

假设这是我的自定义查询,如何更改它以便在用户单击列时在ORDER BY ... Descending和Ascending之间切换?当您覆盖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 个答案:

答案 0 :(得分: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;
}