DocLister icon indicating copy to clipboard operation
DocLister copied to clipboard

Фильтр по >, >=, <, <=

Open Ser1ous opened this issue 6 years ago • 8 comments

https://github.com/AgelxNash/DocLister/blob/master/assets/snippets/DocLister/core/filterDocLister.abstract.php#L153-L168 Эти фильтры приводят входящие данные к числу с плавающей точкой. Но иногда встречаются задачи когда необходимо по дате фильтровать. И если мы превратим дату в число, то получим ошибку. Данные: https://monosnap.com/file/89D7un9U8OmUxYcnEUFeeMCYXZkg7x Пример запроса: https://monosnap.com/file/Qsdd50tPwBowMW4MEy8zdttGhyYQBg

Ser1ous avatar Feb 17 '19 20:02 Ser1ous

Возможно есть смысл разделить фильтры gt lt elt egt будут работать с чистыми данными используя всего-лишь DBAPI::escape() > < <= >= продолжат приводить данные к числу с плавающий точкой

Теоретически, обратная совместимость не должна пострадать. Не придется вводить новые фильтры

AgelxNash avatar Feb 17 '19 20:02 AgelxNash

Мне другая мысль пришла, можно сделать валидацию на число, и если пришло число, то оставляем старый вариант, а если не число, то DBAPI::escape()

Ser1ous avatar Feb 17 '19 20:02 Ser1ous

@Pathologic что думаешь?

AgelxNash avatar Feb 17 '19 21:02 AgelxNash

Мне нравится вариант @Ser1ous В целом это не принципиально, потому что в собственных фильтрах можно переопределить поведение.

Pathologic avatar Feb 18 '19 18:02 Pathologic

@Pathologic у этой валидации есть один косяк, она слишком замудренная. Чтобы максимально предугадать вариант который может придти изобрели вот такой костыль. http://sandbox.onlinephpfunctions.com/code/12e007d7e9ee450a5304a13d904c14711546d5a0 Так как могут прислать разные извращённые цифры. Которые по логике человека могут работать, а по логике машины нет. И именно по этой причине и в текущей реализации есть str_replace. Хотя я считаю что это избыточно и по хорошему человек перед тем как отдать на фильтр данные должен их привести к нужному виду.

Ser1ous avatar Feb 18 '19 20:02 Ser1ous

Добавил в костыль еще одну группу данных для теста http://sandbox.onlinephpfunctions.com/code/9feb7816c2d1f2eaa491fffedce0685d63153d70

<?php
function test($str) {
    echo ((is_numeric($str) || is_numeric(trim(str_replace(',','.',$str)))) ? "float" : "string"),
        "\t",
        $str,
        PHP_EOL;
}

test('2010-02-15'); // string
test('2010.02.15'); // string
test('2010.02'); // float
test('2010,02'); // float

test(''); // string
test('0'); // float
test('10 '); // float
test('b3'); // string
test('4a'); // string

test('.10'); // float
test(',10'); // float
test(' 10'); // float
test('010'); // float

AgelxNash avatar Feb 18 '19 20:02 AgelxNash

Ну и как теперь блин с этими костылями жить? Может не стоит за пользователей думать?

Ser1ous avatar Feb 18 '19 22:02 Ser1ous

В общем предлагаю не тыкать палочкой то, что уже работает более 5 лет еще с версии 1.1.1

Давайте просто добавим новые фильтры для gt, lt, elt, egt с префиксами date, datetime, time, signed, unsigned

Заодно и конкретно в ТВ запихнуть еще целый комплект tvdate, tvdatetime,tvtime

AgelxNash avatar Feb 19 '19 00:02 AgelxNash