Прошу помочь с API miniShop2

Написал скрипт который переносит сайт с Drupal'а на miniShop2 (когда закончу — выложу в GitHub).

Всё работает, собирался уже запускать полный процесс импорта, как заметил, что картинки к товарам хранятся не только в таблице modx_ms2_products, но ещё и в modx_ms2_product_files.

Код функции создающей каждый отдельный товар:

function CreateProduct($arr, $content, $modx)
{
	/* @var msProduct $object */
	$object = $modx->newObject('msProduct');

	$keywords = $arr['keywords'];
	unset($arr['keywords']);

	foreach($arr as $key => $value){
		$object->set($key, $value);
	}

	$object->setContent($content);

	$response=array();
	$response['msProduct']=($object->save())?'Created':'Fail';
	$id = $object->get('id');


	// SEOPro compability
	$seoPro = $modx->getService('seopro','seoPro',$modx->getOption('seopro.core_path',null,$modx->getOption('core_path').'components/seopro/').'model/seopro/',$config);
	$objSeoKeywords = $modx->getObject('seoKeywords', array('resource' => $id));

// Модификация для переноса всех ключевых слов
	if(!$objSeoKeywords)
	{
		$objSeoKeywords = $modx->newObject('seoKeywords', array('resource' => $id));
	}
	if($objSeoKeywords){
		$objSeoKeywords->set('keywords', $keywords);
		$response['objSeoKeywords']=($objSeoKeywords->save())?'Saved':'Fail';
	}

	if($response['msProduct']=='Created' && $response['objSeoKeywords']=='Saved') $response['status']='OK'; else $response['status']='Fail';
	return $response;
}
Просьба пояснить по API miniShop2 — как картинки добавить правильно в продукты? Файлы уже загружены на хостинг, пути все есть в БД, в функцию передаются в параметре $arr['image'].
Илья Ершов
22 января 2014, 07:18
modx.pro
5 524
0

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

Василий Наумкин
22 января 2014, 11:22
0
Я же тебе еще в прошлой теме дал ссылку на готовый скрипт импорта. Там и ТВ, и картинки, и всё остальное есть — смотри.

Если коротко: у товара должен быть указан правильный source, а потом просто используй процессор upload из галереи.
Ну и создание товаров через API MODX неверное, при таком раскладе не отработают разные проверки и плагины. Нужно использовать обычные системные процессоры MODX (не MS2!), с указанием class_key msProduct.

В общем, смотри мой скрипт импорта, там всё есть.
Илья Ершов
22 января 2014, 14:31
0
Проанализировал скрипт импорта. Позаимстовал для себя куски хорошего подходящего кода. Но, хочу заметить, что процессор 'gallery/upload' (возможно и другие) не приспособлен для работы через API.

Конкретно:
Процессор 'gallery/upload' при инициализации выдаёт ошибку: %ms2_gallery_err_no_product

Потому что в коде:
public function initialize() {
		/* @var msProduct $product */
		$id = $this->getProperty('id', @$_GET['id']);
		if (!$product = $this->modx->getObject('msProduct', $id)) {
			return $this->modx->lexicon('ms2_gallery_err_no_product');
		}
		...
$id не принимается из передаваемых параметров, а считывается из $_GET.

Вобщем буду приспосабливать под себя. Может сделаю пулл-реквест.
    Илья Ершов
    22 января 2014, 16:47
    0
    Что-то всё никак не удаётся добавить картинки к товарам… Казалось бы простая операция…
      Илья Ершов
      22 января 2014, 17:11
      0
      Всё разобрался. Комментарий по поводу некорректности процессора 'gallery/upload' — ошибочен. Сейас уже понял сам принцип работы.
        Даниил Рачин
        22 декабря 2014, 12:17
        0
        Напишите, пожалуйста, в чем было дело. У меня сейчас та же проблема. Создается только первый товар из списка импорта, ошибка ms2_gallery_err_no_product
        maslitto
        13 февраля 2015, 15:45
        0
        Василий, а каким метолом создавать производителя? Например если я выгружаю из xml, мне нужно проверить если такого производителя нет, то создавать нового. уже нашёл ответ
          Константин Ильин
          09 ноября 2016, 21:16
          0
          Василий подскажи пожалуйста в чем проблема, точнее она схожа с вышеописанной:
          выдает ошибку ms2_gallery_err_no_product и на первом товаре сбрасывается.

          1. В цикле создаю товары, класс указан msProduct
          2. Закачиваю на сервер картинку
          3. Закачиваю картинку через процессор.

          если убрать запуск процессора gallery, то товары создаются нормально.

          id и image точно передаются.

          foreach($TVR_hm as $tvr){
              echo '--- Создан <b>Товар</b> '.$tvr['pagetitle']. '
          ';
              $newTVR = creatRes($tvr['pagetitle'],$newPodCat['id'],8);
          
              $img = $hmURL.$tvr['image'];
          				
          	$file_name = str_replace("/","",substr( $img, strripos( $img,'/')));
          	$origFileName = $_SERVER["DOCUMENT_ROOT"].'/'.$tmp.$file_name; 
          	
          	$image = str_replace('//', '/', MODX_BASE_PATH . $tmp . $file_name);
          
          	//загрузка файла на сервер
          	upload($img,$origFileName);
          	
          	//загрузки файла для товара
          	$params = array('id' => $newTVR['id'], 'name' => $file_name, 'file' => $image);
          	$response = $modx->runProcessor('gallery/upload',$params, array('processors_path' =>                                                   MODX_CORE_PATH.'components/minishop2/processors/mgr/'));
          	if ($response->isError()) {
          		echo "Error on upload \"$image\": \n". print_r($response->getAllErrors(), 1);
          	}
          
          	unlink($image);
          }

          function creatRes($pagetitle,$parent,$template,$class = 0){
              
              global $modx;
              $classR = 'msProduct';
              if($class == 1){
                  $classR = 'msCategory';
              }
              $data['class_key']      = $classR;
              $data['context_key']    = 'web';
              $data['template']       = $template;
              $data['published']      = 1;
              $data['parent']         = $parent;
              $data['pagetitle']      = $pagetitle;
              
              $new_res = $modx->runProcessor('resource/create', $data);
              
              return $new_res->getObject();
          }
          Пробовал (нашел где-то), $modx->error->reset(); в цикл пихать, проходит первую категорию, товары создаются с картинками. Помимо того, что долго он еще и вешается, мол массив пустой, хотя он не пустой, в общем это костыль какой-то.
          Подскажите пожалуйста
            Константин Ильин
            10 ноября 2016, 12:27
            0
            Василий, обрати пожалуйста свой взор на эту небольшую проблему)
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            9