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 и все прошло. А я мучился. Огромное спасибо!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.