Роман

Роман

С нами с 06 октября 2013; Место в рейтинге пользователей: #290
Aleksandr Huz
30 мая 2021, 22:45
1
+1
{insert ('file:chunks/'~$item.section~'.tpl')}
Андрей
30 мая 2021, 15:23
1
+1
{set $rows = 1 | resource : 'test' | fromJSON}
						
{foreach $rows as $idx => $row}

    {$row.text}
    
    {set $items = $row.text2 | fromJSON}
    
    {foreach $items as $idx => $item}

        {$item.text}
    
    {/foreach}
    
{/foreach}
Наумов Алексей
09 апреля 2021, 09:47
1
+4
{$_modx->resource.parent | resource : 'parent'}
Павел Романов
28 марта 2021, 19:27
1
+1
На третьей строке поменяйте $modx->resource->get('id') на $resource->get(''id''):
if(!$tvo = $modx->getObject('modTemplateVarResource', array('tmplvarid' => $tvid, 'contentid' => $resource->get('id')))) return;
Павел Романов
27 марта 2021, 19:42
1
+1
Попробуйте так (просто плагин на 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)));
Наумов Алексей
16 февраля 2021, 14:46
2
+2
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
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.
Артур Шевченко
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, 00:02
1
+1
Если у вас будет повторяться pagetitle, то modx будет ругаться, оно вам надо? Думаю, нет. А проверить элементарно. Если я правильно понял, $usersMedia['data'] содержит массив полей, из которых вы создаёте ресурс, значит надо в цикле делать прямой запрос в БД через newQuery, где в условии ставить pagetitle=$usersMedia['data'][поле которое помещается в заголовок ресурса]. Если запрос вернёт хотя бы одно значение значит, такой ресурс уже есть и надо его либо обновить, либо пропустить и продолжить выполнение цикла. Как сделать запрос в БД подскажет Гугл ключевые слова modx xpdo sql. Ну а дальше уже всё как сейчас. Либо можно поступить проще, но если ресурсов много, то это может быть неоптимальным решением с точки зрения потребления ресурсов, просто попытаться получить объект
$resource=$modx->getObject ('modResource', array('pagetitle'=>$usersMedia['data']['fieldname']));
if(!$resource){
//Создаём новый ресурс
}
<code>