Magento 2: Сыртқы көздерден өнімдерді импорттау

Magento - бұл электрондық коммерция шешімі, яғни. қоймаға, логистикаға немесе сатумен байланысты қаржылық есепке қарағанда өнімді сатуға көбірек бағытталған. Басқа қолданбалар (мысалы, ERP жүйелері) ілеспе қолданбалар үшін жақсырақ. Сондықтан, Magento-ны пайдалану тәжірибесінде дүкенді осы басқа жүйелермен (мысалы, 1С) біріктіру міндеті туындайды.

Жалпы алғанда, интеграцияны деректерді репликациялауға дейін азайтуға болады:

  • каталог (өнімдер, санаттар);
  • түгендеу деректері (қоймалардағы өнім қалдықтары және бағалар);
  • клиенттер;
  • тапсырыстар;

Magento дерекқордағы деректерді өңдеуге арналған объектілердің жеке сыныбын ұсынады - репозиторийлер. Magento ерекшеліктеріне байланысты дерекқорға репозиторийлер арқылы деректерді қосу кодтауға оңай, бірақ ол, айталық, баяу. Бұл басылымда мен Magento 2-ге өнімді «классикалық» жолмен бағдарламалық түрде қосудың негізгі кезеңдерін қарастырамын - репо сыныптарын пайдалану.

Тұтынушылар мен тапсырыстар әдетте басқа бағытта - Magento-дан сыртқы ERP жүйелеріне дейін қайталанады. Сондықтан, олармен оңайырақ, Magento жағында сізге сәйкес деректерді таңдау керек, содан кейін «Біздің жақтан оқтар ұшып кетті«.

Мәліметтер базасына мәліметтерді жазу принциптері

Қазіргі уақытта Magento бағдарламасында мәліметтер базасында сақталған объектілерді құру арқылы жүзеге асырылады фабрика:

function __construct (MagentoCmsModelBlockFactory $blockFactory) {
    $this->blockFactory = $blockFactory;
}

/** @var MagentoCmsModelBlock $block */
$block = $this->blockFactory->create();

және мәліметтер базасына жазу арқылы жүзеге асырылады Репозиторий:

function __construct (MagentoCmsApiBlockRepositoryInterface $blockRepo) {
    $this->blockRepo = $blockRepo;
}

$this->blockRepo->save($block);

«Зауыт» және «Репозиторий» тәсілін Magento 2 доменіндегі барлық негізгі үлгілер үшін пайдалануға болады.

Негізгі өнім туралы ақпарат

Мен Magento 2.3 нұсқасына сәйкес келетін деректер құрылымын қарап жатырмын. Өнім туралы ең негізгі ақпарат кестеде берілген catalog_product_entity (өнім тізілімі):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Мен өнімнің бір түрімен шектелемін (type_id='simple'), әдепкі атрибуттар жиыны (attribute_set_id=4) және атрибуттарды елемеу has_options и required_options. Атрибуттардан бері entity_id, created_at и updated_at автоматты түрде жасалады, содан кейін, шын мәнінде, жаңа өнімді қосу үшін, біз жай ғана орнатуымыз керек sku. Мен мұны істеймін:

/** @var MagentoCatalogApiDataProductInterfaceFactory $factProd */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
/** @var MagentoCatalogApiDataProductInterface $prod */
$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$repoProd->save($prod);

және мен ерекшелік аламын:

The "Product Name" attribute value is empty. Set the attribute and try again.

Мен сұранысқа өнім атауын қосып, төлсипаттың жоқтығы туралы хабарлама аламын Price. Бағаны қосқаннан кейін өнім дерекқорға қосылады:

$prod = $factProd->create();
$prod->setAttributeSetId(4);
$prod->setTypeId('simple');
$prod->setSku($sku);
$prod->setName($name);
$prod->setPrice($price);
$repoProd->save($prod);

Өнім атауы өнімнің varchar төлсипат кестесінде сақталады (catalog_product_entity_varchar), бағасы – кестеде catalog_product_entity_decimal. Өнімді қоспас бұрын, деректерді импорттау үшін әкімшілік дүкен сөресін пайдаланып жатқанымызды нақты көрсеткен жөн:

/** @var MagentoStoreModelStoreManagerInterface $manStore */
$manStore->setCurrentStore(0);

Қосымша атрибуттар

Magento көмегімен қосымша өнім атрибуттарын өңдеу бір ғанибет. Негізгі нысандар үшін EAV деректер үлгісі (кестені қараңыз eav_entity_type) осы платформаның негізгі мүмкіндіктерінің бірі болып табылады. Біз жай ғана өнім үлгісіне сәйкес атрибуттарды қосамыз:

$prodEntity->setData('description', $desc);
$prodEntity->setData('short_description', $desc_short);
// или
$prodEntity->setDescription($desc);
$prodEntity->setShortDescription($desc_short);

және модельді репо нысаны арқылы сақтау кезінде:

$repoProd->save($prod);

қосымша атрибуттар да сәйкес дерекқор кестелерінде сақталады.

Түгендеу деректері

Қарапайым тілмен айтқанда – қоймадағы өнім көлемі. Magento 2.3 нұсқасында түгендеу деректерін сақтау пішімін сипаттайтын дерекқордағы құрылымдар айтарлықтай ерекшеленеді бұрын болған оқиғадан. Дегенмен, өнім үлгісі арқылы қоймадағы өнімнің санын қосу басқа атрибуттарды қосудан әлдеқайда қиын емес:

/** @var MagentoCatalogModelProduct $prodEntity */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
$inventory = [
    'is_in_stock' => true,
    'qty' => 1234
];
$prodEntity->setData('quantity_and_stock_status', $inventory);
$repoProd->save($prodEntity);

