mSynс - замена категории

Всем день добрый.

Импортирую товар и категории. Так как в 1С структура не много другая, пытаюсь сделать так, что бы при импорте у некоторых категорий ставился другой родитель

Делаю плагин:
<?php
switch($modx->event->name){
    case 'mSyncOnBeforeImportCategory':
      $values = & $modx->event->returnedValues;
      
      if($data['parent_uuid'] == '93b35b22-adfd-11e5-a6da-fcaa14380341'){
        $return['parent_uuid'] = 0;
        $values['data'] = $return;
      }
      
      break;
}
Но он создает Ресурс без названия и пихает туда все вложенные категории. Может кто делал что то подобное?
Михаил
13 октября 2017, 10:31
modx.pro
2 116
0
Поблагодарить автора Отправить деньги

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

Михаил
13 октября 2017, 14:47
+1
В общем перенес категории уже после импорта на событие: mSyncAfterImport

<?php

switch($modx->event->name){
    
    case 'mSyncAfterImport':
        
        $q = $modx->newQuery('modResource');
        $q->where(array('pagetitle' => '1 Видео'));
        $obj = $modx->getObject('modResource', $q);
        $obj->set('published',0);
        $obj->save();
        
        $parentsId = $obj->get('id');
        
        $newRes = $modx->getIterator('modResource', array('parent' => $parentsId));
        foreach($newRes as $res){
            $res->set('parent', 1);
            $res->save();
        }
        
        
        break;
}
    Илья
    13 октября 2017, 16:25
    0
    Спасибо за документирование в общем то плагина проверки импорта. Подскажите пожалуйста на TV же тоже можно привязать?
      Михаил
      13 октября 2017, 16:40
      0
      на ТВ что именно?
        Илья
        13 октября 2017, 17:11
        0
        у меня есть tv выгружать на сайт или нет. мне надо чтобы для содержимого false производился
        $obj->set('published',0);
        по сути мне надо выбрать нужное tv поле, проверить содержимое и если false — снять с публикации.
          Михаил
          13 октября 2017, 17:29
          0
          switch($modx->event->name){
              
              case 'mSyncAfterImport':
                  
                  $q = $modx->newQuery('modResource');
          	// Это если только продукты нужны
                  $q->where(array('class_key' => 'msProduct'));
                  $resources = $modx->getIterator('modResoruce', $q);
                  foreach($resources as $resource){
          		if(!$resource->getTVValue('tvName')){
          			$resource->set('published',0);
          			$resource->save();
          		}
          	}
                  
                  
                  break;
          }
            Илья
            13 октября 2017, 17:34
            0
            не понял эти строчки...
            $resources = $modx->getIterator('modResoruce', $);
                    foreach($resources as $resource){
            		if(!$resource->getTVValue('tvName')){
            и в каком месте проверяется содержимое tv поля?
              Илья
              13 октября 2017, 17:37
              0
              почитал про getIterator, суть стала яснее, вопрос про содержимое TV остался.
                Михаил
                13 октября 2017, 17:40
                0
                Ну если у ресурса нет тв или он false то снимает ресурс с публикации
                  Илья
                  13 октября 2017, 17:45
                  0
                  Отлично, спасибо, буду тестить. А на соответствие текста в TV заданной строке подскажите как написать?
                    Михаил
                    13 октября 2017, 17:50
                    0
                    Название ТВ вместо tvName
                      Илья
                      13 октября 2017, 18:00
                      0
                      ну это чтобы он саму TV искал, а содержимое? если там текст?
                        Михаил
                        13 октября 2017, 19:10
                        0
                        switch($modx->event->name){
                            
                            case 'mSyncAfterImport':
                                
                                $q = $modx->newQuery('modResource');
                        	// Это если только продукты нужны
                                $q->where(array('class_key' => 'msProduct'));
                                $resources = $modx->getIterator('modResoruce', $q);
                                foreach($resources as $resource){
                        		if($resource->getTVValue('tvName') == 'какому то тексту'){
                        			$resource->set('published',0);
                        			$resource->save();
                        		}
                        	}
                                
                                
                                break;
                        }
                        Илья
                        13 октября 2017, 19:15
                        0
                        Огромное спасибо. Особенно за терпение — до последнего мог бы и сам догадаться.
    Михаил
    13 октября 2017, 16:45
    +1
    <?php
    
    switch($modx->event->name){
        //Проверяем наше событие
        case 'mSyncAfterImport':
            //Делаем запрос к modResource
            $q = $modx->newQuery('modResource');
    	//у которого pagetitle должен быть 1 Видео
            $q->where(array('pagetitle' => '1 Видео'));
    	// собственно берем этот объект
    	// ставим его не опубоикованым
            $obj = $modx->getObject('modResource', $q);
            $obj->set('published',0);
            $obj->save();
            
            $parentsId = $obj->get('id');
            
    	// выбираем все ресурсы у которого родитель ID того верхнего
            $newRes = $modx->getIterator('modResource', array('parent' => $parentsId));
            foreach($newRes as $res){
    	// устанваливаем им нового родителя
                $res->set('parent', 1);
                $res->save();
            }
            
            
            break;
    }
      Илья
      13 октября 2017, 17:12
      0
      Отдельное спасибо за комментарии, думаю я не единственный кому это пригодится)
        Илья
        13 октября 2017, 17:13
        0
        Немного не в тему, но может сможете подсказать и с этим вопросом? modx.pro/help/13511/
        Виталий Киреев
        15 октября 2017, 15:19
        0
        В коде из поста ты зануляешь все данные категории, поэтому получается пустой ресурс
        $return['parent_uuid'] = 0;
        $values['data'] = $return;
        надо
        $data['parent_uuid'] = 0;
        $values['data'] = $data;
          Михаил
          15 октября 2017, 16:58
          0
          Так вроде код одинаковый же?
          Я решил через плагин на окончание импорта, потом просто все переношу куда мне надо. Но проблема сейчас такая, на одном сайте все работает, на втором отваливается ошибка, и никаких логов, не на сервере не на сайте.
            Виталий Киреев
            15 октября 2017, 17:23
            0
            $data это массив всех полей категории. А твой $return это массив только с parent_uuid
              Михаил
              15 октября 2017, 17:37
              0
              Изначально идея была такая, при определенной parent_uuid меня ее на другую. Но не пошло. В итоге сделал вот так:
              <?php
              switch($modx->event->name){
                  
                  case 'mSyncAfterImport':
                      
                      $q = $modx->newQuery('modResource');
              	//Выбираем категорию с который надо перенести
                      $q->where(array('pagetitle' => '1 Видео'));
                      $obj = $modx->getObject('modResource', $q);
                      $obj->set('published',0);
                      $obj->save();
                      //Получаем ее айди
                      $parentsId = $obj->get('id');
                      //Ну а тут у тех ресурсов, у которых родитель тот верхний, ставим тот который нам надо
                      $newRes = $modx->getIterator('modResource', array('parent' => $parentsId));
                      foreach($newRes as $res){
                          $res->set('parent', 1);
                          $res->save();
                      }
                      
                      
                      break;
              }
                Михаил
                15 октября 2017, 17:39
                0
                Сейчас проблема такая. Импортировал все норм, а потом раз и вот так:
                Картинка
                Вторая

                Так и крутится, и в итоге плагин не срабатывает, так как не заканчивается импорт. Ошибок нет ни на сервере, ни на сайте
                  Виталий Киреев
                  15 октября 2017, 17:48
                  0
                  Возможно итерация по ресурсам много времени или памяти занимает. Уменьшите msync_time_limit
                    Михаил
                    15 октября 2017, 18:07
                    0
                    Вот жеж спасибо тебе! Скинул до 30 и все прошло. А я мучился. Огромное спасибо!
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            23