Как массово поменять tv у ресурсов в поле tvSuperSelect ?
Делаю вот такой простой запрос, в ресурсах вроде бы сохраняется это и видно что появляется тег, но при выводе похожих ресурсов по тегу — пусто, но если прописать в ручную и сохранить то всё норм показывается. Подскажите как правильно правильно массово добавить тег для tvSuperSelect
Пытался еще вот так, через процессор update — тоже безрезультатно
<?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 "Документ не найден";
}
Комментарии: 7
Могу предположить, что он в формате 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,
]) ?: 'Похожих записей не найдено'}
Как-то вот так будет работать, не тестировал. $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);
}
}
}
у меня не работает(
находил чтото похожее и пытался адаптировать, не получилось
находил чтото похожее и пытался адаптировать, не получилось
Кэш после этого чистили? Проверьте базу, пишется ли в базу.
чистил, в базу не пишется, ни в одной таблице нет
запускаю так
запускаю так
<?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);
}
}
}
$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);
}
}
}
ничего не происходит
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.