Роман

Роман

Был в сети 13 декабря 2022, 17:06
Заказы принимаю
Тут ошибка:
if ($resource->get('template') == 24) {
        if (!$resource->content) {
                $resource->set('published', 0);
        }
        }
Можно просто переписать:
if ($resource->get('template') == 24 && !$resource->get('content')) $resource->set('published', 0);
save можно не ставить, он потом все равно будет сохранять:
$resource->save();
Проверил, работает, поправьте ошибки и снова проверьте. Может быть проблема в том еще, что она когда удаляет не нужное, но на странице это не показывается, тут наверно нужно как-то отдельно перегружать блок.
А в чем сложность? Сделайте плагин на событие OnBeforeDocFormSave
if ($modx->event->name != 'OnBeforeDocFormSave') {return false;}
$content     = $resource->get('content');
$words = array('xxx', 'yyy', 'zzz', 'etc..');
$pattern = '/\b(?:' . join('|', $words) . ')\b/i';
$content = preg_replace($pattern, '', $content);
$resource->set('content', $content);
$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);
		}
	
	}
}
Как-то вот так будет работать, не тестировал. $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);
		}
	
	}
}
Могу предположить, что он в формате 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,
]) ?: 'Похожих записей не найдено'}