Снять с публикации много ресрсов

Есть массив содержащий id ресурсов minishop2
как снять с публикации их за 1 проход?
$unarr — мой массив
$resources = ??
так выдает ошибку
$resources = $modx->getCollection('msProduct',$unarr);
вот приблизительно так я менять буду публикацию
foreach ($resources as $k => $res_n){
    $res_n->set('published',0);
    $res_n->save();
}
Александр Иващенко
23 февраля 2018, 19:25
modx.pro
2 761
-1

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

Александр Иващенко
23 февраля 2018, 22:41
+1
Грубо говоря вот весь мой код:
в котором я разбираю это TV
[{"color":"Черный","size":"M","barCode":"2000023492996","count":0},
{"color":"Черный","size":"L","barCode":"2000023493993","count":4},
{"color":"Черный","size":"XL","barCode":"2000023494990","count":3},
{"color":"Черный","size":"XXL","barCode":"2000023495997","count":1},
{"color":"Белый","size":"M","barCode":"2000023488999","count":1},
{"color":"Белый","size":"L","barCode":"2000023489996","count":2},
{"color":"Белый","size":"XL","barCode":"2000023490992","count":4},]
И в зависимости от значения count я определяю опубликовывать ли весь ресурс (товар minishop2) на сайте или нет. Т.е. если хотя бы у одного цвета товара есть count > 0 то я публикую этот товар на сайте. Если нет то снимаю с публикации.

<?php
$resources = $modx->getCollection('msProduct'); // достаю все товары
$output = '<p>Всего ресурсов: '.count($resources).'</p>';
print $output;
$count_not_ready = 0;
$ress = 0;
$output_count = 0;
$stack = array();

foreach ($resources as $k => $res) {  // прохожу по всем товарам
    $ress++;
    $array = $res->getTVValue('12'); // достаю значение дополнительного поля
    $response = json_decode($array, true); // записываю дополнительное поле в массв
    $ids = $res->get('id');
    if ($response){
        foreach ($response as $element) { // прохожу по полям дополнительного поля
            if ($element['count'] > 0) { // проверяю если количество больше 0
                $output_count++;
                array_push($stack, $ids); // записать все id элементов у которых count > 0
            }
        }
    }
    else{
        // снять ресурс с публикации
        $count_not_ready++;
        $res->set('published',0);
        $res->save();
    }
  //$output .= '<p>['.$k.'] => '.count($resources).'</p>';
}

$unarr = array_unique($stack);

echo '<p>Всего обработано count: '.$output_count.'</p>';
echo '<p>Всего обработано: '.$ress.'</p>';
echo '<p>Всего снято с публикации: '.$count_not_ready.'</p>';
echo '<p>Всего элементов в массиве: '.count($unarr).'</p>';

unset($output_count);

$resources2 = $modx->getCollection('msProduct');

foreach ($resources2 as $k => $res_n){
    $ids = $res_n->get('id');
    echo $ids;
}
Все это я повешу на событие mSyncAfterImport

я понимаю, что код не изящный но это мой первый сниппет который я делаю сам и был бы рад Вашей помощи
    Александр Иващенко
    23 февраля 2018, 23:40
    +1
    В общем сделал свой рабочий плагин:
    Если будут советы по его улучшению то милости просим.
    <?php
    
    switch ($modx->event->name) {
    
        case 'mSyncAfterImport':
            $resources = $modx->getCollection('msProduct'); // достаю все товары
            $output = '<p>Всего ресурсов: '.count($resources).'</p>';
            print $output;
            $count_not_ready = 0;
            $ress = 0;
            $output_count = 0;
            $stack = array();
            foreach ($resources as $k => $res) {  // прохожу по всем товарам
                $array = $res->getTVValue('12'); // достаю значение дополнительного поля
                $response = json_decode($array, true); // записываю дополнительное поле в массв
                $ids = $res->get('id');
                if ($response){
                    $output_count = 0;
                    foreach ($response as $element) { // прохожу по полям дополнительного поля
                        if ($element['count'] > 0) { // проверяю если количество больше 0
                            $output_count = 1;
                            $ress++;
                        }
                    }
                    if($output_count != 1){
                        $res->set('published', 0);
                        $res->save();
                        $output_count = 0;
                    }
                }
                else{
                    // снять ресурс с публикации
                    $count_not_ready++;
                    $res->set('published',0);
                    $res->save();
                }
            }
        break;
    
    }
      Михаил
      24 февраля 2018, 07:20
      0
      А замени getCollection на getIterator и сможешь поудалять все лишнее.
        Александр Иващенко
        24 февраля 2018, 15:03
        0
        вот блин, круто, спасибо
          Александр Иващенко
          24 февраля 2018, 15:16
          0
          $docs = $modx->getIterator('msProduct');
          
          foreach($docs as $doc){
              $array = $doc->getTVValue('12');
              echo $array;
          break;
          не выводит ничего. ему нельзя все id передавать разве?
          Instantiated a derived class modDocument that is not a subclass of the requested class msProduct
          ка мне выбирать именно товары?
            Михаил
            24 февраля 2018, 15:18
            0
            $q = $modx->newQuery('modResource');
            $q->where(array('class_key'=>'msProduct'));
            $docs = $modx->getIterator('modResource', $q);
            foreach($docs as $doc){
                $array = $doc->getTVValue('12');
                echo $array;
            }
            Александр Иващенко
            24 февраля 2018, 15:22
            0
            разобрался. только не понял почему)
            array('class_key' => 'msProduct') — нужно передавать класс получается?

            // Проходимся по всем товарам
            $products = $modx->getIterator('msProduct', array('class_key' => 'msProduct'));
            foreach ($products as $product) {
                // Получаем оригиналы их картинок
                $array = $product->getTVValue('12');
                echo $array;
                //$files = $product->getMany('Files', array('parent' => 0));
            }
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          7