Simpla 2: фильтр заказов по дате

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>Дата с:&nbsp;</label><input type=text name=date_from value='{$date_from}'>&nbsp;
    <label>По:&nbsp;</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 и не забываем благодарить :) ниже!

Отзывы

Оставьте отзыв
На него будут приходить уведомление при ответе. На сайте не публикуется

Модули из этой тематики