Magento 2: Hilberîna Hilberan ji Çavkaniyên Derveyî

Magento çareseriyek e-bazirganiyê ye, ango. Armanca wê zêdetir firotina hilberan e ji depokirin, lojîstîk an hesabên darayî yên bi firotanê re. Serîlêdanên din (mînak, pergalên ERP) ji bo serîlêdanên pêvekirî çêtir in. Ji ber vê yekê, pir caran di pratîka karanîna Magento de peywira yekkirina firotgehek bi van pergalên din re (mînak, 1C) derdikeve holê.

Bi gelemperî, entegrasyon dikare ji nûvekirina daneyan re kêm bibe:

  • katalog (hilber, kategorî);
  • Daneyên envanterê (hevsengiyên hilberê li embaran û bihayan);
  • xerîdar;
  • orders;

Magento çînek veqetandî ya tiştan pêşkêşî dike ji bo manipulasyona daneyan di databasê de - depoyên. Ji ber taybetmendiyên Magento, zêdekirina daneyan li databasê bi navgîniya depoyan hêsan e ku kod bike, lê ew, em bibêjin, hêdî ye. Di vê weşanê de, ez qonaxên sereke yên bi bernamekî lê zêdekirina hilberek li Magento 2 bi awayê "klasîk" dihesibînim - bi karanîna dersên repo.

Xerîdar û ferman bi gelemperî di rêyek din de têne dubare kirin - ji Magento heya pergalên ERP yên derveyî. Ji ber vê yekê, ew bi wan re hêsantir e, li aliyê Magento hûn tenê hewce ne ku daneyên guncan hilbijêrin, û dûv re "gule ji milê me derketin".

Prensîbên tomarkirina daneyan di databasekê de

Heya nuha, afirandina tiştên ku di databasê de bi bername li Magento hatine tomarkirin bi navgîniya têne kirin Karxane:

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

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

û nivîsandina databasê bi rê ve tê kirin Daxistin:

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

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

Nêzîkatiya "Factory" û "Repository" dikare ji bo hemî modelên sereke yên di qada Magento 2 de were bikar anîn.

Agahdariya Hilbera bingehîn

Ez li avahiyek daneyê digerim ku bi guhertoya Magento 2.3 re têkildar e. Agahdariya herî bingehîn di derbarê hilberê de di tabloyê de ye catalog_product_entity (qeyda hilberê):

entity_id
attribute_set_id
type_id
sku
has_options
required_options
created_at
updated_at

Ez bi yek celeb hilberek sînorkirî me (type_id='simple'), komek taybetmendiyên xwerû (attribute_set_id=4) û taybetmendiyan paşguh bikin has_options и required_options. Ji ber ku taybetmendiyên entity_id, created_at и updated_at bixweber têne çêkirin, wê hingê, bi rastî, ji bo ku hilberek nû lê zêde bikin, em tenê hewce ne ku saz bikin sku. Ez vê dikim:

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

û ez îstisnayek distînim:

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

Ez navê hilberê li daxwazê ​​zêde dikim û peyamek distînim ku taybetmendî winda ye Price. Piştî lê zêdekirina bihayê, hilber li databasê tê zêdekirin:

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

Navê hilberê di tabloya taybetmendiya hilberê varchar de tê hilanîn (catalog_product_entity_varchar), biha - di tabloyê de catalog_product_entity_decimal. Berî ku hilberek zêde bikin, tê pêşniyar kirin ku hûn bi eşkere destnîşan bikin ku em pêşangeha îdarî bikar tînin da ku daneyan derxînin:

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

Taybetmendiyên Zêdeyî

Pêvajoya taybetmendiyên hilberê yên zêde bi karanîna Magento kêfxweş e. Modela daneya EAV ji bo saziyên sereke (li tabloyê binêre eav_entity_type) yek ji taybetmendiyên sereke yên vê platformê ye. Em tenê taybetmendiyên guncan li modela hilberê zêde dikin:

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

û dema ku modêlê bi navgîniya repoyê ve tê hilanîn:

$repoProd->save($prod);

taybetmendiyên din jî dê di tabloyên databasê yên têkildar de werin hilanîn.

Daneyên envanterê

Bi gotinên hêsan - mîqdara hilberê di stokê de. Di Magento 2.3 de, strukturên di databasê de ku forma ji bo hilanîna daneyên depoyê vedibêjin ev in. girîng cuda ji tiştê ku berê qewimî. Lêbelê, zêdekirina mîqdara hilberek li stokê bi modela hilberê ve ji lê zêdekirina taybetmendiyên din ne dijwartir e:

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

