@Tarkasha

Как распределить сниппетом ресурсы по годам и месяцам?

Дано: 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 'Ресурсы успешно распределены по годам и месяцам.';
  • Вопрос задан
  • 56 просмотров
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы