Смена типа документа в ShopModxBox

Добрый день. Возник такой вопрос: можно ли как-то ресурс modDocument преобразовать в ShopmodxResourceProduct? Из админки не сохраняется. Пробовал сделать из консоли: $id=315;

$x=$modx->getObject('modResource',$id);

$x->set('class_key','ShopmodxResourceProduct');

$s=$modx->newObject('ShopmodxProduct',['class_key'=>'ShopmodxProduct','sm_currency'=>79,'sm_price'=>1]);

$x->addOne($s);

$x->save(); вроде, получилось, но после этого пришлось восстанавливать из резерва базу: вообще все документы перестали сохраняться. Можно, конечно, и руками создать да перенести, там их у меня немного, но хочется все-таки автоматизировать процесс, да и разобраться теперь очень хочется :)

Изначально я переносил данные скриптом: $res=$category->getMany('Goods'); //получаем товары категории

foreach($res as $r){

$options=[

    'class_key'=>'ShopmodxResourceProduct',

    'parent'=>$category_id,

    'pagetitle'=>$r->get('name'),

    'published'=>1,

    'template'=>3,

    'content'=>$r->get('content'),

    'sm_currency'=>79,

    'sm_price'=>$r->get('price'),

    'tv7'=>$r->get('image'),

];

$modx->runProcessor('resource/create', $options);

} Закралось подозрение, проверил - товары не сохраняются. Категории и другие документы работают нормально. Отобрадение в фронтенде тоже работает как надо. В чем может быть проблема и можно ли это исправить без переимпорта?

Саша, привет! 1. Не может быть, чтобы просто не сохранялось и все. Должны быть какие-то ошибки. Для выполнения процессоров в тесте советую вот этот скрипт использовать. 2. Давно уже не делал подобного, но на сколько мне память не изменяет, делать это надо так: foreach($docs as $doc){ $doc->class_key = 'ShopmodxResourceProduct'; $doc->save(); $data = $doc->toArray(); $data = array_merge($data, array( "sm_price" => $price, "sm_currency" => $currency, )); $response = $modx->runProcessor('resource/update',$data); if($response->isError()){ print_r($response->getResponse()); return; } } Дело в том, что когда процессор на обновление выполняется, он ведь все равно первоначально берет данные из БД, и соответственно получает инстанс объекта на основе класса class_key. Если не сохранить перед апдейтом с новым классом, то тогда не будет объекта ShopmodxProductObject. А вот есть уже он, тогда процессор на апдейт будет не родной MODX-овый, а расширенный магазина, и ShopmodxProduct к нему должен будет добавиться автоматически.

Должны быть какие-то ошибки В том-то и дело, что все молча делает. Вроде, сохраняет, а перезагрузишь - старая информация опять. И в журнале ошибок пусто. getdata-процессор по товарам отрабатывает нормально, данные каталога выводятся нормально, а админку при сохранении почему-то клинит. Я и по базе уже смотрел - вроде, все нормально. Мистика какая-то. За скрипт спасибо, попробую его.

Попробуй, должен помочь.

Нашел проблему. это autoredirector ругается. Правда, пока не разобрался, почему. И сбой идет только при сохранении (onBeforeDocFormSave): case "OnBeforeDocFormSave":

    $resources = array(

            $resource,

            $modx->getObject('modResource',$resource->get('parent')) // ругается на get

        );

    if($child_ids = $modx->getChildIds($resource->id,50,array('context' => $resource->context_key))){

        $resources = array_merge($resources, $modx->getCollection('modResource',array("id:IN" => $child_ids)));

    }

А как именно ругается? Сообщение покажи. Объект $resource вообще есть?

Похоже, объекта нет, он пишет, что есть попытка обратиться к несуществующему методу: Fatal error: Call to a member function get() on a non-object in /home/m/maa197cv/maa197cv.bget.ru/public_html/core/cache/includes/elements/modplugin/23.include.cache.php on line 17 и как раз на тот кусок кода, что я указал выше

в принципе, мне автообновление autoredirect не требуется. я эти события отключил, теперь все работает :)

хотя, я из консоли запускал скрипт, который ты показал. может, потому и ругался не $resource. Но я закомментировал OnBeforeDocFormSave и OnDocFormSave (они мне не нужны) - и работает.

Fatal error: Call to a member function get() on a non-object in /home/m/maa197cv/maa197cv.bget.ru/public_html/core/cache/includes/elements/modplugin/23.include.cache.php on line 17 Вот как раз здесь и говорит, что попытка вызова метода на необъекте. Суть этого кроется в этом топике. В процессоре обычных документов тип объекта - resource, а ShopmodxResourceProduct - shopmodxresourceproduct. Разница типов была использована для различных лексиконов. Это несовершенство MODX-а, которое и было описано в том топике.