Задание. Написать сниппет, который будет выводить на страницу заголовки, анноцации и даты публикации только тех ресурсов, у которых значение TV-параметра «Выводить на главной» равно 1. Или если таких ресурсов больше 10 будет выводить сообщение «Найдено больше 10 ресурсов»У меня id TV-параметра «Выводить на главной» — 3.
Итак. Сначала нам надо найти все объекты класса modTemplateVarResource, у которых значение равно единице:
$tvs = $modx->getCollection('modTemplateVarResource', array('tmplvarid' => 3, 'value' => 1)); foreach ($tvs as $k => $tv) { $tvs[$k] = $tv->toArray(); } print "<pre>"; print_r($tvs);Кроме того у нас в условии есть еще и проверка на количество ресурсов. Вставляем эту проверку перед тем, как начать искать сами ресурсы, чтобы если ресурсов больше 10 у нас скрипт вывел нужную строку, а не начал делать выборку нужных ресурсов.
$tvs = $modx->getCollection('modTemplateVarResource', array('tmplvarid' => 3, 'value' => 1)); if (count($tvs) > 10) return 'Найдено больше 10 ресурсов'; foreach ($tvs as $k => $tv) { $tvs[$k] = $tv->toArray(); } print "<pre>"; print_r($tvs);Ну и если ресурсов меньше десяти, получаем каждый ресурс и значения его полей (не забываем заглянуть сюда, найти там строчку «aggregates» и узнать, какой алиас связи TV-параметра с ресурсом):
$tvs = $modx->getCollection('modTemplateVarResource', array('tmplvarid' => 3, 'value' => 1)); if (count($tvs) > 10) return 'Найдено больше 10 ресурсов'; foreach ($tvs as $tv) { $res = $tv->getOne('Resource'); $output .= "<h3>".$res->get('pagetitle')."</h3>"; $output .= "<p>".$res->get('introtext')."</p>"; $output .= "<small>".$res->get('publishedon')."</small>"; $output .= "\n"; } return $output;
Если все понятно, поздравляю, со связями объектов вы познакомились.
А еще в MODX есть метод makeUrl, которому можно передавать id ресурса
Вот что я нашел по этому поводу bezumkin.ru/training/course2/3006/ ну и плюс вот есть пример кода с присоединением ТВ-параметров ilyaut.ru/cribs-for-modx/sample-resources-filled-with-tv-settings/
Я понимаю, пример кривой, но не понятно почему getOne('Parent') для ресурса не обрабатывается? Заранее спасибо.
Еще небольшой вопрос: я правильно понимаю, что можно использовать любую связь как «aggregates», так и «composites» для любого объекта через getOne или getMany, если она есть? Я к тому, что у связей нет иерархии относительно друг друга, они параллельны, надеюсь вы поняли :)