Есть вопрос который поледнее время мучает мне на нравится как робатется с TV через xPDO да и вобще это прокол MODX. Пытаюсь копенсировать MIGXdb или создавать класс который наследует modResource. Потомучто для магаза или ещё чего не удобно по TV сортировать. Попробовал ClassExtender но помойму туповато. Мог бы поделится как решать проблему. Спасибо.
Не важно xPDO:exec() или что другое. Главное - это SQL правильный. Здесь сам принцип усложняется. Придется делать перебор всех последних веток и в цикле выдергивать по максимум 5 комментариев. Овчинка вообще не стоит выделки.
С xPDO->exec() я ошибся, для выборки он не подойдет.
Для полноты решения нужно еще добавить название топика, но это в общем-то мелочь. Интересно другое - если усложнить задачу, например, не 1 последний комментарий на публикацию, а 5. Тогда только xPDO->exec()?
Кстати, еще раз перечитал заголовок, и усматриваю довольно серьезное непонимание вещей. Ты сравниваешь вообще разные механизмы. Давай по порядку: 1. xPDO::loadClass() - это метод для подгрузки классов, при чем без разницы каких, xPDO-классов или нет. Рассмотрим на примере: если нам нужно создать новый объект, к примеру $modx->newObject('modUser'), то для этого нам нужен класс modUser, то есть его надо подгрузить. Так вот, xPDO::loadClass($className) этим и занимается, и он автоматически вызывается внутри метода newObject() (как и других похожих методов, типа getObject(), getCollection() и т.п.). 2. xPDO::addPackage() нужен для того, чтобы подключить еще один пакет с классами, то есть еще одну директорию (как правило это директория модуля). Когда пакет подключен, то xPDO::loadClass() ищет во всех подключенных модулях, пока не найдет запрошенный класс (если, как писалось выше, третий параметр не установлен в значение true). 3. xPDO::addExtensionPackage() - это просто автоматическое подключение addPackage(), просто для удобства и автоматизации. 4. xPDO::getService() - вот это совсем другая песня. Для нее справедливо и все то, что перечислено выше (так как тоже используется метод loadClass(), и addPackage()(если надо, само собой еще до вызова метода getService())), но этот метод используется для расширения самого объекта $modx. К примеру, $modx->getService($alias, $class); В случае успеха будет доступен объект $modx->$alias, к примеру $modx->mail или $modx->error. И это совсем не для xPDO-классов. Так понятней?
addExtensionPackage очень даже нормально использовать.
Да, подкинули мне задачку на часик... Проблема MySQL в том, что нельзя выполнить сначала сортировку, а потом группировку. Можно только выполнить группировку, а в ней сортировка уже на воле Ктулху. В итоге приходится лепить подзапрос, в котором сортируешь или выборку максимальных делаешь. А такая задача в одном объекте xPDOQuery нереальна. Вот подзапросик добавил в процессор: // Получаем последние комментарии из этих топиков
if($this->getProperty('one_comment_per_thread')){
$ids = array();
$sub_query = $this->modx->newQuery($this->classKey);
$sub_query->select(array(
"max(id) as id",
"thread_id",
));
$sub_query->groupby('thread_id');
$s = $sub_query->prepare();
$s->execute();
while($row = $s->fetch(PDO::FETCH_ASSOC)){
$ids[] = $row['id'];
}
if($ids){
$query->where(array(
"id:in" => $ids,
));
}
} Сейчас выборка последних комментов по одному на диалоговую ветку. А вот верстка будет позже подправлена.
То есть addExtensionPackage вполне нормально использовать? Вопрос стоял у меня и я просто исча на них точные ответы написал статью. Как то так ))))