Роман

Роман

Был в сети 23 августа 2025, 12:04
Заказы не принимаю
Спасибо большое, но не могу id писать в pagetitle, это индексируется поисковиками, не должно быть лишнего в заголовке.

с ключом parent не понял, в modResource можно только id указать, написал так
$resource=$modx->getObject ('modResource', 2, array('pagetitle'=>$media['title']));
Это из сервиса другого, такой массив прилетает, там просто поля с данными, я просто его распечатываю foreach и все. Тут проблем нет, эти поля записываю уже в MODX, например [id] => 17866422587162642 записываю в TV idpost при создании ресурса

Array
(
    [data] => Array
        (
            [0] => Array
                (
                    [id] => 17866422587162642
                    [media_url] => 
                )
            [1] => Array
                (
                    [id] => 18073012534211706
                    [media_url] => 
                )
            [2] => Array
                (
                    [id] => 17878486537701170
                    [media_url] => 
                )
        )
)
Вот код сниппета, убрал код API другого ресурса откуда массив заполняется, он не нужен, сам массив для примера оставлю, но тут все хорошо, ресурсы добавляются поля заполняются

Array
(
    [data] => Array
        (
            [0] => Array
                (
                    [id] => 17866422587162642
                    [media_url] => 
                )
            [1] => Array
                (
                    [id] => 18073012534211706
                    [media_url] => 
                )
            [2] => Array
                (
                    [id] => 17878486537701170
                    [media_url] => 
                )
        )
)		

foreach($usersMedia['data'] as $media){
////
    $rss = $modx->newObject('modResource');
    $rss->set('template', 2);                     // Назначаем ему нужный шаблон
    $rss->set('isfolder', 1);                         // Указываем, что это не контейнер   
    $rss->set('published', 1);                      // Неопубликован
    $rss->set('createdon', time());              // Время создания
    $rss->set('pagetitle', $media['title');               // Заголовок
    $rss->set('content', $media['caption']);               // Контент
    $rss->set('alias', strtolower($media['username'].'-'.$media['id']));    // Псевдоним
    $rss->set('parent', 2);                 // Родительский ресурс
    $rss->save(); 
    $nid = $rss->get('id');      //получаем ID созданного ресурса
 
    $idpost = $modx->getObject('modTemplateVar',array('name'=>'idpost'));       // Указываем имя нужного TV
    $idpost->setValue($nid, $media['id']);       // Записываем в TV значение
    $idpost->save();
   
    unset($rss); 
    unset($idpost);
   
    $modx->cacheManager->clearCache();      // Кэш тоже чистим
////
 
}
Да да да, я тоже сейчас понимаю что два цикла это неправильно, основной цикл перебор массива полей для новых ресурсов, и в нем я еще раз запускаю цикл, который смотрит все ресурсы и сравнивает поле нового ресурса со старым, и решает если нет ресурса с таким же значением в поле то добавлять. Поэтому думаю и не работает. Одна итерация, с одной записью.

НО я НЕ ЗНАЮ как в массиве через in_array проверить значение в TV поле. Не так силен в php
Да, я тоже подозреваю что в foreach при добавлении я запускаю еще один foreach пробегая по существующим ресурсам это не правильно как то. Можно пример с newQuery?
Я думаю надо как то смотреть наличие поля в массиве в целом, но не понимаю как tv в массиве посмотреть без цикла :(
Но мне не нужно получать ресурс по TV, смысл такой, при создании в цикле, я смотрю в папку parent 2 ВСЕРЕСУРСЫ, смотрю tv idpost, и сравниваю его с новым добавляющимся ресурсом с таким же полем. Если среди ресурсов есть ресурс с таким же значением, пропустить.
Дело в том что дублей как раз в $usersMedia нет, дубли получаются при добавлении в MODX, я вызываю снипет на странице. Если обновлю страницу два раза, страницы добавятся одни и те же. Вот пытаюсь при добавлении пропускать уже добавленные страницы. Сравнивая поле у новых страниц с таким же молем у старых, и что то не получается моя проверка не срабатывает :(
к сожалению не работает, на странице где вызываю сниппет, обновил страницу два раза, добавились страницы одни и те же два раза
сделал так

foreach($usersMedia['data'] as $media){

$resource=$modx->getObject ('modResource', array('pagetitle'=>$media['title']));
if(!$resource){

//Создаём новый ресурс
    $rss = $modx->newObject('modResource');
    $rss->set('template', 2);                     // Назначаем ему нужный шаблон
    $rss->set('isfolder', 1);                         // Указываем, что это не контейнер   
    $rss->set('published', 1);                      // Неопубликован
    $rss->set('createdon', time());              // Время создания
    $rss->set('pagetitle', $media['title']);               // Заголовок
    $rss->set('content', $media['caption']);               // Контент
    $rss->set('alias', strtolower($media['username'].'-'.$media['id']));    // Псевдоним
    $rss->set('parent', 2);                 // Родительский ресурс
    $rss->save(); 
////

}
}
Вы все правильно понимаете, да, но как правильно проверить на pagetitle или idpost???
Это все уникальные поля. idpost в этом поле id с другого сервиса, он уникальный так же как и pagetitle. НО pagetitle может и повториться теоретически.
Спасибо, да уже применил, там единственный косяк, может знаете как побороть. Это то что он в цикле показывает следующие записи. Мне нужны только следующие 2 записи, на странице текущей. Когда мы открываем последнюю запись, то он начинает показывать ПЕРВУЮ как следующую. Поделитесь пожалуйста если знаете как этот момент пофиксить?