На форуме 9558 тем, 76452 сообщений, 44664 участников
тема · 1 574 просмотра · 10 ответов

Как реализовать фильтр Дата начала и дата окончания на ст. заказы (order_list.tpl)

Общие вопросы
читают: 0 участников и 1 гость
порядок
4 апр 2017 21:09#1
Доброго времени суток форумчане.

Подскажите пожалуйста как реализовать вместо фильтра Дата добавления / Дата изменения фильтр Дата начала и дата окончания на странице заказы (/admin/view/template/sale/order_list.tpl)

За основу я взял похожий фильтр на странице (product_purchased.tpl)

code
<div class="form-group">
                <label class="control-label" for="input-date-start"><?php echo $entry_date_start; ?></label>
                <div class="input-group date">
                  <input type="text" name="filter_date_start" value="<?php echo $filter_date_start; ?>" placeholder="<?php echo $entry_date_start; ?>" data-date-format="YYYY-MM-DD" id="input-date-start" class="form-control" />
                  <span class="input-group-btn">
                  <button type="button" class="btn btn-default"><i class="fa fa-calendar"></i></button>
                  </span></div>
              </div>
              <div class="form-group">
                <label class="control-label" for="input-date-end"><?php echo $entry_date_end; ?></label>
                <div class="input-group date">
                  <input type="text" name="filter_date_end" value="<?php echo $filter_date_end; ?>" placeholder="<?php echo $entry_date_end; ?>" data-date-format="YYYY-MM-DD" id="input-date-end" class="form-control" />
                  <span class="input-group-btn">
                  <button type="button" class="btn btn-default"><i class="fa fa-calendar"></i></button>
                  </span></div>


