Поле дата в типе контента

Работа фильтра по полю дата

#16 18 августа 2016 в 20:06

Подскажите как быть с этим?

Александр Борисов
Вообще, все баги надо описывать тут. Тогда все решения будут именно такими, как надо и не сотрутся при обновлении. А в данном случае надо полностью переписать весь метод applyFilter() как-то так:
  1. public function applyFilter($model, $value) {
  2.  
  3. if (!is_array($value) || !empty($value['date'])){
  4.  
  5. if(!empty($value['date'])){
  6. $date_start = sprintf('%s %02d:%02d', $value['date'], $value['hours'], $value['mins']);
  7. $date_final = $date_start;
  8.  
  9. } else {
  10. $date_start = $value;
  11. $date_final = $value . ' 23:59';
  12. }
  13.  
  14. $model->filterBetween($this->name, date('Y-m-d H:i', strtotime($date_start)), date('Y-m-d H:i', strtotime($date_final)));
  15.  
  16. } else {
  17.  
  18. if (!empty($value['from'])){
  19. $model->filterGtEqual($this->name, date('Y-m-d H:i:s', strtotime($value['from'])));
  20. }
  21. if (!empty($value['to'])){
  22. $model->filterLtEqual($this->name, date('Y-m-d H:i:s', strtotime($value['to'])+60*60*24-1));
  23. }
  24.  
  25. }
  26.  
  27. return $model;
  28.  
  29. }
#17 18 августа 2016 в 23:48


Подскажите как быть с этим?

Александр Борисов
Вообще, все баги надо описывать тут. Тогда все решения будут именно такими, как надо и не сотрутся при обновлении. А в данном случае надо полностью переписать весь метод applyFilter() как-то так:
  1. public function applyFilter($model, $value) {
  2.  
  3. if (!is_array($value) || !empty($value['date'])){
  4.  
  5. if(!empty($value['date'])){
  6. $date_start = sprintf('%s %02d:%02d', $value['date'], $value['hours'], $value['mins']);
  7. $date_final = $date_start;
  8.  
  9. } else {
  10. $date_start = $value;
  11. $date_final = $value . ' 23:59';
  12. }
  13.  
  14. $model->filterBetween($this->name, date('Y-m-d H:i', strtotime($date_start)), date('Y-m-d H:i', strtotime($date_final)));
  15.  
  16. } else {
  17.  
  18. if (!empty($value['from'])){
  19. $model->filterGtEqual($this->name, date('Y-m-d H:i:s', strtotime($value['from'])));
  20. }
  21. if (!empty($value['to'])){
  22. $model->filterLtEqual($this->name, date('Y-m-d H:i:s', strtotime($value['to'])+60*60*24-1));
  23. }
  24.  
  25. }
  26.  
  27. return $model;
  28.  
  29. }

Loadырь

Спасибо. Но увы, ищет по дням от 1 до 9- остальные числа не попадают в фильтр. Когда ищу в диапазоне-день попадает в фильтр.



#18 19 августа 2016 в 06:34
Не могу воспроизвести вашу ошибку, тут есть даты в поле "Дата" — 5, 9, 10, 11, 12, 30 — 08.2016 все они нормально фильтруются.
#19 19 августа 2016 в 06:50


Не могу воспроизвести вашу ошибку, тут есть даты в поле "Дата" — 5, 9, 10, 11, 12, 30 — 08.2016 все они нормально фильтруются.

Loadырь

Да, все правильно ищет. Может фильтр приводился к каким либо изменениям?
#20 19 августа 2016 в 07:03

Может фильтр приводился к каким либо изменениям?

Александр Борисов
Тот, что над контентом, это стандартный — не модифицировался, а тот что в виджете "Расширенный фильтр контента", подвергался изменениям. Но они друг от друга не зависят.
#21 19 августа 2016 в 07:06


Может фильтр приводился к каким либо изменениям?

Александр Борисов
Тот, что над контентом, это стандартный — не модифицировался, а тот что в виджете "Расширенный фильтр контента", подвергался изменениям. Но они друг от друга не зависят.

Loadырь

Попробую установить по новой. Может у меня из-за шаблона так
#22 19 августа 2016 в 07:15
Но я все же догадываюсь, что какие то изменения были.
#23 19 августа 2016 в 08:04

я все же догадываюсь

Александр Борисов
Действительно, это я нагло врут тут. Поставил правки на другой сайт и там ваша проблема всплыла. Значит я что-то починил на первом сайте, сам того не подозревая smile

Скажу даже больше, на дефолте у меня также не ищет по двузначному числу. Даже без моей правки.
#24 19 августа 2016 в 08:55


я все же догадываюсь

Александр Борисов
Действительно, это я нагло врут тут. Поставил правки на другой сайт и там ваша проблема всплыла. Значит я что-то починил на первом сайте, сам того не подозревая smile

Скажу даже больше, на дефолте у меня также не ищет по двузначному числу. Даже без моей правки.

Loadырь

Попробовал по новой установить инстант. Ошибка та же. Буду очень Вам признателен, если подскажите, что вы исправили zst
#25 19 августа 2016 в 09:51

подскажите, что вы исправили

Александр Борисов
Сложно сказать, что я правил, сравнил системные файлы двух сайтов, отличий не обнаружил, возможно где-то в БД собака зарыта.
#26 19 августа 2016 в 15:40


подскажите, что вы исправили

Александр Борисов
Сложно сказать, что я правил, сравнил системные файлы двух сайтов, отличий не обнаружил, возможно где-то в БД собака зарыта.

Loadырь

А вы можете мне исходники скинуть, я сам пороюсь посмотрю
#27 19 августа 2016 в 20:18

я сам пороюсь посмотрю

Александр Борисов
Это врядли. Там слишком много моих наработок прикручено. Вы лучше скачайте с гита версию и попробуйте повторить эту ошибку на ней.
#28 19 августа 2016 в 23:51


я сам пороюсь посмотрю

Александр Борисов
Это врядли. Там слишком много моих наработок прикручено. Вы лучше скачайте с гита версию и попробуйте повторить эту ошибку на ней.

Loadырь
Попробовал. К сожалению все так же. А чем эта версия отличается от последней?
#29 20 августа 2016 в 10:56
Что-то у меня закрадывается такая мысль, что если в \system\core\database.php в функции public function prepareValue дописать что-то типа
if (время = 00:00:00) {время = 00:00:01}
то проблема с попаданием даты с нулевым временем в два дня будет решена.
Вернусь с рыбалки — поэкспериментирую.
#30 20 августа 2016 в 13:57
Loadырь, РЕШЕНО. Магия времени.
При создании объявления, ставив дату, дата записывалась с временем 00:00.
Включил опцию "показывать время". Нажимаю в фильтре "Текущая дата" ставится и время- то есть текущее время не совпадает с 00:00. Поэтому не попадало в фильтр.
Решил так:
в файле date.tpl.php поставил максимальный шаг часов и минут
  1. <?php echo html_select_range($field->data['fname_hours'], 0, 23, 24, true, $field->data['hours']); ?> :
  2. <?php echo html_select_range($field->data['fname_mins'], 0, 59, 60, true, $field->data['mins']); ?>
Теперь выбрать точное время не может. Всегда будет 00:00.
Далее с помощью CSS убрал видимость времени- display: none;
Теперь все работает. Ищет по любой дате.
Может это сделано через одно место, но сильного изменения в коде не произошло и логика поиска не изменилась. Думаю с датами не будет проблем и не всплывет в других функциях времени.
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.