Динамическая фильтрация

Тема в разделе "PHP", создана пользователем CnecHa3, 8 апр 2011.

Модераторы: latteo
  1. CnecHa3

    CnecHa3 Постоялец

    Регистр.:
    10 фев 2007
    Сообщения:
    105
    Симпатии:
    20
    Есть предположим 3, 4, 5 сортировок
    При изменении параметра в любой из сортировок должна обновляться информация во всех сортировках
    для того чтобы не было вариант с пустым результатом

    Таблицы:
    filters
    filter_id, filter_title, filter_name, filter_type
    filter_values
    filter_id, value_id, value_text
    item_filters
    item_id, filter_id, value_id
    PHP:
    //Это код поиска, товара
    //$FILTER = array('name'=>'value');
    if(is_array($FILTER) && count($FILTER)){
        foreach(
    $FILTER as $name=>$value){
            if(
    is_numeric($value) && $value 0){
                
    $values[] = $value;
            }
        }   
    }
    $where[] = "i.cat_id IN(".(is_array($id)?implode(",",$id):$id).")";
    if(
    $values$where[] = "f.value_id  IN(".(implode(",",$values)).")";
    if(
    $where){
        
    $where implode(' AND ',$where);    
    }
    $db->query("SELECT i.*, COUNT(i.item_id) as 'qwe' FROM  ".PREFIX."items i LEFT JOIN ".PREFIX."item_filters f ON f.item_id = i.item_id ".($where?"WHERE $where":"")." GROUP  BY i.item_id HAVING qwe >= ".(count($values))." ORDER BY item_added DESC LIMIT $start,$config[per_page]");
    Динамическое обновления это понятно, что будет AJAX

    На данный момент ситуацию спасает select[disabled], но так не хочет клиент:

    Обновления фильтров сейчас....
    PHP:
                $filter $_GET['filter'];
                
    $names = array();
                
    $values = array();
                
    $json = array();
                
    $last $_GET['last'];
                foreach(
    $filter as $name => $value) {
                    if(
    is_numeric($value) && $value 0) {
                        
    $values[] = (int)$value;
                        
    $names[] = "'$name'";
                    }
                }
                
    $query $db->query("SELECT DISTINCT item_id FROM " PREFIX "item_filters WHERE value_id IN (" implode(",",$values) . ")");
                if(
    $db->num_rows($query) > 0) {
                    while(
    $row $db->get_row($query)) {
                        
    $items[] = "'$row[item_id]'";
                    }
                }
                
    $query $db->query("SELECT DISTINCT value_id FROM " PREFIX "item_filters WHERE item_id IN (" implode(",",$items) . ") " . (count($filter) > " AND value_id NOT IN (" implode(",",$values) . ")" "") . "");
                if(
    $db->num_rows($query) > 0) {
                    unset(
    $values);
                    while(
    $row $db->get_row($query)) {
                        if(
    $row['value_id'] > 0)
                            
    $values[] = $row['value_id'];
                    }
                }
                
    $values array_unique($values);
                foreach(
    $values as $vid) {
                    
    $filter $db->super_query("SELECT f2.filter_id FROM " PREFIX "filter_values f1," PREFIX "filters f2 WHERE f1.value_id='$vid' AND f2.filter_id=f1.filter_id");
                    
    $filter_id[] = $filter['filter_id'];
                }
                
    $filter_id array_unique($filter_id);
                foreach(
    $filter_id as $fid) {
                    
    $filter $db->super_query("SELECT filter_title,filter_name_all,filter_name FROM " PREFIX "filters WHERE filter_id=$fid");
                    
    $filter['filter_name_all'] = json($filter['filter_name_all'],$lang);
                    
    $filter['filter_title'] = json($filter['filter_title'],$lang);
                    
    $query $db->query("SELECT value_id,value_text FROM " PREFIX "filter_values WHERE value_id IN(" implode(",",$values) . ") AND filter_id='$fid'");
                    if(
    $db->num_rows($query) > 0) {
                        unset(
    $options);
                        while(
    $row $db->get_row($query)) {
                            
    $row['value_text'] = str_replace('\\','',json($row['value_text'],$lang));
                            
    $item $db->super_query("SELECT f1.item_id FROM " PREFIX "item_filters f1," PREFIX "items f2 WHERE f1.value_id='$row[value_id]' AND f1.item_id=f2.item_id AND f2.cat_id =$id");
                            if(
    $item['item_id'])
                                
    $options[] = $row;
                        }
                        
    $json[] = array('filter_title' => $filter['filter_title'],'filter_name_all' => $filter['filter_name_all'],'filter_name' => $filter['filter_name'],'options' => $options);
                    }
                }
                echo 
    json_encode($json);
     
  2. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    363
    Симпатии:
    117
    >>При изменении параметра в любой из сортировок должна обновляться информация во всех сортировках

    попытался представить шо это такое и как оно выглядит но чет не вышло ...
    сортировка не должна изменять информацию .. а лишь последовательность ее вывода ...

    >>Динамическое обновления это понятно, что будет AJAX
    не обязательно

    >>>Обновления фильтров сейчас....
    тоже попытался вникнуть в то что происходит и не особо вышло.. чет я туплю последнее время ....

    могу лишь сказать что использовать запрос к ДБ в 2 цикле не есть хорошо ... т.к. создаются ливневые запросы ... там бы переписать чуток.. хотя возможно иначе и нельзя .. но по смыслу не оч въезжаю

    да и первые запросы кажысь можно переписать в 1 запрос на пересечения множеств

    ну и есть ненужный код сбивающий с толку ..
    к примеру

    -в первом цикле создается массив $names[] = "'$name'";
    но дальше не используется

    -нет смысла вызывать array_unique т.к. в sQL запросе используется DISTINCT

    - $db->super_query - прикольное название =)

    - if($row['value_id'] > 0) походу value_id - это айдишник какой-то .. какой всегда должен быть >= 0 следовательно проверка лишняя