Александр Марков
15 окт. 2014 г., 20:02

Смена типа документа в 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-а, которое и было описано в том топике.

Добавить комментарий