Выборка ресурсов с TV-параметрами.
Здравствуйте.
Помогите пожалуйста дописать сниппет который будет выбирать ресурсы с TV-параметрами через newQuery.
Просмотрел много статей на сайте, есть с похожими проблемами, но так и не сумел на основе их разобраться со своей.
Вот что пока получается:
Понимаю, что это не совсем правильно, но не представляю как корректно нужно присоединить таблицу с TV.
Помогите пожалуйста дописать сниппет который будет выбирать ресурсы с TV-параметрами через newQuery.
Просмотрел много статей на сайте, есть с похожими проблемами, но так и не сумел на основе их разобраться со своей.
Вот что пока получается:
<?php
$parent = 7;
$resources = array();
$q = $modx->newQuery('modResource');
$q->leftJoin('modTemplateVarResource', 'modTemplateVarResource', 'modResource.id = modTemplateVarResource.contentid');
$q->where(array('modResource.parent' => $parent, 'modResource.published' => 1, 'modResource.deleted' => 0));
$q->select(array('modResource.*', 'modTemplateVarResource.*'));
if ($q->prepare() && $q->stmt->execute()) {
$resources = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
}
echo '<pre>';
echo print_r($resources);
echo '</pre>';Понимаю, что это не совсем правильно, но не представляю как корректно нужно присоединить таблицу с TV.
Комментарии: 3
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Задача такая: есть ресурсы с шаблоном «Семинар» и прикрепленными к ним несколькими TV. В частности TV с именем seminarDatestart, которая содержит дату начала семинара. Нужно выбрать все семинары, у которых дата начала старше текущей даты, т.е. семинары, которые еще не начались.
Все выглядит просто. Используем pdoResources для выборки:
Все выглядит корректно, но сниппет ничего не возвращает. Убираем строку &where=`{«seminarDatestart»:"[[NowTime]]"}` — возвращает все семинары, как и ожидается. Значит условие where не работает.
После долгих проб различных вариантов, решил заглянуть в базу данных. Оказалось, что значение seminarDatestart хранится в базе строкой вида 2015-02-20 23:31:00.
Что за бред?! Зачем вообще хранить в базе дату в виде отличном от timestamp — строку ни отсортировать, ни отфильтровать нормально не получится?! Если я в этом не прав, приведите примеры почему.
В общем, удивившись такой ситуации, понял, что нужно писать свой сниппет. Решил, что нужно получить массив семинаров со всеми TV-параметрами и уже из полученного массива исключить лишние. Вот только правильно приджоинить таблицы с TV у меня не получилось и я решил попросить помощи в этом топике.
Использовать getCollection изначально не хотелось, потому что функция возвращает коллекцию xPDOObjects, что, на мой взгляд дольше выполняется, чем получение чистого массива данных. Вот тут я могу оказаться не прав и с удовольствием выслушаю замечания.
Но даже и с getCollection решить проблему не получалось — не нашел ни одного примера выборки ресурсов со всеми TV-параметрами. Встречались примеры вроде этого, в котором выбираются ресурсы с одним определенным TV. Но на их основе ничего подходящего реализовать у меня не получилось.
Задачу решить не смог, решил передохнуть и подождать помощи в топике. А через три дня сел со свежей головой и сходу придумал альтернативный вариант решения, который в принципе меня удовлетворяет по простоте и скорости.
Выбираем все TV с id = 3 — это идентификатор seminarDatestart. Возвращается примерно следующий массив:
Далее в цикле смотрим: если значение TV больше текущего времени, то сохраняем id ресурса с этим TV, иначе — пропускаем. В результате мы получаем массив с идентификаторами нужных нам ресурсов. А дальше мы можем вызвать тот же pdoResources указав эти индентификаторы в параметре resources.
Задача решена. Получилось много букв, но надеюсь приведенный мной код кому-нибудь поможет.
Ну и, кроме всего прочего, вопрос топика то остается открытым — как, все таки, через newQuery получить список ресурсов со всеми TV-параметрами? Желательно без getCollections.
Он отлично сортируется и в начальном варианте твой сниппет NowTime должен был просто делать так:
Ну а в pdoResources его нужно вызывать вот так:
Обрати внимание, что в условии seminarDatestart:>, то есть дата больше, а сам pdoResources должен быть некэшрованным, потому что текущее время непостоянно.
Вот и всё, вопрос решен.
Свой велосипед, понятно, всегда приятнее и лучше, но уж что даты сортируются — нужно знать. В последней версии pdoTools даже появился параметр &sortbyTVType с вариантами decimal, integer, string и datetime.