mSynс - замена категории
        Всем день добрый.
Импортирую товар и категории. Так как в 1С структура не много другая, пытаюсь сделать так, что бы при импорте у некоторых категорий ставился другой родитель
Делаю плагин:
    
    
                                                                                
            Импортирую товар и категории. Так как в 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;
}Но он создает Ресурс без названия и пихает туда все вложенные категории. Может кто делал что то подобное?    Комментарии: 23
                В общем перенес категории уже после импорта на событие: 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;
}            
                Спасибо за документирование в общем то плагина проверки импорта. Подскажите пожалуйста на TV же тоже можно привязать?            
                    
                на ТВ что именно?            
                    
                у меня есть tv выгружать на сайт или нет. мне надо чтобы для содержимого false производился 
                    $obj->set('published',0);по сути мне надо выбрать нужное tv поле, проверить содержимое и если false — снять с публикации.            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;
}            
                не понял эти строчки...
                    $resources = $modx->getIterator('modResoruce', $);
        foreach($resources as $resource){
		if(!$resource->getTVValue('tvName')){ и в каком месте проверяется содержимое tv поля?            
                почитал про getIterator, суть стала яснее, вопрос про содержимое TV остался.            
                    
                Ну если у ресурса нет тв или он false то снимает ресурс с публикации            
                    
                Отлично, спасибо, буду тестить. А на соответствие текста в TV заданной строке подскажите как написать?            
                    
                Название ТВ вместо tvName            
                    
                ну это чтобы он саму TV искал, а содержимое? если там текст?            
                    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;
}            
                Огромное спасибо. Особенно за терпение — до последнего мог бы и сам догадаться.            
                    <?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;
}            
                Отдельное спасибо за комментарии, думаю я не единственный кому это пригодится)            
                    
                Немного не в тему, но может сможете подсказать и с этим вопросом? modx.pro/help/13511/            
                    
                В коде из поста ты зануляешь все данные категории, поэтому получается пустой ресурс
                    $return['parent_uuid'] = 0;
$values['data'] = $return;надо$data['parent_uuid'] = 0;
$values['data'] = $data;            
                Так вроде код одинаковый же?
Я решил через плагин на окончание импорта, потом просто все переношу куда мне надо. Но проблема сейчас такая, на одном сайте все работает, на втором отваливается ошибка, и никаких логов, не на сервере не на сайте.
                    Я решил через плагин на окончание импорта, потом просто все переношу куда мне надо. Но проблема сейчас такая, на одном сайте все работает, на втором отваливается ошибка, и никаких логов, не на сервере не на сайте.
                $data это массив всех полей категории. А твой $return это массив только с parent_uuid            
                    
                Изначально идея была такая, при определенной 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;
}            
                Возможно итерация по ресурсам много времени или памяти занимает. Уменьшите msync_time_limit            
                    
                Вот жеж спасибо тебе! Скинул до 30 и все прошло. А я мучился. Огромное спасибо!            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.