БАҚ

Әдетте, дүкендегі (электрондық коммерция) тұтынушыға арналған өнімге медиа қолдау көрсету ішкі есеп жүйесіндегі (ERP) қызметкерге бірдей өнімге арналған медиа қолдаудан ерекшеленеді. Бірінші жағдайда өнімді бетпе-бет көрсеткен жөн, екіншісінде өнім туралы жалпы түсінік беру жеткілікті. Дегенмен, ең болмағанда өнімнің негізгі бейнесін беру өте кең таралған. case деректерді импорттау кезінде.

Кескінді басқару тақтасы арқылы қосқанда, сурет алдымен уақытша каталогта сақталады (./pub/media/tmp/catalog/product) және өнімді сақтау кезінде ғана мультимедиа каталогына (./pub/media/catalog/product). Сондай-ақ, әкімші тақтасы арқылы қосылғанда, сурет тегтеледі image, small_image, thumbnail, swatch_image.

/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
/** @var MagentoCatalogModelProductGalleryCreateHandler $hndlGalleryCreate */
/* $imagePath = '/path/to/file.png';  $imagePathRelative = '/f/i/file.png' */
$imagePathRelative = $this->imagePlaceToTmpMedia($imagePath);
/* reload product with gallery data */
$product = $repoProd->get($sku);
/* add image to product's gallery */
$gallery['images'][] = [
    'file' => $imagePathRelative,
    'media_type' => 'image'
    'label' => ''
];
$product->setData('media_gallery', $gallery);
/* set usage areas */
$product->setData('image', $imagePathRelative);
$product->setData('small_image', $imagePathRelative);
$product->setData('thumbnail', $imagePathRelative);
$product->setData('swatch_image', $imagePathRelative);
/* create product's gallery */
$hndlGalleryCreate->execute($product);

Қандай да бір себептермен медиа өнімді бірінші рет сақтап, репозиторийден қайта шығарып алғаннан кейін ғана байланыстырылады. Және атрибутты көрсету керек label өнімнің мультимедиа галереясына жазба қосқанда (әйтпесе біз ерекшелік аламыз Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

Санаттар

Көбінесе дүкеннің санат құрылымы мен серверлік қолданба немесе олардағы өнімдерді орналастыру айтарлықтай ерекшеленуі мүмкін. Олардың ішіндегі санаттар мен өнімдер туралы деректерді тасымалдау стратегиялары көптеген факторларға байланысты. Бұл мысалда мен келесілерді ұстанамын:

  • сервер және дүкен санаттары аты бойынша салыстырылады;
  • егер дүкенде жоқ санат импортталса, ол түбірлік санат астында жасалады (Default Category) және оның дүкен каталогында әрі қарай орналасуы қолмен қабылданады;
  • өнім дүкенде жасалған кезде ғана санатқа тағайындалады (алғашқы импорт);

Санат туралы негізгі ақпарат кестеде берілген catalog_category_entity (санаттар каталогы). Magento-да санат жасау:

/** @var MagentoCatalogApiDataCategoryInterfaceFactory $factCat */
/** @var MagentoCatalogApiCategoryRepositoryInterface $repoCat */
$cat = $factCat->create();
$cat->setName($name);
$cat->setIsActive(true);
$repoCat->save($cat);

Өнімді санатқа байланыстыру санат идентификаторы мен өнімнің SKU көмегімен жүзеге асырылады:

/** @var MagentoCatalogModelCategoryProductLinkFactory $factCatProdLink */
/** @var MagentoCatalogApiCategoryLinkRepositoryInterface $repoCatLink */
$link = $factCatProdLink->create();
$link->setCategoryId($catMageId);
$link->setSku($prodSku);
$repoCatLink->save($link);

Барлығы

Өнімді Magento 2-ге бағдарламалық түрде қосу үшін код жазу өте оңай. Мен жоғарыда айтылғандардың барлығын демонстрациялық модульге біріктірдім «flancer32/mage2_ext_demo_import«. Модульде бір ғана консоль пәрмені бар fl32:import:prodJSON файлында сипатталған өнімдерді импорттайтын »./etc/data/products.json":

[
  {
    "sku": "...",
    "name": "...",
    "desc": "...",
    "desc_short": "...",
    "price": ...,
    "qty": ...,
    "categories": ["..."],
    "image_path": "..."
  }
]

Импортталатын суреттер каталогта бар ./etc/data/img.

Осы әдіспен 10 өнімді импорттау уақыты менің ноутбугымда шамамен 10 секундты құрайды. Бұл идеяны ары қарай дамытатын болсақ, сағатына 3600-ге жуық өнім әкелуге болады, ал 100 мың өнімді әкелу үшін 30 сағатқа жуық уақыт қажет деген қорытындыға келу оңай. Ноутбукті сервермен ауыстыру жағдайды біршама жеңілдетуге мүмкіндік береді. Мүмкін тіпті бірнеше рет. Бірақ үлкен тапсырыс бойынша емес. Мүмкін, бұл жылдамдық пен баяулық белгілі бір дәрежеде жобаның пайда болуының себептерінің бірі шығар magento/async-импорт.

Импорт жылдамдығын арттырудың түбегейлі шешімі дерекқорға тікелей кіру болуы мүмкін, бірақ бұл жағдайда Magento-ның кеңеюіне қатысты барлық «жақсылықтар» жоғалады - сіз «озық» дегеннің бәрін өзіңіз жасауыңыз керек. Дегенмен, бұл тұрарлық. Егер бұл нәтиже берсе, мен келесі мақалада дерекқорға тікелей жазу әдісін қарастырамын.

Ақпарат көзі: www.habr.com

пікір қалдыру