Simpla 2: фильтр заказов по дате
Открывает файла шаблона заказов simpla/design/html/orders.tpl и в начале файла вместо
{literal} <script> $(function() {
добавим яваскрипт обработчика календарных полей
{literal} <script src="design/js/jquery/datepicker/jquery.ui.datepicker-ru.js"></script> <script> function show_fields() { document.getElementById("filter_fields").style.display = document.getElementById("check").checked ? 'block' : 'none'; } $(function() { $('input[name="date_from"]').datepicker({regional:'ru'}); $('input[name="date_to"]').datepicker({regional:'ru'});
Ну и сами фильтры - после вывода фильтров по меткам заказа
<!-- Метки --> {/if}
добавим код
<h4>Период</h4> <ul id="filter-date"> <li {if $date_filter == today}class="selected"{/if}><a href="{url date_filter=today date_to=null date_from=null filter_check=null}">Сегодня</a></li> <li {if $date_filter == this_week}class="selected"{/if}><a href="{url date_filter=this_week date_to=null date_from=null filter_check=null}">Текущая неделя</a></li> <li {if $date_filter == this_month}class="selected"{/if}><a href="{url date_filter=this_month date_to=null date_from=null filter_check=null}">Текущий месяц</a></li> <li {if $date_filter == this_year}class="selected"{/if}><a href="{url date_filter=this_year date_to=null date_from=null filter_check=null}">Текущий год</a></li> <li {if $date_filter == all}class="selected"{/if}><a href="{url date_filter=all date_to=null date_from=null filter_check=null}">Все</a></li> </ul> {* Фильтр *} <div style="display: block; clear:both; border: 1px solid #C0C0C0; margin: 10px 0; padding: 10px"> <form method="get"> <div id='filter_check'> <input type="checkbox" name="filter_check" id="check" value='1' {if $filter_check}checked{/if} onclick="show_fields();"/> <label for="check">Заданный период</label> </div> <div id='filter_fields' {if !$filter_check}style="display: none"{/if}> <input type="hidden" name="module" value="OrdersAdmin"> <input type="hidden" name="date_filter" value=""> <input type="hidden" name="status" value="{$status}"> <div style="margin: 15px 0"> <label>Дата с: </label><input type=text name=date_from value='{$date_from}'> <label>По: </label><input type=text name=date_to value='{$date_to}'> </div> <input id="apply_action" class="button_green" type="submit" value="Применить"> </div> </form> </div>
Разъяснять этот код смысла не вижу, т.к. достаточно очевидный он - это разные предустановленные периоды фильтрации и блок с календарями.
Теперь добавим обработчик на этот шаблон - открываем файл simpla/OrdersAdmin.php. Перед кодом (строка 31)
// Обработка действий if($this->request->method('post'))
добавим обработчик
$date_filter = $this->request->get('date_filter'); if(!empty($date_filter)) { $filter['date_filter'] = $date_filter; $this->design->assign('date_filter', $date_filter); } $date_from = $this->request->get('date_from'); $date_to = $this->request->get('date_to'); $filter_check = $this->request->get('filter_check'); if(!empty($filter_check)){ if(!empty($date_from)){ $filter['date_from'] = date("Y-m-d 00:00:01",strtotime($date_from)); $this->design->assign('date_from', $date_from); } if(!empty($date_to)){ $filter['date_to'] = date("Y-m-d 23:59:00",strtotime($date_to)); $this->design->assign('date_to', $date_to); } $this->design->assign('filter_check', $filter_check); } if(empty($filter['date_filter'])) { $filter['date_filter'] = 'all'; $this->design->assign('date_filter', 'all'); }
С этим файлом все - он просто передает запрос дальше в выборку списка заказов и возвращает переменные обратно в шаблон.
Теперь основной файл api/Orders.php. Нам надо в 2 метода get_orders и count_orders добавить наши новые фильтры - поэтому для всех свтавок будет приводиться 2 базовых строки. Сами вставки одинаковы, просто их надо вставить в двух местах. Перед кодом (строки 44 и 113)
$user_filter = '';
добавим
$period_filter = ''; $date_filter = '';
Далее в этом же файле перед (строки 80 и 182)
// Выбираем заказы
добавим
if(isset($filter['date_from']) && !isset($filter['date_to'])){ $period_filter = $this->db->placehold('AND o.date > ?', $filter['date_from']); } elseif(isset($filter['date_to']) && !isset($filter['date_from'])){ $period_filter = $this->db->placehold('AND o.date < ?', $filter['date_to']); } elseif(isset($filter['date_to']) && isset($filter['date_from'])){ $period_filter = $this->db->placehold('AND (o.date BETWEEN ? AND ?)', $filter['date_from'], $filter['date_to']); } if(isset($filter['date_filter'])) { switch ($filter['date_filter']){ case 'today': $date_filter = 'AND DATE(o.date) = DATE(NOW())'; break; case 'this_week': $date_filter = 'AND WEEK(o.date - INTERVAL 1 DAY) = WEEK(now()) AND YEAR(o.date) = YEAR(now())'; break; case 'this_month': $date_filter = 'AND MONTH(o.date) = MONTH(now()) AND YEAR(o.date) = YEAR(now())'; break; case 'this_year': $date_filter = 'AND YEAR(o.date) = YEAR(now())'; break; } }
Ну и наконец добавим эти фильтры непосредственно в сам запрос - после кода (строки 137 и 236)
$keyword_filter
добавим
$period_filter $date_filter
Вот и все на сегодня!
Удачи в использовании SimplaCMS и не забываем благодарить :) ниже!
Если дата "от" появляется а "по" нет, то, скорее всего, ошибка при выполнени инструкции.