Medya

Wekî qaîdeyek, piştgiriya medyayê ji bo hilberek ji bo xerîdarek li firotgehekê (e-bazirganî) ji piştgirîya medyayê ya heman hilberê ji bo karmendek di pergala hesabê navxweyî (ERP) de cûda dibe. Di doza yekem de, tê pêşniyar kirin ku di ya duyemîn de hilberê rû bi rû nîşan bidin, bes e ku meriv ramanek giştî ya hilberê bide. Lêbelê, veguheztina bi kêmanî wêneya bingehîn a hilberek pir gelemperî ye. case dema ku daneyan îtxal dikin.

Dema ku wêneyek bi panela rêveberiyê ve zêde bike, wêne pêşî di pelrêçek demkî de tê tomar kirin (./pub/media/tmp/catalog/product) û tenê dema hilbera hilberê tê veguheztin pelrêça medyayê (./pub/media/catalog/product). Di heman demê de, dema ku bi panela rêveberiyê ve were zêdekirin, wêne tê nîşankirin 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);

Ji ber hin sedeman, medya tenê piştî hilbera yekem hilber û ji nû ve hilanîna wê ji depoyê ve girêdayî ye. Û hûn hewce ne ku taybetmendiyê diyar bikin label dema ku têketinek li galeriya medyaya hilberê zêde bikin (wek din em îstîsnayek digirin Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

Kategorî

Bi gelemperî, strukturên kategoriya firotgehê û serîlêdana paşde an cîhkirina hilberan di wan de dikare bi girîngî cûda bibe. Stratejiyên ji bo koçkirina daneyan di derbarê kategorî û hilberên di nav wan de bi gelek faktoran ve girêdayî ye. Di vê nimûneyê de ez li ser jêrîn disekinim:

  • kategoriyên paşverû û dikanê bi navî têne berhev kirin;
  • heke kategoriyek ku ne di firotgehê de ye were import kirin, wê hingê ew di binê kategoriya root de tête çêkirin (Default Category) û pozîsyona wê ya din a di kataloga firotgehê de bi destan tê texmîn kirin;
  • hilberek tenê dema ku ew di firotgehê de hatî çêkirin ji kategoriyek re tê veqetandin (vekêşana yekem);

Agahiyên bingehîn ên derbarê kategoriyê de di tabloyê de ne catalog_category_entity (kataloga kategoriyan). Afirandina kategoriyek li Magento:

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

Girêdana hilberek bi kategoriyekê re bi karanîna nasnameya kategoriyê û SKU-ya hilberê tête kirin:

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

Tevahî

Nivîsandina kodê ku meriv hilberek bi bername li Magento 2 zêde bike pir hêsan e. Min her tiştê ku li jor hatî destnîşan kirin di modulek demo de berhev kiriye "flancer32/mage2_ext_demo_import". Di modulê de tenê yek fermana konsolê heye fl32:import:prod, ku hilberên ku di pelê JSON de hatine diyar kirin import dike "./etc/data/products.json":

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

Wêneyên ji bo importê di katalogê de ne ./etc/data/img.

Wextê ku meriv 10 hilberan bi karanîna vê rêbazê veguhezîne bi qasî 10 saniyeyan li ser laptopa min e. Ger em vê ramanê pêşdetir bi pêş bixin, hêsan e ku meriv bigihîje wê encamê ku di saetekê de nêzî 3600 hilber dikarin werin îtxal kirin, û ji bo îtxalkirina 100K hilberan dikare bi qasî 30 demjimêran bigire. Veguheztina laptopek bi serverek dihêle hûn rewşê hinekî xweş bikin. Dibe ku çend caran jî. Lê ne bi fermanên mezin. Dibe ku ev lez û hêdîbûn heta radeyekê yek ji sedemên derketina projeyê be magento / async-import.

Çareseriyek radîkal ji bo zêdekirina leza importê dibe ku rasterast têketina databasê be, lê di vê rewşê de hemî "baş" di derbarê berbelavbûna Magento de winda dibin - hûn ê neçar bimînin ku her tiştê "pêşkeftî" bixwe bikin. Lêbelê, ew hêja ye. Ger ew biserkeve, ez ê di gotara pêş de nêzîkatiya bi nivîsandina rasterast a databasê binirxînim.

Source: www.habr.com

Add a comment