[Решено]Cложный фильтр по цене

Главные вкладки

Аватар пользователя Sanco2 Sanco2 22 ноября 2011 в 4:48

В материале есть n-ное количество числовых полей (услуга/цена). Если настраивать фильтры через views, то для каждой стоки необходимо вводить значение. Получается громоздко и не удобно. Возможно ли при помощи стандартных модулей вводить цену один раз, а поля к которым она будет применяться отмечать чекбоксами?
Если коряво изложил праттачил рисунок, для пояснения)

ВложениеРазмер
Иконка изображения problem.jpg9.7 КБ

Комментарии

Аватар пользователя divined divined 12 декабря 2011 в 13:53

Быстрое решение, которое приходит на ум:

<?php
function mymodule_views_query_alter(&$view, &$query){

  

//$query->where['0']['args']['0'] = $view->args['1']; 
  // Переписываем нужный аргумент в нужную графу запроса

  //В помощь:
  //drupal_set_message('<pre>1: '. print_r($view->args, 1).'</pre>',status);
  //drupal_set_message('<pre>2: '. print_r($view->query, 1).'</pre>',status); 

}
?>
Аватар пользователя divined divined 12 декабря 2011 в 14:26

UnnamedNETUA натолкнул меня на мысль что можно все это сделать через JQuery, т.е.
на ваши радио-буттоны установить обработчик который будет скрывать поле цены для одной услуги и отображать для другой.

Аватар пользователя Sanco2 Sanco2 13 декабря 2011 в 1:28

"UnnamedNETUA" wrote:
У вас на каждое значение новое поле цены?
да, другого решения для этой задачи не нашел.
"divined" wrote:
Быстрое решение, которое приходит на ум:
спасибо, буду пробовать. о результате отпишусь. с js тоже поэкспериментирую.

Аватар пользователя Sanco2 Sanco2 13 декабря 2011 в 2:31

к сожаленю, тут есть еще пара условий, которые (как мне кажется) выполняются только при подобной организации:
- готовый список услуг (over 9000)
- у каждой свое название и стоимость
- группировка полей по категориям услуг
- зависимые от вида организации поля
- они должны выводиться и редактироваться в профиле организации.

если есть другие способы организации подобного с радостью выслушаю)

Аватар пользователя Sanco2 Sanco2 18 декабря 2011 в 9:41

Решили сделать через темизцию фильтров и js. Возник вопрос, как при использовании оператора "между" присвоить дополнительный класс для строк минимальных и максимальных значений? Причем для каждого свой?
На данный момент имем:

<?php
<div id="test1-wrapper" class="form-item">
<
input id="test1-min" class="form-text" type="text" value="" size="30" name="test1[min]" maxlength="128">
</
div>
<
div id="test2-wrapper" class="form-item">
<
label for="test2-max">И: </label>
<
input id="test2-max" class="form-text" type="text" value="" size="30" name="test2[max]" maxlength="128">
?>

Надо:

<?php
<div id="test1-wrapper" class="form-item">
<
input id="test1-min" class="form-text MIN" type="text" value="" size="30" name="test1[min]" maxlength="128">
</
div>
<
div id="test2-wrapper" class="form-item">
<
label for="test2-max">И: </label>
<
input id="test2-max" class="form-text MAX" type="text" value="" size="30" name="test2[max]" maxlength="128">
?>

Аватар пользователя Sanco2 Sanco2 21 декабря 2011 в 13:16

решили следующим способом. темезируем views-exposed-form.tpl.php следующим образом:

<?php if (!empty($q)): ?>  <?php print $q?> <?php endif; ?>
<div class="views-exposed-form">
    
    <?php if ($widgets) { ?>
        <div id="filter">
            <form  name="form" method="post" action="" id="mayform"> 
            <div id="filter_area">
            <?php foreach ($widgets as $id => $widget): ?>    
                <div class="filtr_box"> 
                    <input type="checkbox" name="checkbox[]" value="checkbox" class="selektor" onclick="Go()" />     
                     <label for="<?php print $widget->id?>"><?php print $widget->label?></label> 
                     <div class="filter_widget"><?php print  $widget-> widget ?></div>
                 </div>
            <?php endforeach; ?>
            </div>
            <input type="checkbox" name="total" id="selektor" value="checkbox" onClick="checkAll(this.form,'checkbox[]',this.checked)">все<br>
            </form>
              <input id="text_1" name="textarea">    <input id="text_2" name="textarea">
        </div>
    <?php ?> 
        
    <div id="sort">
        <?php if (!empty($sort_by)): ?> 
            <div class="sort_by"> <?php print $sort_by?> </div>
            <div class="sort_order"> <?php print $sort_order?> </div>   
        <?php endif; ?>
        <div class="submit_button"> <?php print $button?> </div>   
    </div>

</div>

<script type="text/javascript" >

// выделяем все чекбоксы
function checkAll(oForm, cbName, checked)
{for (var i=0; i < oForm[cbName].length; i++) oForm[cbName][i].checked = checked;}

// копируем текст в текстовые области
$(document).ready(function() {

     $('input[class*=form-text]').val(''); 
      
        var g=1;
        $('input[class*=form-text]:even').each(function() {
            $(this).attr('srs','text_1_' + g + '_ch');
            g ++;
        });
        
        var s=1;
        $('input[class*=form-text]:odd').each(function() {
                $(this).attr('srs','text_2_' + s  + '_ch');
                s ++;
        });
        
        var a=1;
        $('input[name=checkbox[]]').each(function() {
                $(this).attr('srs', a + '_ch');
                a ++;
        });
    
    //добавляем класс
    $('.selektor').change(function(event){
        srs = $(this).attr('srs');
        var div = $('input[srs=text_1_'+ srs +']');
       $(this).prop('checked') ? div.addClass('checked_1') : $div.removeClass('checked_1');
        var div = $('input[srs=text_2_'+ srs +']');
        $(this).prop('checked') ? div.addClass('checked_2') : $div.removeClass('checked_2');
            });    

    $('#text_1').keyup(function(){
        data = $(this).val();
        $('input:checkbox:checked').each(function() {
            if($(this).attr('name') == "checkbox[]") {
                srs = $(this).attr('srs');
                $('input[srs=text_1_'+ srs +']').val('').val(data);
            }
        });
    });
    
    $('#text_2').keyup(function(){
        data = $(this).val();
        $('input:checkbox:checked').each(function() {
            if($(this).attr('name') == "checkbox[]") {
                srs = $(this).attr('srs');
                $('input[srs=text_2_'+ srs +']').val('').val(data);
            }
        });
    });

});
</script> 
  
?>

ну и немного css магии:

.filter_widget {display: none;}
Аватар пользователя Sanco2 Sanco2 21 декабря 2011 в 14:13

"divined" wrote:
эээ

$('#test1-min').addClass('MIN');
$('#test2-max').addClass('MAX');

idшников слишком много, они views генеряться, в зависимости от поля.