Импорт в Prestashop: подводные камни

в 12:50, , рубрики: e-commerce, php, prestashop, Веб-разработка, импорт товаров, интернет-магазин, электронная коммерция, метки: , , , ,

Привет!
Недавно мне довелось писать парсер для PrestaShop. Хочу теперь поделиться своим мимолетным опытом знакомства с этой платформой. К сожалению, не очень приятным. Нет, я ничего против нее не имею. Вполне себе симпатичное e-commerce решение, удобное для пользователей. Можно сказать, приятное в любом отношении. Кроме отношения к разработчикам.

Обо всем по порядку.
Сама процедура парсинга не представляла особой сложности. Главный вопрос для меня заключался в импорте спарсенных данных в Prestashop, т.к. до этого я никогда не встречался с этой CMS.

Свое изучение я как обычно начал с поиска документации. И тут меня ожидал первый неприятный сюрприз. Я не смог найти ничего полезного по моей теме. Русскоязычное сообщество у PrestaShop есть, но ориентировано оно больше на пользователей, чем на разработчиков. В остальной части инета ситуация лишь немногим лучше. В итоге весь поиск сузился до пределов оф. сайта. Я до последнего надеялся найти какое-то подобие вот этого, но, как оказалось, искать было нечего. Вместо того, чтобы предоставить нормальную справку по функциям и классам оф. сайт с первой же страницы документации, ненавязчиво так, предлагает ознакомиться со схемой базы данных PrestaShop. Другими словами, любезно (французы же!) дают понять, что другого выбора, кроме как заплатить кому-нибудь кто в этом разбирается, у меня нет. Разве что залезть в исходники…

Что ж, к тому времени я уже был готов к такому варианту и уже примерно представлял в какую сторону копать. В админке PrestaShop, среди Инструментов, есть пункт Импорт, предназначен он для импорта товаров в базу PrestaShop из CSV. Сам по себе он мне был не нужен, т.к. у меня была немного другая задача и CSV в ней был неуместен. Меня интересовали исходники этого инструмента. Где-то там, внутри цикла по строкам CSV, есть код, который собственно и делает импорт товара в базу. Он-то и был мне нужен. Я очень надеялся, что этот код вынесен в отдельную функцию или метод, поскольку такой же код по идее должен был использоваться и при обычном (поштучном) добавлении товара. Тогда мне достаточно было бы всего лишь сделать вызов этой функции в своем парсере. Но меня опять ожидало разочарование. Я нашел, но не совсем то, что искал.

За реализацию импорта из CSV отвечает метод productImport класса AdminImport. Внутри этого метода простыня на 300 строк кода, и никакого намека на «одиночный вызов функции». Меня до сих пор не покидает ощущение, что создатели Престашопа намеренно сделали все возможное, чтобы усложнить жизнь любому, кто осмелится залезть в их исходники. Я провел целый день в попытках вытащить из этой мешанины то, что мне нужно и при этом так, чтобы это заработало отдельно от админки. Но ничего из этой затеи не вышло. Ситуацию усугубляло то, что там были вызовы приватных методов AdminImport (для чего их объявили приватными я так и не понял). Короче, я не мог скопировать этот код отдельно от класса AdminImport (например, в другой класс), не копируя при этом все содержание этого класса. А время поджимало

В общем, в результате у меня получился костыль в виде патча к классу AdminImport и обертки к нему.

В своем парсере я его использовал примерно так

define('PS_ADMIN_DIR', getcwd().'/..');
include PS_ADMIN_DIR.'/../config/config.inc.php';
require_once 'ps_import_api.init.php';
require_once PS_ADMIN_DIR.'/tabs/AdminImport.php';
require_once 'ps_import_api.php';

...

/* Добавление категории: */
$a_info= array('name'=> $catname, 'parent'=> $id_parent);
$id_cat= PSImportAPI::putCategory($a_info);

...

/* Добавление продукта: */
$a_info= array(
  'reference'=> $ref,
  'name'=> $name,
  'image'=> $url_image,
  'description'=> $desc,
  'quantity'=> $n_q,
  'price'=> $n_price,
  'manufacturer'=> $brand,
);
$a_features= array(
  'Вес брутто'=> $brutto,
  'Материал'=> $material,
);
$a_info['category']= array($id_cat);
$id_product= PSImportAPI::putProduct($a_info, $a_features);

...

/* Обновление продукта: */
$a_info= array(
  'quantity'=> $n_q,
  'price'=> $n_price,
);
$id_product= PSImportAPI::updateProduct($id_product, $a_info, array($id_cat));

...

/* Завершение импорта: */
PSImportAPI::finishImport();

Не знаю, насколько правильно это решение, но свою задачу оно выполнило — парсер с его помощью таки заработал.
Назвал я это «чудо» просто: PrestaShop Import API (раз уж авторы Престашопа до сих пор не удосужились его сделать, будем считать, что я это сделал за них).
Буду рад, если это кому-нибудь пригодится.
Исходники можно взять здесь.
Демо нет, т.к. для этого нужен рабочий сайт на Престашопе.

Спасибо за внимание.

Автор: xmeoff


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js