Иван Бондаренко

Иван Бондаренко

Был в сети 24 октября 2024, 17:33
Заказы не принимаю
Андрей
Андрей
Можно поставить дополнение Console и выполнить там код.

Есть несколько вариантов:

1. Получить все ресурсы по артикулу и отметить как удаленные или сразу удалить
$articles = array('артикул1', 'артикул2');

$c = $modx->newQuery('msProduct');
$c->leftJoin('msProductData', 'Data');
$c->where(array(
  'Data.article:IN' => $articles
));

$products = $modx->getCollection('msProduct', $c);

foreach ($products as $product) {
  // 1. Отметить как удаленные
  $product->set('deleted', '1');
  $product->save();

  // 2. Удалить сразу
  // $product->remove(); 
}

2. Так же получить по артикулу и удалить через процессор (то же самое что удалить из админки)
$articles = array('артикул1', 'артикул2');
$products = array();

$c = $modx->newQuery('msProduct');
$c->leftJoin('msProductData', 'Data');
$c->where(array(
  'Data.article:IN' => $articles
));
$c->select(array(
  'msProduct.id as id'
));

if ($c->prepare() && $c->stmt->execute()) {
  $products = $c->stmt->fetchAll(PDO::FETCH_ASSOC);
}

if (!empty($products)) {
  foreach($products as $product) {
    $response = $modx->runProcessor('resource/delete', array(
      'id' => $product['id']
    ));
    
    if ($response->isError()) {
      $modx->log(1, 'Не удалось удалить ресурс');
    }
  }
}
Дмитрий Середюк
Дмитрий Середюк
По сути если вы выводите опции через снипет msOptions, то там уже встроена проверка на пустоту, но данный снипет предназначен для полей с Автодополнением.

Для обычных полей используйте простую проверку
{if $field}
Поле field  = {$field}
{else}
Поле пусто.
{/if}
Володя
Володя
пример вывода всех тегов
<!-- tags -->
{set $tags = $_modx->runSnippet('pdoResources',[
'class' => 'msProductOption',
'sortby' => 'value',
'sortdir' => 'ASC',
'where' => json_encode([
'key' => 'tags',
'value:!='=> 'undefined'
]),
'select' => 'DISTINCT(msProductOption.value) as id, "tag" as class_key',
'limit' => 0,
'return' => 'json'
])}
{set $tags = $tags | fromJSON}
{if count($tags)}
	<ul class="uk-float-right uk-navbar-nav tm-header-tags">
		<li data-uk-dropdown="" aria-haspopup="true" aria-expanded="false">
			<a>{'msfbshop_tags' | lexicon}</a>
			<div aria-hidden="true" class="uk-dropdown uk-dropdown-navbar uk-dropdown-bottom">
				<ul class="uk-nav uk-nav-navbar">
				{foreach $tags as $row}
					<a href="{$row.link}">{$row.id}</a>
				{/foreach}
				</ul>
			</div>
		</li>
	</ul>
{/if}
Илья Уткин
Илья Уткин
Видимо, в runSnippet не заложено использование наборов. Попробуйте вот так — самостоятельно распарсить набор и превратить его в параметры
$propertySetObj = $modx->getObject('modPropertySet', array('name' => 'cart_catalog'));
$propertySet = $modx->parser->parseProperties($propertySetObj->get('properties'));
$modx->runSnippet('Shopkeeper3', $propertySet);