DocLister
DocLister copied to clipboard
Фильтр по >, >=, <, <=
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
Возможно есть смысл разделить фильтры
gt
lt
elt
egt
будут работать с чистыми данными используя всего-лишь DBAPI::escape()
>
<
<=
>=
продолжат приводить данные к числу с плавающий точкой
Теоретически, обратная совместимость не должна пострадать. Не придется вводить новые фильтры
Мне другая мысль пришла, можно сделать валидацию на число, и если пришло число, то оставляем старый вариант, а если не число, то DBAPI::escape()
@Pathologic что думаешь?
Мне нравится вариант @Ser1ous В целом это не принципиально, потому что в собственных фильтрах можно переопределить поведение.
@Pathologic у этой валидации есть один косяк, она слишком замудренная. Чтобы максимально предугадать вариант который может придти изобрели вот такой костыль. http://sandbox.onlinephpfunctions.com/code/12e007d7e9ee450a5304a13d904c14711546d5a0 Так как могут прислать разные извращённые цифры. Которые по логике человека могут работать, а по логике машины нет. И именно по этой причине и в текущей реализации есть str_replace. Хотя я считаю что это избыточно и по хорошему человек перед тем как отдать на фильтр данные должен их привести к нужному виду.
Добавил в костыль еще одну группу данных для теста 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
Ну и как теперь блин с этими костылями жить? Может не стоит за пользователей думать?
В общем предлагаю не тыкать палочкой то, что уже работает более 5 лет еще с версии 1.1.1
Давайте просто добавим новые фильтры для gt
, lt
, elt
, egt
с префиксами
date
, datetime
, time
, signed
, unsigned
Заодно и конкретно в ТВ запихнуть еще целый комплект tvdate
, tvdatetime
,tvtime