Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”
Выборка активных и не активных страниц через Selector

Автор atachРаздел Custom макросы

Ответов: 2
Просмотров: 2140
Последний ответ 24 Апреля 2016, 13:02:38
от atach
UMI.Selector: выборка заказов только зарегистрированных пользователей

Автор atachРаздел Custom макросы

Ответов: 1
Просмотров: 1997
Последний ответ 25 Мая 2017, 16:10:05
от admin
API.Selector повторное использование результата выборки ...

Автор atachРаздел Макросы UMI.CMS

Ответов: 7
Просмотров: 7451
Последний ответ 22 Июня 2014, 06:30:24
от admin
Selector - between и поля типа optioned

Автор andreyРаздел Макросы UMI.CMS

Ответов: 2
Просмотров: 3760
Последний ответ 16 Января 2014, 14:59:06
от admin
Selector order по полю цены

Автор SeinteroРаздел Шаблоны XSLT

Ответов: 52
Просмотров: 10773
Последний ответ 25 Марта 2016, 11:13:44
от aghigay

0 Пользователей и 1 Гость просматривают эту тему.

*

Alexey

  • *
  • 42
  • +3/-0
    • Просмотр профиля
При реализации разного рода задач приходится нередко использовать API, а конкретнее - класс selector.

Все бы было ничего, но в процессе решения одной из задач столкнулся со следующими проблемами:

1. Методы фильтрации less, more и т.п., применяемые к полю, имеющему тип "Дата", работают некорректно.

Логичнее всего, как я подумал сначала, подавать дату в timestamp, ведь именно в таком виде она и хранится в БД, однако в таком случае возвращается вообще 0 объектов (хотя по timestamp та же сортировка выполняется корректно).

Вставки кода приведу только с проблемными местами, чтобы не было ничего лишнего:

$element_ldate="1359333515";
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->where('1c_exchange_date')->more($element_ldate);

При указывании даты в формете "Y-m-d H:i:s" (такой, как мы видим ее в админке, по сути, согласно заданному формату default-date-format в config.ini, секция system) отбор работает, но только с точностью до минут. Для решения задачи учитывать секунды обязательно.

$element_ldate="2013-01-28 00:38:35"";
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->where('1c_exchange_date')->more($element_ldate);

С less, а также с дополнительной приставкой равенства eq ситуация такая же.

А between, насколько я помню, наоборот, корректно работает с timestamp, а вот такой формат, увы, не переваривает. Естественно, ничего из этого не документировано.

2. Попробовал применить методы less и more для системного поля id.

Тут просто выводим объекты каталога и сортируем их по id по убыванию.

$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->order('id')->desc();

На выходе если выведем id, получим следующее:
3136, 3135, 3134, ..., 258, 257, 256.
Итого: 2659 объектов.

Далее, предположим, мне нужно дополнительно отсечь еще и все объекты, id у которых меньше 3136. Дописываем заветную строчку:

$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->where('id')->less(3136);
$pages->order('id')->desc();

На выходе получаем:
2806, 2805, 2804, ..., 258, 257, 256.
Итого: 2462 объекта

В итоге погрешность составляет 2659-2462=197~200 объектов при попытке отсеять всего лишь 1 объект.

Для more ситуация ничуть не лучше.

$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->where('id')->more(1000);
$pages->order('id')->desc();

3136, 3135, 3134, ..., 674, 673, 672.

Если вместо 1000 будет, к примеру, 500, то массив вообще остается без изменений, т.е. конечный объект по-прежнему имеет id 256.

C дополнительной приставкой равенства eq ситуация такая же.

Подскажите, что я делаю не так, или действительно такая ошибка имеет место? Может быть она появляется только для поля id?

P.S. Тестирую в standalone файле, результаты вывожу в foreach.




« Последнее редактирование: 31 Января 2013, 21:13:02 от Alexey »

*

Alexey

  • *
  • 42
  • +3/-0
    • Просмотр профиля
Разобрался в обеих проблемах в тот же день, чуть позже могу написать, в чем именно они заключались. Так что вопросы уже не актуальны.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Может вопросы и не актуальны, но буду очень вам признателен, если найдете время описать, в чем же была причина такого поведения системы.