использование процессоров minishop2 во внешнем файле

Добрый день. Пытаюсь сделать простенький код добавления и обновления товаров mninishop2 с помощью скрипта во внешнем файле.
Но почему-то не работает. Простые 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);
        }
Андрей
08 января 2018, 13:14
modx.pro
1
3 732
+1

Комментарии: 15

Михаил
08 января 2018, 16:50
0
вот

$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(

    ));
    Андрей
    08 января 2018, 17:17
    0
    У меня почему-то таки ошибки лезут:
    (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
      Михаил
      08 января 2018, 17:43
      0
      В процессор данные передаете?
        Андрей
        08 января 2018, 17:52
        0
        Вроде бы да) Вот чуть боле полный код
        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);
                }
          Михаил
          08 января 2018, 18:01
          0
          Сейчас проверил, создает все отлично

          $processorProps = array(
                      'class_key' => 'msProduct',
                      'pagetitle' => 'Жесть',
                      'price' => (int) 5000,
                      'parent' => 2,
                      'context_key' => 'web',
                  ); 
                  
                  $response = $modx->runProcessor('resource/create', $processorProps);
            Андрей
            08 января 2018, 18:03
            0
            А обновление работает? При создании мы пользуемся вроде как стандартным modx процессором — он у меня работает, а вот обновление продукта — никак((
              Михаил
              08 января 2018, 18:10
              0
              да, только чуток код поправьте
              $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();
              Можно без процессоров
                Андрей
                08 января 2018, 18:18
                0
                Ага, работает. Спасибо, дружище!
                Осталось понять, почему процессор не завелся))
                  Василий Наумкин
                  08 января 2018, 23:48
                  0
                  Потому что update процессор требует помимо id еще и context_key передавать — это должно быть написано в ошибке, только её никто не проверяет.
                  if ($response->isError()) {
                  	exit($response->getMessage());
                  }
                    Андрей
                    09 января 2018, 00:40
                    0
                    Василий, я выше приводил код, в нем передается context_key. Поэтому у меня и ступор… Может подскажете, где ошибка у меня?
                      Василий Наумкин
                      09 января 2018, 00:42
                      0
                      Может подскажете, где ошибка у меня?
                      Еще раз — ты не проверяешь ошибку. Там может быть и дубликат uri, и еще какая-нибудь фигня, всего не угадать.

                      Вместо вопросов в сообществе нужно проверять, что возвращает процессор. Код я тебе уже дал.
                    Виктор Долгий
                    18 января 2018, 21:22
                    0
                    А вот и нет, нет ошибки. При чём, такая ситуация возникает только после вызова 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/'));
                    }
                      Виктор Долгий
                      18 января 2018, 22:53
                      0
                      Решение проблемы оказалось элементарным, зачем использовать процессоры minishop`a, если продукт — расширенный ресурс и можно сохранять стандартным процессором?..
                      ...
                      $response = $this->modx->runProcessor('resource/update', $fields);
                      ...
Дмитрий
30 июня 2020, 22:39
0
Друзья, можете подсказать, а как обновить производителя товара? Все перепробовал — ничего не получается. В логи вообще никаких ошибок не падает. Делаю так:

$modx->runProcessor('resource/update', array(
    'id' => 123, 
    'class_key' => 'msProduct',
    'context_key' => 'web', 
    'vendor.name' => 'Nike'
    )
);

не работает (((
    Николай
    01 июля 2020, 00:58
    0
    Попробуйте добавить в параметры alias, его можно получить заранее из ресурса, а потом указать в процессоре.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    15