Задание. Написать сниппет, который будет выводить на страницу заголовки, анноцации и даты публикации только тех ресурсов, у которых значение 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;Если все понятно, поздравляю, со связями объектов вы познакомились.
Объектная
Array ( [1] => Array ( [id] => 1 [tmplvarid] => 1 [contentid] => 1 [value] => krysyulya.jpg ) ...$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 .= "<small>".$res->get('TV_parametr_img')."</small>"; ??????? $output .= "\n"; } return $output;$output .= "<small>".$res->getTVValue('TV_parametr_img')."</small>";$res->get('uri');А еще в MODX есть метод makeUrl, которому можно передавать id ресурсаВот что я нашел по этому поводу bezumkin.ru/training/course2/3006/ ну и плюс вот есть пример кода с присоединением ТВ-параметров ilyaut.ru/cribs-for-modx/sample-resources-filled-with-tv-settings/
[[!pdoResources? &parents=`17` &tvFilters=`myTV==1`]]<?php $resources = $modx->getCollection('modResource'); foreach ($resources as $res) { $parent = $res->getOne('Parent'); $output .= $parent->get('pagetitle'); } return $output;Я понимаю, пример кривой, но не понятно почему getOne('Parent') для ресурса не обрабатывается? Заранее спасибо.<?php $resources = $modx->getCollection('modResource'); foreach ($resources as $res) { if ($parent = $res->getOne('Parent')) { $output .= $parent->get('pagetitle'); } } return $output;Еще небольшой вопрос: я правильно понимаю, что можно использовать любую связь как «aggregates», так и «composites» для любого объекта через getOne или getMany, если она есть? Я к тому, что у связей нет иерархии относительно друг друга, они параллельны, надеюсь вы поняли :)