Всего 125 668 комментариев

Роман
25 января 2021, 01:39
0
Да, удалил свой второй цикл в основном цикле.
Роман
25 января 2021, 01:39
0
Понял :) так работает, но все таки как при таком варианте ограничить по parent можно? И все таки сравнивать не title a tv.
Артур Шевченко
25 января 2021, 01:35
0
А где проверка? Удалили? Или и не добавляли?
Роман
25 января 2021, 01:33
0
Вот код сниппета, убрал код 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();      // Кэш тоже чистим
////
 
}
Артур Шевченко
25 января 2021, 01:30
1
+1
Да не нужно вам это TV, выше уже написал почему))
Вот весь код который нужен
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(); 
////

}
}
Роман
25 января 2021, 01:26
0
Да да да, я тоже сейчас понимаю что два цикла это неправильно, основной цикл перебор массива полей для новых ресурсов, и в нем я еще раз запускаю цикл, который смотрит все ресурсы и сравнивает поле нового ресурса со старым, и решает если нет ресурса с таким же значением в поле то добавлять. Поэтому думаю и не работает. Одна итерация, с одной записью.

НО я НЕ ЗНАЮ как в массиве через in_array проверить значение в TV поле. Не так силен в php
Артур Шевченко
25 января 2021, 01:26
0
Какой второй цикл, его там быть не должно. Надо перебрать только $userMedia['data']
Артур Шевченко
25 января 2021, 01:24
0
Если так хочется использовать уникальный id, то записывайте его в pagetitle, поскольку это поле должно быть уникальным, как я уже говорил и делайте проверку, о которой я уже писал, не усложняйте. Я понимаю, что сейчас это не работает, но нужно искать ошибку, а не усложнять решение.
Артур Шевченко
25 января 2021, 01:21
0
Так вот, для чего вы получали $docs. Это конечно ваш код, но на мой делетантский взгляд, такой подход нерационален. Вам нужно создать TV, в цикле его получать, преобразовывать в массив, проверять есть ли в массиве текущий id, если нет, то создавать ресурс и добавлять новый id в массив, массив преобразовывать а строку, строку записывать в tv и сохранять изменения. Вам не кажется что это избыточный путь?
Роман
25 января 2021, 01:15
0
Да, я тоже подозреваю что в foreach при добавлении я запускаю еще один foreach пробегая по существующим ресурсам это не правильно как то. Можно пример с newQuery?
Я думаю надо как то смотреть наличие поля в массиве в целом, но не понимаю как tv в массиве посмотреть без цикла :(
Роман
25 января 2021, 01:13
0
Но мне не нужно получать ресурс по TV, смысл такой, при создании в цикле, я смотрю в папку parent 2 ВСЕРЕСУРСЫ, смотрю tv idpost, и сравниваю его с новым добавляющимся ресурсом с таким же полем. Если среди ресурсов есть ресурс с таким же значением, пропустить.
Alexey
25 января 2021, 01:11
0
Я понял) Внутренний форыч по существующим ресурсам с проверкой внутри не подходит. Нужно на каждой итерации массива $usersMedia['data'] одним запросом проверить, есть ли такое TV- поле в ресурсах указанного родителя. К примеру, через newQuery составить запрос. И если поля нет, то создавать ресурс.
Артур Шевченко
25 января 2021, 01:09
0
Да можно, в принципе, но получить ресурс по TV сложнее. Где-то у вас ошибка, и вам нужно её найти. Выведите в лог входные данные и пришлите сюда, посмотрим.
Роман
25 января 2021, 01:02
0
А можно вместо title все таки сравнивать в существующих страницах с полем TV idpost а в новых $media['id']?
Просто в этом поле уникальных номер такой например 18073012534211706
Артур Шевченко
25 января 2021, 00:57
0
Вообще-то должно работать. Проверьте что находится в $media['title'] и в $resource->get('pagetitle'), может там пробелы какие или спецсимволы или ещё что-то и значения не совпадают. Я в коде ошибки не вижу, а то что проверка должна работать это факт.
Роман
25 января 2021, 00:57
0
Дело в том что дублей как раз в $usersMedia нет, дубли получаются при добавлении в MODX, я вызываю снипет на странице. Если обновлю страницу два раза, страницы добавятся одни и те же. Вот пытаюсь при добавлении пропускать уже добавленные страницы. Сравнивая поле у новых страниц с таким же молем у старых, и что то не получается моя проверка не срабатывает :(
Alexey
25 января 2021, 00:52
0
Я бы вначале удалил дубли из самого массива $usersMedia['data'], а результат, который заведомо без дублей, уже перебирал бы форычем, вот тут хороший пример.
Роман
25 января 2021, 00:44
0
к сожалению не работает, на странице где вызываю сниппет, обновил страницу два раза, добавились страницы одни и те же два раза
сделал так

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(); 
////

}
}