Роман

Роман

Был в сети 23 августа 2025, 12:04
Заказы не принимаю
Павел Романов
Павел Романов
Попробуйте так (просто плагин на OnDocFormSave, без сниппета и TV-шку доставайте через modTemplateVarResource):
<?php
$tvid = 5; // ID TV-шки
if(!$tvo = $modx->getObject('modTemplateVarResource', array('tmplvarid' => $tvid, 'contentid' => $modx->resource->get('id')))) return;
$tv = $tvo->get('value');
$items = $modx->fromJSON($tv);
$output = array();

foreach($items as $item) {
	$item['date'] = 'newdate';
	$output[] = $item;
}

$tvo->set('value' , $modx->toJSON($output));
$tvo->save();

// очистка кеша ресурса
$cacheKey = $resource->getCacheKey();
$modx->cacheManager->refresh(array('resource' => array('key' => $cacheKey)));
Наумов Алексей
Наумов Алексей
1. Ставите компонент Console
2. Пишите там код:
$q = $modx->newQuery('modResource');
// условие по необходимости
//$q->where(array('parent' => 1));
$resources = $modx->getIterator('modResource', $q);
foreach($resources as $resource) {
    $content = $resource->get('content');
    // делаем че хотим
    $title = 'Заголовок';
    // ...

    $resource->setTVValue('title', $title);
    $resource->save();
}
3. Запускаете… ждете (возможно долго).
Alexey
Alexey
В общем, как-то так:

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

Не проверял! По идее, должно сработать.
Артур Шевченко
Артур Шевченко
Да не нужно вам это 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(); 
////

}
}
Артур Шевченко
Артур Шевченко
Если у вас будет повторяться pagetitle, то modx будет ругаться, оно вам надо? Думаю, нет. А проверить элементарно. Если я правильно понял, $usersMedia['data'] содержит массив полей, из которых вы создаёте ресурс, значит надо в цикле делать прямой запрос в БД через newQuery, где в условии ставить pagetitle=$usersMedia['data'][поле которое помещается в заголовок ресурса]. Если запрос вернёт хотя бы одно значение значит, такой ресурс уже есть и надо его либо обновить, либо пропустить и продолжить выполнение цикла. Как сделать запрос в БД подскажет Гугл ключевые слова modx xpdo sql. Ну а дальше уже всё как сейчас. Либо можно поступить проще, но если ресурсов много, то это может быть неоптимальным решением с точки зрения потребления ресурсов, просто попытаться получить объект
$resource=$modx->getObject ('modResource', array('pagetitle'=>$usersMedia['data']['fieldname']));
if(!$resource){
//Создаём новый ресурс
}
<code>