А вот что делать с контроллером и модулем ума не приложу ((( помогите пожалуйста.
4 апр 2017 22:23#3
Я тут поковырялся в /admin/model/sale/order.php

И нашел очень простое решение с одном НО

в общем поменял:

if (!empty($data['filter_date_added'])) {
$sql .= " AND DATE(o.date_added) = DATE('" . $this->db->escape($data['filter_date_added']) . "'😉";


на

if (!empty($data['filter_date_added'])) {
$sql .= " AND (o.date_added) LIKE '%" . $this->db->escape($data['filter_date_added']) . "%'";

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

Ваш-сайт.ru/admin/index.php?route=sale/order&token=qOaFuSwGkваш-токенC3WuXv&filter_date_added=2017-03

то он вам покажет заказы за март (2017-03) чего принципе я и добиваюсь.

Но вот и НО. Как только я ручками ввожу в фильтр 2017-03 он зараза дописывает 2017-03-01 как это пофиксить? чтоб он разрешал вводить часть даты ????
5 апр 2017 11:46#4
Вы как пример посмотрите в \admin\model\report\customer.php
на public function getOrders($data = array()) {

Увидите что LIKE не нужно использовать
5 апр 2017 11:56#5
Ален написал(а): ↑Вы как пример посмотрите в \admin\model\report\customer.php
на public function getOrders($data = array()) {

Увидите что LIKE не нужно использовать


Ален, с LIKE работает, вопрос сейчас в другом, как пофиксить поле ввода даты чтоб оно не дописывало недописанный кусок:

пример:

Я в поле Дата добавления ввожу 2017-03
нажимаю фильтр, а поле само дописывает 2017-03-01
Как избавится от дописывания ????????

А в целом мне нужно например посмотреть заказы за март (2017-03) я ввожу 2017-03 и он мне выводит все заказы за (2017-03), но вот как пофиксить чтоб он не дописывал 2017-03-01 o_O
5 апр 2017 13:28#6
Посмотрите в контроллере вашем. Возможно вы приводите строку в дату, потому так и получается.
Если вы хотите так как указали, то вам нужно просто получить строку.
5 апр 2017 17:32#7
Ален написал(а): ↑Посмотрите в контроллере вашем. Возможно вы приводите строку в дату, потому так и получается.
Если вы хотите так как указали, то вам нужно просто получить строку.


Этим всем правит datetimepicker (/admin/view/javascript/jquery/datetimepicker/moment.js)

Мне кажется этот скрипт (moment.js) мутит воду:
Вложения · 1
5 апр 2017 22:25#8
zver28 написал(а): ↑Мне кажется этот скрипт (moment.js) мутит воду:

не мутит. Вы же выбираете дату, вот вам и результат.
Еще раз перечитайте мое сообщение и поймете, что, чтобы сделать по правильному, то не нужно использовать like в запросе, а нужно другое. Что использовать, я вам уже написал. Вы же идете по своему пути и мутите ))

Если к полю у вас привязан выбор даты (datapicker-bootstrap) то вам нужно иницилизировать правильно формать
Читайте http://eonasdan.github.io/bootstrap-datetimepicker/Options/
6 апр 2017 11:02· изменено#9
Ален написал(а): ↑Вы же выбираете дату, вот вам и результат.


Здравствуйте Ален, я ручками ввожу дату в формате (например): 2017-03 без числа и хочу получать результат с выводом всех заказов за 2017 год, март месяц.) (без клика на иконку с календарем), но вот поле куда я ввожу дату в формате 2017-03 берет и дописывает 2017-03-01 после того как кликаешь в пустое поле, или просто в любое место.

Ален написал(а): ↑чтобы сделать по правильному, то не нужно использовать like в запросе, а нужно другое.


Я понимаю что может быть неправильно использовать LIKE, но оно работает Ален, именно так как надо, то есть система ищет заказы по куску 2017-03 и показывает заказы, ))) это круто:

вот как у меня выглядит запрос:

if (!empty($data['filter_date_added'])) {
$sql .= " AND (o.date_added) LIKE '%" . $this->db->escape($data['filter_date_added']) . "%'";
}

Я не думаю что из-за использования LIKE в запросе, форма ввода даты в (та куда ручками можно вводить ) дописывает дату.

Если я не прав поправьте.
7 апр 2017 20:25#10
Решение найдено:

Всем тем кому нужно что бы родной фильтр на странице (заказы - /admin/view/template/sale/order_list.tpl) Дата добавления и Дата изменения умел показывать не только точную дату добавления или изменения вашего заказа, а еще умел выводить все заказы за определенный месяц или год+месяц, нужно сделать следующее:

1. идем в Модель (/admin/model/sale/order.php) открываем order.php

2. ищем код примерно на (205-207 сроке) следующего содержания:

code
if (!empty($data['filter_date_added'])) {
            $sql .= " AND DATE(o.date_added) = DATE('" . $this->db->escape($data['filter_date_added']) . "')";
        }

if (!empty($data['filter_date_modified'])) {
             $sql .= " AND DATE(o.date_modified) = DATE('" . $this->db->escape($data['filter_date_modified']) . "')";
        }


и меняем его на:

code
if (!empty($data['filter_date_added'])) {
            $sql .= " AND (o.date_added) LIKE '%" . $this->db->escape($data['filter_date_added']) . "%'";
        }
if (!empty($data['filter_date_modified'])) {
            $sql .= " AND (o.date_modified) LIKE '%". $this->db->escape($data['filter_date_modified']) . "%'";
        }


3. Далее идем в /admin/view/javascript/jquery/datetimepicker/bootstrap-datetimepicker.min.js открываем bootstrap-datetimepicker.min.js

ищем строку:

useStrict: false,

и меняем на

useStrict: true,

Это позволит нам вводить в фильтр данные в формате: 2017-03 (покажет все за год+месяц) или 2017 (покажет все за год)

Вроде все. Всем спасибо за участие в решении данной задачи.
8 апр 2017 14:12#11
zver28 написал(а): ↑Далее идем в /admin/view/javascript/jquery/datetimepicker/bootstrap-datetimepicker.min.js открываем bootstrap-datetimepicker.min.js

вот файл лучше не трогать, а в шаблоне добавить нужное, там внизу, где
code
$('.date').datetimepicker({
    pickTime: false
});

об этом вам уже писали впрочем.
сообщения 1–11 из 11
Чтобы ответить, войдите или зарегистрируйтесь.

Похожие темы