Как массово поменять tv у ресурсов в поле tvSuperSelect ?

Делаю вот такой простой запрос, в ресурсах вроде бы сохраняется это и видно что появляется тег, но при выводе похожих ресурсов по тегу — пусто, но если прописать в ручную и сохранить то всё норм показывается. Подскажите как правильно правильно массово добавить тег для tvSuperSelect
<?php
$q = $modx->newQuery('modResource');
$q->where(array(
    'parent' => 816,
    'template' => 3
    ));
$resources = $modx->getIterator('modResource', $q);
foreach($resources as $resource) {
    $content = $resource->get('content');
    $title = '["тег суперселект"]';

    $resource->setTVValue('super_select_tags', $title);
    $resource->save();
}
[[tvssResources:empty=`Похожих записей не найдено`?
    &tv=`39`
    &tags=`[[tvssTags?id=`[[*id]]`&tv=`39`&tpl=`@INLINE [[+tag]]`]]`
    &parents=`0`
    &depth=`10`
    &limit=`4`
]]
UPD
Пытался еще вот так, через процессор update — тоже безрезультатно
<?php
$id = 47535;
$resource = $modx->getObject('modResource', array('id' => $id));
if (is_object($resource)) {
    // преобразуем объект в массив
    $resource = $resource->toArray();
    // изменим заголовок страницы
    $resource["super_select_tags"] = 'Новый 4';
    // выполнение процессора    
    $response = $modx->runProcessor('resource/update', $resource);
    
    // если ошибка 
    if($response->isError()){
        echo "Произошла ошибка". $response->getMessage();
    }
    else{
        echo "Документ изменен";
    }
} else {
    echo "Документ не найден";
}
Evgeny
19 сентября 2022, 19:39
modx.pro
567
0

Комментарии: 7

Роман
20 сентября 2022, 09:35
0
Могу предположить, что он в формате json хранит. Так что отправляйте как:
$resource->setTVValue('super_select_tags', json_encode(["тег суперселект"]));
$resource->save();
Плюс в доках сказано, что для данного TV есть отдельная таблица и он пишет в сразу в 2 таблицы, поэтому нужно посмотреть исходники, как там это реализовано, так же для вызова нужно использовать разделитель ||:
{$_modx->runSnippet('tvssResources', [
    'tv' => '2',
    'tags' => $_modx->runSnippet('tvssTags', ['id' => $_modx->resource.id, 'tv' => '2', 'tpl' => '@INLINE [[+tag]]', 'outputSeparator' => '||']),
    'parents' => 0,
    'limit' => 4,
]) ?: 'Похожих записей не найдено'}
    Роман
    20 сентября 2022, 09:44
    0
    Как-то вот так будет работать, не тестировал. $tv_tss поменяйте на свой.
    $modx->addPackage('tvsuperselect', MODX_CORE_PATH .'components/tvsuperselect/model/');
    $tv_tss = 1; //тут нужно указать ID 'super_select_tags'
    
    foreach($resources as $resource) {
        $content = $resource->get('content');
        $tags = ["тег суперселект"];
    	
    	$values = explode(',', $tags);
    	
    	foreach ($values as $value) {
    		$where = array(
    			'resource_id' => $resource->id,
    			'tv_id' => $tv_tss,
    			'value' => $value,
    		);
    		
    		if (!$modx->getCount('tvssOption', $where))
    		{
    			$new = $modx->newObject('tvssOption');
    			$new->fromArray($where);
    			$new->save();
    			unset($new);
    		}
    		
    		$where = array(
    			'contentid' => $resource->id,
    			'tmplvarid' => $tv_tss,
    		);
    		
    		if ($old = $modx->getObject('modTemplateVarResource', $where))
    		{
    			$old_values = $modx->fromJSON($old->value);
    			$old_values[] = $value;
    			$old->set('value', $modx->toJSON(array_unique($old_values)));
    			$old->save();
    		}
    		else {
    			$new = $modx->newObject('modTemplateVarResource');
    			$new->fromArray($where);
    			$new->save();
    			unset($new);
    		}
    	
    	}
    }
      Evgeny
      20 сентября 2022, 13:02
      0
      у меня не работает(
      находил чтото похожее и пытался адаптировать, не получилось
        Роман
        20 сентября 2022, 13:49
        0
        Кэш после этого чистили? Проверьте базу, пишется ли в базу.
          Evgeny
          20 сентября 2022, 14:09
          0
          чистил, в базу не пишется, ни в одной таблице нет
          запускаю так
          <?php
          $q = $modx->newQuery('modResource');
          $q->where(array(
              'parent' => 816,
              'template' => 3
              ));
          $resources = $modx->getIterator('modResource', $q);
          $modx->addPackage('tvsuperselect', MODX_CORE_PATH .'components/tvsuperselect/model/');
          $tv_tss = 39; //тут нужно указать ID 'super_select_tags'
          
          foreach($resources as $resource) {
              $content = $resource->get('content');
              $tags = ["тег суперселект"];
          	
          	$values = explode(',', $tags);
          	
          	foreach ($values as $value) {
          		$where = array(
          			'resource_id' => $resource->id,
          			'tv_id' => $tv_tss,
          			'value' => $value,
          		);
          		
          		if (!$modx->getCount('tvssOption', $where))
          		{
          			$new = $modx->newObject('tvssOption');
          			$new->fromArray($where);
          			$new->save();
          			unset($new);
          		}
          		
          		$where = array(
          			'contentid' => $resource->id,
          			'tmplvarid' => $tv_tss,
          		);
          		
          		if ($old = $modx->getObject('modTemplateVarResource', $where))
          		{
          			$old_values = $modx->fromJSON($old->value);
          			$old_values[] = $value;
          			$old->set('value', $modx->toJSON(array_unique($old_values)));
          			$old->save();
          		}
          		else {
          			$new = $modx->newObject('modTemplateVarResource');
          			$new->fromArray($where);
          			$new->save();
          			unset($new);
          		}
          	
          	}
          }
            Роман
            20 сентября 2022, 15:39
            0
            $resource->id
            нужно заменить на
            $resource->get('id')
            Он значение ID не получает, поэтому и не пишет.
            Это вообще можно удалить, оно не нужно:
            $content = $resource->get('content');
            Итого:
            foreach($resources as $resource) {
                $tags = ["тег суперселект"];
            	
            	$values = explode(',', $tags);
            	
            	foreach ($values as $value) {
            		$where = array(
            			'resource_id' => $resource->get('id'),
            			'tv_id' => $tv_tss,
            			'value' => $value,
            		);
            		
            		if (!$modx->getCount('tvssOption', $where))
            		{
            			$new = $modx->newObject('tvssOption');
            			$new->fromArray($where);
            			$new->save();
            			unset($new);
            		}
            		
            		$where = array(
            			'contentid' => $resource->get('id'),
            			'tmplvarid' => $tv_tss,
            		);
            		
            		if ($old = $modx->getObject('modTemplateVarResource', $where))
            		{
            			$old_values = $modx->fromJSON($old->value);
            			$old_values[] = $value;
            			$old->set('value', $modx->toJSON(array_unique($old_values)));
            			$old->save();
            		}
            		else {
            			$new = $modx->newObject('modTemplateVarResource');
            			$new->fromArray($where);
            			$new->save();
            			unset($new);
            		}
            	
            	}
            }
              Evgeny
              20 сентября 2022, 19:54
              0
              ничего не происходит
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    7