Как удалить товары с определенным значением tv

Задача в том, что бы удалить товары в которых tv поле (производитель) имеет определенное значение
я так понимаю это только через консоль можно запустить скрипт, но не пойму как его написать, так как в php не силен
наткнулся на эту заметку
https://modx.pro/help/22639
но как подстроить под свою задачу — не понятно мне
alexandr.skyrda
15 февраля 2024, 03:45
modx.pro
247
0

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

Павел Романов
15 февраля 2024, 12:09
1
0
Что-то типа этого (бэкап базы только сделайте):
<?php
$tvid = 123; // ID TV-шки
$vendor = 'Производитель' // Название производителя
$template = 6; // ID шаблона товара

$sql = "SELECT * FROM {$modx->getTableName('modTemplateVarResource')} WHERE tmplvarid = {$tvid}"; 
$q = $modx->prepare($sql);
$q->execute();
$tvs = $q->fetchAll(PDO::FETCH_ASSOC);
foreach($tvs as $tv) {
	if($tv['value'] != $vendor) continue; // если название не то, пропускаем
   	if(!$resource = $modx->getObject('modResource', array('id' => $tv['contentid'], 'template' => $template)) continue; // если нет ресурса с таким ID и шаблоном, пропускаем
	$resource->remove(); // удаляем ресурс
}
    alexandr.skyrda
    15 февраля 2024, 14:12
    0
    добрый день, спасибо за ответ, а проблема с изображениями в галерее тоже будет как здесь https://modx.pro/help/22639
    что они не удаляются?
      Павел Романов
      15 февраля 2024, 14:25
      +1
      Да, естественно. Можно добавить в скрипт:
      <?php
      $tvid = 123; // ID TV-шки
      $vendor = 'Производитель' // Название производителя
      $template = 6; // ID шаблона товара
      
      if(!function_exists('removeDirectory')){
          function removeDirectory($dir){
              if ($objs = glob($dir."/*")) {
                  foreach($objs as $obj) {
                      is_dir($obj) ? removeDirectory($obj) : unlink($obj);
                  }
              }
              rmdir($dir);
          }    
      }
      
      $sql = "SELECT * FROM {$modx->getTableName('modTemplateVarResource')} WHERE tmplvarid = {$tvid}"; 
      $q = $modx->prepare($sql);
      $q->execute();
      $tvs = $q->fetchAll(PDO::FETCH_ASSOC);
      foreach($tvs as $tv) {
          if($tv['value'] != $vendor) continue; // если название не то, пропускаем
          if(!$resource = $modx->getObject('modResource', array('id' => $tv['contentid'], 'template' => $template)) continue; // если нет ресурса с таким ID и шаблоном, пропускаем
          $dir = MODX_ASSETS_PATH.'images/products/'.$tv['contentid'].'/';
          removeDirectory($dir);    
          $resource->remove(); // удаляем ресурс
      }
        alexandr.skyrda
        15 февраля 2024, 14:28
        0
        спасибо, буду пробовать
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    4