Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.01.2016, 15:38
Интересующийся
Отправить личное сообщение для greenrow Посмотреть профиль Найти все сообщения от greenrow
 
Регистрация: 22.01.2016
Сообщений: 12

Правильная обарботка результата множественной фильтрации
Добрый день!

на сайте есть возможность фильтрации по различным критериям:
Дата:день,месяц,неделя,выбо р из календаря;
Локация;
Категория;
и т.д

Я реализовал обработку множественных значений следующим образом используя единую точку обработки

1.При клике по любомы элементу из филтра происходит триггер на функцию
Например выбор даты:

$('.proj_sort_menu .proj_date_sort').click(function(){
    var text_rez;
    var cur_data_attr=$(this).attr('data-date');/*находим значение аттрибута*/
    var req_rez;
    switch(cur_data_attr){
         case "thisday":
            text_rez='сегодня'
            req_rez='day';
  
                break;

/*--подобный код---*/
    }
 
    $('.project_time').fadeIn().text(text_rez);/*записываем в блок  результат даты*/

    $('.project_sort_info_click').trigger('click'); //передаем на дальнейшую обработку специальной функции

    
})


А вот эта функция для обработки всех возможных вариантов из фильтрации (например обработки даты)

$('.project_sort_info_click').click(function(){

    var req_rez={};
    var error;

    var project_date=$('.project_time').text();/*здесь получаем значение из фильтра

    /*здесь выводим результата если выбрана только дата*/
    else if(project_date !='' && collection == '' && project_date ==''){
        
        switch(data_type_rez){


              case  "calendar_date":
                 error='нет проектов за выбранную дату';
                 req_rez={date:calendar};
                 break;
             case  "day":
                 error='нет активных проектов за текущий день';
                 req_rez={get_thisdate:'ok'};
                 break;

             case "week":
                 error='нет активных проектов за текущую неделю';
                 req_rez={get_thisweek:'ok'};;
                 break;

             case "month":
                 error='нет активных проектов за текущий месяц';
                 req_rez={get_thismonth:'ok'};
                 break;
        }
       /****тут далее подобный код с различными вариантами например*//

        //collection//
        
    else if(location =='' && collection != '' && project_date ==''){
     
      req_rez={'cat_name':collection};
      error='Нет активных проектов выбранной коолекции'
    }

/*** и так все возможные комбинации*//


//*В самом конце ,после всех проверок отправляем на сервер верный результат и получаем ответ от сервера или ошибку*/
        $.getJSON(get_all_project_url,req_rez,function(data){
                getprog_json(data,error);
     }

[B]Вопрос:[/B]Возможно ли как то оптимизировать обработку множественных значениях фильтрации,может кто то использует при подобных задачах паттерны или другой алгоритм.Мой код рабочий,но с учетом того что еще и на сервер надо обрабатывает все возможные запросы то код получается оочень большим.
Буду благодарен за совет ,если кто использует более эффективные методы в подобных задачах=)
Ответить с цитированием
  #2 (permalink)  
Старый 22.01.2016, 15:48
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от greenrow
В самом конце ,после всех проверок отправляем на сервер верный результат и получаем ответ от сервера или ошибку
Цель запроса сервера?
Ответить с цитированием
  #3 (permalink)  
Старый 23.01.2016, 22:17
Интересующийся
Отправить личное сообщение для greenrow Посмотреть профиль Найти все сообщения от greenrow
 
Регистрация: 22.01.2016
Сообщений: 12

Сообщение от laimas Посмотреть сообщение
Цель запроса сервера?
$.getJSON(get_all_project_url,req_rez,function(data){

	                getprog_json(data,error);

	     }


сервер отдает клиенту массив элементов(проекты)-который формируется исходя выбранного фильтра (параметр req_rez)
На сервере проверяються все возможные варианты запроса ()

else if(Yii::$app->request->get('get_thisday_and_loc')){//day&location
        $loc=Yii::$app->request->get('loc');
        $rez=$proj->get_all_proj_by_day_and_loc($loc);   //запрос к базе данных
    }else if(Yii::$app->request->get('alldate_and_loc')){//allday&location
        $loc_name=Yii::$app->request->get('loc');   
        $rez=$proj->get_all_proj_by_location($loc_name);
else if(Yii::$app->request->get('get_thismohth')){//month
        $rez=$proj->get_all_proj_by_month();   
    
    }/*еще условия*/

    }

и в конце,после проверки(по аналогии с кодом на js) отправляем результата клиенту(все то что находиться в переменной
$rez
,предварительно сформировав необходимый массив


foreach($rez as $key){  
//формируем массив $this->publish_project_info
        }
               
       return json_encode($this->publish_project_info);//отправка данных клиенту

На клиенте js все данные обрабатывает функция
getprog_json(data,error);если в data ничего нет,то выводим сообщение из errror

Понятно что обработка множественных условий требует проверки и на клиенте и на сервере и это не написать в одну строчку.Но все же, вдруг есть другие способы их обработки,более эффективные ..чем мой
Ответить с цитированием
  #4 (permalink)  
Старый 24.01.2016, 08:52
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

$.getJSON(get_all_project_url,req_rez,function(dat a) - это не цель запроса, это сам запрос, а вот сервер отдает клиенту массив элементов(проекты) - который формируется исходя выбранного фильтра, это и есть цель запроса.
Но у вас странная логика в коде. По щелчку по некому элементу project_sort_info_click проверяется то, чего в принципе еще нет на клиенте, так как В самом конце ,после всех проверок отправляем на сервер верный результат. Во-первых что за верный результат, результат чего? Во-вторых и получаем ответ от сервера или ошибку - и что же он должен отдать судя по логике, верно ли проверил клиент?

Вам нужно выбрать записи согласно условиям, при этом выборка будет по одному полю в SQL таблице, если судить по условиям, так? Какую структуру данных от сервера вы ожидаете?

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

Что касается проверки как таковой, то у вас она, фактически, должна быть всего одна - корректный ввод дат, и что на клиенте, что на сервере.

Последний раз редактировалось laimas, 24.01.2016 в 09:02.
Ответить с цитированием
  #5 (permalink)  
Старый 25.01.2016, 01:05
Интересующийся
Отправить личное сообщение для greenrow Посмотреть профиль Найти все сообщения от greenrow
 
Регистрация: 22.01.2016
Сообщений: 12

Спасибо за ответ)

Ниже я постарался поподробнее описать мою реализацию обработки значений из множественной фильтрации.Код рабочий.

Но все же интересно какими алгоритмами вы пользуетесь для подобных задач,(конечно не код нужен и просто информация,может быть паттерн есть)
Сообщение от laimas Посмотреть сообщение
Вам нужно выбрать записи согласно условиям, при этом выборка будет по одному полю в SQL таблице, если судить по условиям, так? Какую структуру данных от сервера вы ожидаете?
.
В фильтре помимо дат(где действительно все просто,так как данные получаем использую mysql функции) есть уже более сложные запросы исходя переданных параметров.

Если выбраны пункты:1-Локация 2-Категория 3-Дата 4-популярные,то соответственно на сервер попадает 4 параметра.Так как в фильтре -Дата есть несколько вариантов выборки(день,неделя и т.п),то получается что на клиенте и сервере это должно быть все обработано и получается оочень большой код проверок

По поводу структуру данных от сервера - здесь все просто:массив данных переводим в json и на клиенте разбираем

json
project_all
	
Object { id="20",  user_id="31",  name="colors",  ещё...}
id "20"
user_id "31"
name "colors"
ava   "/uploads/31/temp/080116_546.png"
date   "2016-01-08"
nickname "test1"
category [Object { name="Фотография"}]
name "Фотография"
likes "0"

Сообщение от laimas Посмотреть сообщение
Но у вас странная логика в коде. По щелчку по некому элементу project_sort_info_click проверяется то, чего в принципе еще нет на клиенте, так как В самом конце ,после всех проверок отправляем на сервер верный результат. Во-первых что за верный результат, результат чего? Во-вторых и получаем ответ от сервера или ошибку - и что же он должен отдать судя по логике, верно ли проверил клиент?
.
Если произошел тригер на элементе $('.project_sort_info_click'),значит какие то данные точно уже есть и мы их ищем)

Например если выбрана дата -неделя и локация -Москва,то сначало данные записываются в определенные теги Например
$('.project_time') //-для даты
а уже потом происходит триггер на функцию обработчик.А функция уже ищет эти данные
$('.project_sort_info_click').click(function(){/*эта функция вызывается когда произошел выбор значения(или значений) из фильтра*/

    var req_rez={};
    var error;
var data_type_rez=$('.project_time').attr('datetype');
    var project_date=$('.project_time').text();/* это и есть данные для фильтра по дате, которые проверяет функция.Аналогично с другими вариантами */

    /*здесь выводим результата если выбрана только дата*/
    else if(project_date !='' && collection == '' && project_date ==''){
        
        switch(data_type_rez){  //это

              case  "calendar_date":
                 error='нет проектов за выбранную дату';
                 req_rez={date:calendar};
                 break;
             case  "day":
                 error='нет активных проектов за текущий день';
                 req_rez={get_thisdate:'ok'};
                 break;

           
        }
       /****тут далее подобный код с различными вариантами 


/*** и так все возможные комбинации*//

        $.getJSON(get_all_project_url,req_rez,function(data){
                getprog_json(data,error);
     }

По поводу верного результата и ошибок.req_rez
Пример
case  "day":
                 error='нет активных проектов за текущий день';
                 req_rez={get_thisdate:'ok'};
                 break;


Пример простой выборки если выбран фильтр по дате-за 1день,то на сервер кидаем параметр req_rez={get_thisdate:'ok'};На сервере смотри если пришел get_thisdate,значит ищем только за 1 день.Если же более сложный запром например фильтр по дате-за 1день локация -москва

то код такой
error='нет активных проектов за текущий день в выбранном городе';
req_rez={get_thisdate_and_loc:'ok',city:'location'};

Если на сервере пришел параметр get_thisdate_and_loc значит я должен прочитать город из параметра city И выбрать за 1 день..
А если нет данных то я вывожу на клиенте перемeнную error

Последний раз редактировалось greenrow, 25.01.2016 в 01:21.
Ответить с цитированием
  #6 (permalink)  
Старый 25.01.2016, 01:28
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,103

greenrow,
таки непонятно зачем на клиенте-то фильтрация настоящая -- если всё-равно сервер этим занимается?
Ответить с цитированием
  #7 (permalink)  
Старый 25.01.2016, 05:30
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

Книга "Стоян Стефанов - JavaScript. Шаблоны" паттерн стратегия .
он там приводит пример на валидации форм ,тебе поможет =)
Ответить с цитированием
  #8 (permalink)  
Старый 25.01.2016, 06:54
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от greenrow
Ниже я постарался поподробнее описать мою реализацию обработки значений из множественной фильтрации.Код рабочий.
Ниже как и раньше все в куче, котлеты, мухи. ) Может лучше начать с того, что вы подразумеваете под понятием "фильтрация"? Ведь:

error='нет активных проектов за текущий день в выбранном городе';
req_rez={get_thisdate_and_loc:'ok',city:'location' };

это никак не ошибка, отсутствие данных в базе по неким критериям, это просто нет их. А запрос на выборку по этим критериям, можно назвать условно фильтрацией, а можно просто выборкой по условиям.
А если в результате запроса запрашиваемые данные или их нет, это не суть понятия фильтрации, это результат, ответ да/нет. А если это подразумевается под фильтрацией, то стоит ли конкретизировать "нет" до мелочей, если выборка производится действительно по множественным параметрам, есть ли в этом смысл?

Я так и не понял причем тут щелчки и триггеры, если у вас банальная задача - отправить набор параметров серверу. А, если, получить ответ "есть/нет" также возложен на клиента, то он даваться должен после запроса:

$.getJSON(..., function(a) {здесь})

А проверки на клиенте, это проверка введенных значений, как собственно и на сервере, и что для сервера является постоянной и обыденной задачей, и в РНР есть для этого набор фильтров.

Если же вам все таки нужна детализация "нет", то однозначно на это можно дать ответ только в том случае, если в результате запроса будут записи, значения которых по всем запрашиваемым параметрам содержат NULL. Например, если таблица содержит поля A, B, C и D, и по этим параметрам производится выборка по условиям, то можно ли ответить "нет данных", если возвращена запись в которой только по полю В не найдено совпадения, а по полям A, C, D есть соответствия, то есть вернет:

A=>1, B=>NULL, C=>2, D=>3

Нет проблем проверить все ключи на наличие данных не только для одной записи, но и целого набора строк, например:

$B = array_diff(array_column($query, 'B'), [null]) ? 'Есть записи' : 'Нет записей'
, где $query массив данных результата запроса (на клиенте нужно проверять при этом наличие/отсутствие свойства в объекте). Если даже каждая запись набора $query в данной колонке будет содержать null, значит ли это что данные не найдены? А если это поле вернет строки и со значениями, и NULL, как в этом случае трактовать? Вы вот что ожидаете:

Object { id="20", user_id="31", name="colors", ещё...}
id "20"
user_id "31"
name "colors"
ava "/uploads/31/temp/080116_546.png"
date "2016-01-08"
nickname "test1"
category [Object { name="Фотография"}]
name "Фотография"
likes "0"

И что для вас критерий "нет" - отсутствие какого либо значения в наборе у каждой сущности, или же есть ли в ответе сущности у которых все значения набора пусты?

Поясните сперва это, можно и без всякого кода, словами, как это делается когда составляется ТЗ.

Последний раз редактировалось laimas, 25.01.2016 в 07:01.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск