Дано: Modx, коллекции, и много дочерних ресурсов. У меня на сайте есть главная категория Новости, внутри этой категории есть коллекции, например Экономика, общество, наука. Каждая коллекция это более 500 ресурсов. Я пытаюсь написать сниппет, который бы работал так: Я указываю главного родителя, он начинает парсить дочерние коллекции второго уровня (дочерние коллекции рубрики Новости). После чего он фильтрует ресурсы по полю publishedon. Далее он проверяет, если в дочерней коллекции еще не создан контейнер коллекция с голом или месяцем, он ее создает, и перемещает туда ресурсы. Структура такая news/economic/2023/09. То есть, скрипт берет ресурс, смотрит его дату, если publishedon 15/09/2023, он проверяет есть ли в ресурсе Экономика дочерний ресурс-коллекция /2023/ За тем /09/ если их нет, он создает, если есть то туда перемещает ресурс. Также хотелось бы запускать этот скрипт из под CRON.
Пробовал использовать данный сниппет, но он в 500 уходит:
<?php
/**
* Скрипт для распределения ресурсов по годам и месяцам в MODX.
*/
// Абсолютный путь к файлу config.core.php
require_once '/var/www/obitel-minsk/data/www/proxy.obitel-minsk.ru/parce/config.core.php';
// ID родителя, в котором находятся ресурсы
$parentID = 1; // Замените на нужный ID
// Подключение к базе данных MODX
require_once MODX_CORE_PATH . 'model/modx/modx.class.php';
$modx = new modX();
$modx->initialize('web');
// Получение текущей даты
$currentDate = date('Y-m-d');
// Функция для создания контейнера (года или месяца)
function createContainer($parentID, $title) {
global $modx;
$container = $modx->newObject('modResource');
$container->set('parent', $parentID);
$container->set('pagetitle', $title);
$container->set('alias', strtolower(str_replace(' ', '-', $title))); // Генерация alias
$container->set('template', 3); // Замените на ID шаблона по вашему выбору
$container->set('published', 1);
$container->set('class_key', 'modCollection'); // Тип: Коллекция
$container->save();
return $container->get('id');
}
// Получение всех дочерних ресурсов первого уровня
$resources = $modx->getCollection('modResource', array(
'parent' => $parentID,
'level' => 2, // Уровень 2 соответствует дочерним ресурсам первого уровня
));
foreach ($resources as $resource) {
$publishedOn = $resource->get('publishedon');
// Фильтруем по дате (если она не больше текущей даты)
if ($publishedOn <= $currentDate) {
$year = date('Y', strtotime($publishedOn));
$month = date('m', strtotime($publishedOn));
// Создание контейнера для года (если не существует)
$yearContainer = $modx->getChild($parentID, $year);
if (!$yearContainer) {
$yearContainer = createContainer($parentID, $year);
}
// Создание контейнера для месяца (если не существует)
$monthContainer = $modx->getChild($yearContainer, $month);
if (!$monthContainer) {
$monthContainer = createContainer($yearContainer, $month);
}
// Перемещение ресурса в контейнер месяца
$resource->set('parent', $monthContainer);
$resource->save();
}
}
// Очищаем кэш MODX
$modx->cacheManager->refresh();
echo 'Ресурсы успешно распределены по годам и месяцам.';