Задание. Написать сниппет, который выводит на страницу заголовки, аннотации и даты публикации всех новостей, если их всего пять или меньше, а если новостей больше пяти, пусть выводит содержание ресурса «Новости» (того самого контейнера, который является родительским ресурсом всех новостей).
Допустим, id ресурса с новостями 22. Тогда получить все дочерние ресурсы с заголовками, аннотациями и пр. мы можем так:
$where = array('parent' => 22); $resources = $modx->getCollection('modResource',$where); foreach ($resources as $res) { $output .= '<h2>'.$res->get('pagetitle').'</h2>'; $output .= '<p>'.$res->get('introtext').'</p>'; $output .= '<p><small>Дата: '.$res->get('publishedon').'</small></p>'; } return $output;
Теперь добавим в наш код условие с количеством ресурсов:
$where = array('parent' => 22); $resources = $modx->getCollection('modResource',$where); if (count($resources) > 5) { } else { foreach ($resources as $res) { $output .= '<h2>'.$res->get('pagetitle').'</h2>'; $output .= '<p>'.$res->get('introtext').'</p>'; $output .= '<p><small>Дата: '.$res->get('publishedon').'</small></p>'; } } return $output;Ну и, наконец, выводим контент ресурса «Новости», если самих новостей получилось больше пяти:
$where = array('parent' => 22); $resources = $modx->getCollection('modResource',$where); if (count($resources) > 5) { $res = $modx->getObject('modResource',22); $output = $res->get('content'); } else { foreach ($resources as $res) { $output .= '<h2>'.$res->get('pagetitle').'</h2>'; $output .= '<p>'.$res->get('introtext').'</p>'; $output .= '<p><small>Дата: '.$res->get('publishedon').'</small></p>'; } } return $output;
G+
Данный код выведет непосредственных потомков ресурса с id=22.
А как сделать рекурсивный вывод всех ресурсов находящихся в папке с id=22?
Таким образом, код, который получает все дочерние ресурсы будет выглядеть как-то так:
Я думаю, уровень вложенности 50 вам хватит?)) Но лучше поставить тот уровень вложенности, который вам подойдет.
А теперь посмотрим на задачу — зачем нам получать все эти объекты? Может, нам как раз надо получить id-шники и подставить в запрос как дополнительное условие? Тогда нам нужна лишь первая строчка.
Если в случае примера «ближайших» потомков всё в порядке. то в этом случае получаю серьёзные ошибки
Подскажите пожалуйста, в чём проблема?
При использовании кода выше ничего не выводит, но и ошибок нет.
Немного не понятна вот эта конструкция:
Я понимаю, что это условие выборки, но при чем здесь массив?
Сразу извините, если вопрос показался очень глупым, но хочу разобраться до конца.
Даже человеческим языком это будет «Ресурсы, у которых родитель равен 23»
Мы объявляем отдельный массив с одним элементом 'parent'.
Просто смутило, что выборки то ещё нет, и как мы можем в не объявленном массиве что то искать по условию.
Я думал, что в этой конструкции уже работаем с полученным массивом элементов…
Не пинайте сильно, пойду учить параллельно php…
Если я просто добавляю новый элемент в массив, например:
То условие задается как: parent = 7 И id = 9
А если мне например вместо условия И понадобится ИЛИ?
и второй набросок
Лучше воспользоваться готовым компонентом: modstore.pro/payandsee