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

Артур Шевченко
25 января 2021, 10:32
0
Может быть вы мне объясните, зачем tv и зачем проверять наличие ресурсов в родителе?
Michael
25 января 2021, 10:20
0
Подскажите как его установить? через Установщик пакетов не находит, а скаженный пакет на гитхабе не могу понять как установить. Подскажите пожалуйста.
Alexey
25 января 2021, 10:04
0
Ошибочка:

if (!in_array($media['id'], $tvs)) {
        //добавляю ресурс
        .......
    }

так должно быть
Alexey
25 января 2021, 09:39
1
+1
В общем, как-то так:

<?php
$parent_id = 2; // выносим id родителя в переменную
$tv_id = 6; // тут указать id своего tv-поля

// проверяем наличие ресурсов в родителе
$c = $modx->newQuery('modResource');
$c->where(['parent' => $parent_id, 'published' => 1, 'deleted' => 0, 'searchable' => 1]);
$count = $modx->getCount('modResource', $c);

if($count == 0) return;

// вытаскиваем массив значений tv-полей ресурсов указанного родителя
$q = $modx->newQuery('modResource');
$q->leftJoin('modTemplateVarResource', 'TVS', 'modResource.id = TVS.contentid AND TVS.tmplvarid = '.$tv_id);
$q->select('TVS.value');
$q->where(['parent' => $parent_id]);
if ($q->prepare() && $q->stmt->execute()) {
	$tvs = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
}
//убираем пустые элементы массива tv-полей
$tvs = array_diff($tvs, array(''));

foreach($usersMedia['data'] as $media){
    // проверка наличия $media['id'] в массиве $tvs
    if (in_array($media['id'], $tvs)) {
        //добавляю ресурс
        .......
    }
}
//очистку кеша выносим из цикла
$modx->cacheManager->clearCache();

Не проверял! По идее, должно сработать.
Артур Шевченко
25 января 2021, 02:12
1
+1
$resource=$modx->getObject ('modResource', array('pagetitle'=>$media['title'], 'parent' => 2));
Индексируется страница, а на странице можно вывести например longtitle.
Alexey
25 января 2021, 02:11
0
Пока что предлагаю такой вариант: отдельным циклом пройтись по всем ресурсам родителя, все значения их tv -полей забить в отдельный массив. И потом уже — перебирая основной массив с данными сервиса — проверять через in_array, есть ли в массиве tv-шек значение элемента $media['id']. Соответственно, если нет — создаем новый ресурс.

Обращаю внимание, что массив всех tv-шек извлекаем в цикле ДО начала цикла с данными сервиса.
Роман
25 января 2021, 02:09
0
Спасибо большое, но не могу id писать в pagetitle, это индексируется поисковиками, не должно быть лишнего в заголовке.

с ключом parent не понял, в modResource можно только id указать, написал так
$resource=$modx->getObject ('modResource', 2, array('pagetitle'=>$media['title']));
Артур Шевченко
25 января 2021, 01:53
0
Там где получаете ресурс в массив добавьте ещё один элемент с ключом parent вот и будет вам ограничение по родителю. А про tv умоляю вас, забудьте, они не для этого, для программной работы с ресурсами используйте поля описанные в модели их обычно хватает, а tv это для дополнительной информации когда прям без вариантов. В вашем случае лучше писать уникальный id в pagetitle.
Роман
25 января 2021, 01:46
0
Это из сервиса другого, такой массив прилетает, там просто поля с данными, я просто его распечатываю 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] => 
                )
        )
)
Alexey
25 января 2021, 01:42
0
Я сейчас не у компа, а код писать со смартфона — так себе занятие… Завтра постараюсь пример набросать. Если ещё будет актуально)
Роман
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']