Tramp1357 16 октября 2014 0 1
Добрый день. Возник такой вопрос: можно ли как-то ресурс 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();

вроде, получилось, но после этого пришлось восстанавливать из резерва базу: вообще все документы перестали сохраняться.
Можно, конечно, и руками создать да перенести, там их у меня немного, но хочется все-таки автоматизировать процесс, да и разобраться теперь очень хочется :)
1 комментарий
Tramp13571
Tramp1357 16 октября 2014г в 10:39 #
Изначально я переносил данные скриптом:

$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);
}

Закралось подозрение, проверил - товары не сохраняются. Категории и другие документы работают нормально.
Отобрадение в фронтенде тоже работает как надо.
В чем может быть проблема и можно ли это исправить без переимпорта?
Fi1osof1
Fi1osof 16 октября 2014г в 11:58 #
Саша, привет! 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 к нему должен будет добавиться автоматически.
Tramp13571
Tramp1357 16 октября 2014г в 12:11 #
Должны быть какие-то ошибки

В том-то и дело, что все молча делает. Вроде, сохраняет, а перезагрузишь - старая информация опять. И в журнале ошибок пусто.
getdata-процессор по товарам отрабатывает нормально, данные каталога выводятся нормально, а админку при сохранении почему-то клинит.
Я и по базе уже смотрел - вроде, все нормально. Мистика какая-то.
За скрипт спасибо, попробую его.
Fi1osof1
Fi1osof 16 октября 2014г в 12:32 #
Попробуй, должен помочь.
Tramp13571
Tramp1357 16 октября 2014г в 18:37 #
Нашел проблему. это 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)));
}
Fi1osof1
Fi1osof 16 октября 2014г в 19:30 #
А как именно ругается? Сообщение покажи. Объект $resource вообще есть?
Tramp13571
Tramp1357 16 октября 2014г в 19:55 #
Похоже, объекта нет, он пишет, что есть попытка обратиться к несуществующему методу:
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

и как раз на тот кусок кода, что я указал выше
Fi1osof1
Fi1osof 16 октября 2014г в 20:45 #
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-а, которое и было описано в том топике.
Tramp13571
Tramp1357 16 октября 2014г в 19:56 #
в принципе, мне автообновление autoredirect не требуется. я эти события отключил, теперь все работает :)
Tramp13571
Tramp1357 16 октября 2014г в 20:04 #
хотя, я из консоли запускал скрипт, который ты показал. может, потому и ругался не $resource. Но я закомментировал OnBeforeDocFormSave и OnDocFormSave (они мне не нужны) - и работает.
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.