Просматривает открытые фильтры в виде списка ссылок вместо выбора - PullRequest
1 голос
/ 30 января 2010

Используя Drupal 6, Views 2 с открытыми фильтрами, я пытаюсь определить наилучший способ преобразования списка выбора в список ссылок, каждая из которых содержит количество совпадающих узлов. Например, вместо того, что я получаю по умолчанию, как список выбора:

<select name="state" class="form-select" id="edit-state" >
<option value="All" selected="selected">&lt;Any&gt;</option>
<option value="AL">Alabama</option>
<option value="AK">Alaska</option>
...
</select>

Я бы хотел получить что-то вроде

<p>Restrict results by state:<br />
<a href="...">Alabama (15)</a><br />
<a href="...">Alaska (7)</a><br />
...
</p>

С каждой ссылкой, показывающей счет в скобках и детализации таким же образом, как при выборе одного из параметров в первом блоке кода.

Не могли бы вы дать какие-либо указания о том, как подойти к этому? Спасибо.

Ответы [ 5 ]

2 голосов
/ 29 июля 2011

Возможно, вы захотите взглянуть на модуль Better Exposed Filters для просмотра. Версия 7.x обладает этой функциональностью, а также имеется патч для версии 6.x, который можно найти по адресу:

http://drupal.org/node/1159232#comment-4710372

1 голос
/ 31 января 2010

Solr - отличное решение, но также просмотрите опцию сводки в Views. Вы можете увидеть пример этого в разделе аргументов представления «Список архивов», которое поставляется с представлениями.

На drupal.org также есть несколько других многогранных модулей просмотра, но у меня нет личного опыта с ними.

0 голосов
/ 29 декабря 2015
<code>
Please go through the following steps to display the select list as year links 
//hook_theme
function mymodule_theme($existing, $type, $theme, $path){
    return array(
        'list_items' => array(
            'template' => 'list_items', //tpl to display them as list
            'path' => $path . '/templates', 
            'type' => 'module',
            'variables' => array(
                'list' => NULL,
                'current' => NULL
            ),
        ),
    );
}
/*
hook_form_alter
*/
function mymodule_form_alter(&$form, &$form_state, $form_id) {
    if($form_id == 'views_exposed_form') {
     $current = '';
     $ranges = explode(':',$form['date_filter']['value']['#date_year_range']);
    foreach($ranges as $key => $range) {
       $ranges[$key] = date('Y', strtotime($range.' years', strtotime(date('Y-m-d H:i:s'))));
    }    
    $startYear = $ranges[0];
    $endYear = $ranges[1];    
    if($ranges[0] > $ranges[1]) {
        $endYear = $ranges[0];
        $startYear = $ranges[1];
    }    
    $items = array();
    $endYear = (int)$endYear;
    $startYear = (int)$startYear;
    if(empty($_REQUEST['date_filter']['value']['year'])) {
    $items[] = 'All years';
    } else {
       $items[] = l('All years', current_path(),array('query' => array("date_filter[value][year]" => '')) );
    }
for($i=$endYear; $i>=$startYear; $i--) {
        if($_REQUEST['date_filter']['value']['year'] == $i) {
         $items[$i] = $i;
        } else {
         $items[$i] = l($i, current_path(), array('query' => array("date_filter[value][year]" => $i)));
}         
}
$list = theme('list_items', array('list' => $items, 'current' => $_REQUEST['date_filter']['value']['year']));
       $form['html'] = array(
        '#type' => 'markup',
        '#markup' => $list,
    );
    }
}
/*
templates/list_items.tpl.php
*/
<ol><?php foreach($list as $key => $value) { if($current == $key || empty($current)) { ?><li class="active"><?php print $value; ?></li>
<?php } else { ?>  <li><?php print $value; ?></li>
 <?php } } ?></ol>
//mymodule.info
name = Filters customization
description = Filters customization
version = VERSION
core = 7.x
dependencies[] = date
</code>
0 голосов
/ 26 апреля 2011

Проверить эту проблему http://drupal.org/node/891974. Код предназначен для количества постов на странице, но его легко можно применить и к другим фильтрам.

0 голосов
/ 31 января 2010

То, что вам нужно, не предназначено для просмотра. Это возможно было бы возможно сделать, но это будет медленным и трудным для реализации.

Вместо этого вы должны взглянуть на модуль, который Acquia сделал для Apache Solr. Он выполняет граненый поиск, который вы действительно пытаетесь сделать. Если ваше дело достаточно простое, вам может не понадобиться что-то столь необычное. Но это просто вопрос времени, прежде чем ты это сделаешь. Производительность станет большой проблемой, так как вам нужно будет сделать запрос для каждого состояния, чтобы получить количество.

...