использование процессоров minishop2 во внешнем файле
Добрый день. Пытаюсь сделать простенький код добавления и обновления товаров mninishop2 с помощью скрипта во внешнем файле.
Но почему-то не работает. Простые modx процессоры работают, но мне нужно обновлять например поле цены или артикула. Как выйти из ситуации? Это код не обновляет поля товара
Но почему-то не работает. Простые modx процессоры работают, но мне нужно обновлять например поле цены или артикула. Как выйти из ситуации? Это код не обновляет поля товара
if ($res = $modx->getObject('modResource', $q)) {
$data = array();
$processorProps['id'] = $res->get('id');
$response = $modx->runProcessor('resource/update', $processorProps);
}
else {
$response = $modx->runProcessor('resource/create', $processorProps);
}
Комментарии: 15
вот
$miniShop2 = $modx->getService('minishop2','miniShop2',$modx->getOption('minishop2.core_path',null,$modx->getOption('core_path').'components/minishop2/').'model/minishop2/', array());
$response = $miniShop2->runProcessor('mgr/product/create', array(
));
У меня почему-то таки ошибки лезут:
(ERROR @ /core/model/modx/modx.class.php: 1699) PHP warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'modMgrProductUpdateProcessor' not found
Fatal error: Cannot redeclare class msProductUpdateProcessor in /core/components/minishop2/processors/mgr/product/update.class.php on line 121
В процессор данные передаете?
Вроде бы да) Вот чуть боле полный код
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
define('MODX_API_MODE', true);
require ('/index.php');
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_INFO);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
$miniShop2 = $modx->getService('minishop2','miniShop2',$modx->getOption('minishop2.core_path',null,$modx->getOption('core_path').'components/minishop2/').'model/minishop2/', array());
/* *** */
$processorProps = array(
'class_key' => 'msProduct',
'pagetitle' => (string) $item->name,
'price' => (int) $item->price,
'article' => (int) $item->id,
'parent' => $parent_ids,
'published' => (int) $item->hidden,
'template' => 4,
'context_key' => 'web',
);
$q = array(
'pagetitle' => $processorProps['pagetitle'],
);
if ($res = $modx->getObject('modResource', $q)) {
$processorProps['id'] = $res->get('id');
$response = $miniShop2->runProcessor('mgr/product/update', $processorProps);
}
else {
$response = $modx->runProcessor('resource/create', $processorProps);
}
Сейчас проверил, создает все отлично
$processorProps = array(
'class_key' => 'msProduct',
'pagetitle' => 'Жесть',
'price' => (int) 5000,
'parent' => 2,
'context_key' => 'web',
);
$response = $modx->runProcessor('resource/create', $processorProps);
А обновление работает? При создании мы пользуемся вроде как стандартным modx процессором — он у меня работает, а вот обновление продукта — никак((
да, только чуток код поправьте
$q = $modx->newQuery('modResource');
$q->where(array('pagetitle' => 'Жесть', 'class_key' => 'msProduct'));
$res = $modx->getObject('msProduct', $q);
$props = array('price' => 20000,'old_price' => 2000);
$res->fromArray($props);
$res->save();
Можно без процессоров
Ага, работает. Спасибо, дружище!
Осталось понять, почему процессор не завелся))
Осталось понять, почему процессор не завелся))
Потому что update процессор требует помимо id еще и context_key передавать — это должно быть написано в ошибке, только её никто не проверяет.
if ($response->isError()) {
exit($response->getMessage());
}
Василий, я выше приводил код, в нем передается context_key. Поэтому у меня и ступор… Может подскажете, где ошибка у меня?
Может подскажете, где ошибка у меня?Еще раз — ты не проверяешь ошибку. Там может быть и дубликат uri, и еще какая-нибудь фигня, всего не угадать.
Вместо вопросов в сообществе нужно проверять, что возвращает процессор. Код я тебе уже дал.
А вот и нет, нет ошибки. При чём, такая ситуация возникает только после вызова getObject. Если его не вызывать никаких ошибок нет (просто руками данные ввести). Если ввести все руками и запустить getObject — все, все плохо, все перепробовал уже… Кстати, вот на modX forum похожая ситуация, но вроде у парня завелось (там про штатный процессор создания): forums.modx.com/thread/99959/runprocessor-frustration.
Пример
Не работает:
Пример
Не работает:
if (!empty($data['pid'])) {
$fields['id'] = (int)$data['pid'];
if ($ad = $this->modx->getObject('msProduct', array('class_key' => 'msProduct', 'id' => $fields['id']))) {
$fields['context_key'] = $data['context_key'];
$fields['alias'] = $data['alias'];
$response = $this->modx->runProcessor('mgr/product/update', $fields, array('processors_path' => MODX_CORE_PATH . 'components/minishop2/processors/'));
} else {
return $this->error($this->modx->lexicon('ticket_err_id', array('id' => $fields['id'])));
}
} else {
$response = $this->modx->runProcessor('mgr/product/create', $fields, array('processors_path' => MODX_CORE_PATH . 'components/minishop2/processors/'));
}
Работает:if (!empty($data['pid'])) {
$fields['id'] = (int)$data['pid'];
$fields['context_key'] = $data['context_key'];
$fields['alias'] = $data['alias'];
$response = $this->modx->runProcessor('mgr/product/update', $fields, array('processors_path' => MODX_CORE_PATH . 'components/minishop2/processors/'));
} else {
$response = $this->modx->runProcessor('mgr/product/create', $fields, array('processors_path' => MODX_CORE_PATH . 'components/minishop2/processors/'));
}
Решение проблемы оказалось элементарным, зачем использовать процессоры minishop`a, если продукт — расширенный ресурс и можно сохранять стандартным процессором?..
...
$response = $this->modx->runProcessor('resource/update', $fields);
...
Друзья, можете подсказать, а как обновить производителя товара? Все перепробовал — ничего не получается. В логи вообще никаких ошибок не падает. Делаю так:
не работает (((
$modx->runProcessor('resource/update', array(
'id' => 123,
'class_key' => 'msProduct',
'context_key' => 'web',
'vendor.name' => 'Nike'
)
);
не работает (((
Попробуйте добавить в параметры alias, его можно получить заранее из ресурса, а потом указать в процессоре.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.