Использование нестандартного динамического запроса с представлениями drupal - PullRequest
1 голос
/ 06 июля 2010

Под динамическим я подразумеваю, что хочу иметь возможность изменять SQL-запрос на основе пользовательского ввода.

Скажите, если это мой пользовательский запрос, как я могу изменить его, чтобы он переключался между ORDER BY ..По убыванию и по возрастанию, когда пользователь щелкает столбецВозможно ли это даже при переопределении запроса, который генерирует 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 Ответ

1 голос
/ 06 июля 2010

Осторожно, здесь лежат драконы. Вот как я это сделал. Сначала вы создаете представление, отображающее интересующее вас содержание. Добавляйте сортировки по всем интересующим вас полям (количество, цена, заголовок и т. Д.). Не беспокойтесь о том, что все они работают неправильно, вы будете удалять / изменять их в коде.

Я создаю модуль для функции сортировки. Создайте аргумент типа «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;
}
...