Правильная обарботка результата множественной фильтрации
Добрый день!
на сайте есть возможность фильтрации по различным критериям: Дата:день,месяц,неделя,выбо р из календаря; Локация; Категория; и т.д Я реализовал обработку множественных значений следующим образом используя единую точку обработки 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]Возможно ли как то оптимизировать обработку множественных значениях фильтрации,может кто то использует при подобных задачах паттерны или другой алгоритм.Мой код рабочий,но с учетом того что еще и на сервер надо обрабатывает все возможные запросы то код получается оочень большим. Буду благодарен за совет ,если кто использует более эффективные методы в подобных задачах=) |
Цитата:
|
Цитата:
$.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 Понятно что обработка множественных условий требует проверки и на клиенте и на сервере и это не написать в одну строчку.Но все же, вдруг есть другие способы их обработки,более эффективные ..чем мой |
$.getJSON(get_all_project_url,req_rez,function(dat a) - это не цель запроса, это сам запрос, а вот сервер отдает клиенту массив элементов(проекты) - который формируется исходя выбранного фильтра, это и есть цель запроса.
Но у вас странная логика в коде. По щелчку по некому элементу project_sort_info_click проверяется то, чего в принципе еще нет на клиенте, так как В самом конце ,после всех проверок отправляем на сервер верный результат. Во-первых что за верный результат, результат чего? Во-вторых и получаем ответ от сервера или ошибку - и что же он должен отдать судя по логике, верно ли проверил клиент? Вам нужно выбрать записи согласно условиям, при этом выборка будет по одному полю в SQL таблице, если судить по условиям, так? Какую структуру данных от сервера вы ожидаете? А есть ли записи согласно условию или нет, можно будет знать только после того, как сервер вернет ответ, и как это узнать как раз будет зависеть от структуры данных самого ответа, а если построить запрос должным образом, то возвращенный на запрос ресурс уже будет отвечать на эти вопросы. Что касается проверки как таковой, то у вас она, фактически, должна быть всего одна - корректный ввод дат, и что на клиенте, что на сервере. |
Спасибо за ответ)
Ниже я постарался поподробнее описать мою реализацию обработки значений из множественной фильтрации.Код рабочий. Но все же интересно какими алгоритмами вы пользуетесь для подобных задач,(конечно не код нужен и просто информация,может быть паттерн есть) Цитата:
Если выбраны пункты: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" Цитата:
Например если выбрана дата -неделя и локация -Москва,то сначало данные записываются в определенные теги Например $('.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,
таки непонятно зачем на клиенте-то фильтрация настоящая -- если всё-равно сервер этим занимается? |
Книга "Стоян Стефанов - JavaScript. Шаблоны" паттерн стратегия .
он там приводит пример на валидации форм ,тебе поможет =) |
Цитата:
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" И что для вас критерий "нет" - отсутствие какого либо значения в наборе у каждой сущности, или же есть ли в ответе сущности у которых все значения набора пусты? Поясните сперва это, можно и без всякого кода, словами, как это делается когда составляется ТЗ. |
Часовой пояс GMT +3, время: 12:57. |