Magento 2: ምርቶችን ከውጭ ምንጮች ማስመጣት

ማጌንቶ የኢ-ኮሜርስ መፍትሔ ነው, ማለትም. ምርቶችን ከመጋዘን፣ ከሎጂስቲክስ ወይም ከሽያጮች ጋር ካለው የፋይናንሺያል ሂሳብ ይልቅ ለመሸጥ ያለመ ነው። ሌሎች አፕሊኬሽኖች (ለምሳሌ ኢአርፒ ሲስተሞች) ለተጓዳኝ አፕሊኬሽኖች የተሻሉ ናቸው። ስለዚህ ፣ ብዙውን ጊዜ ማጌንቶን በመጠቀም ሱቅን ከሌሎች ስርዓቶች ጋር የማዋሃድ ተግባር (ለምሳሌ ፣ 1 ሲ) ይነሳል።

በአጠቃላይ፣ ውህደትን ወደ ውሂብ ማባዛት በሚከተለው መቀነስ ይቻላል፡-

  • ካታሎግ (ምርቶች, ምድቦች);
  • የእቃ ዝርዝር መረጃ (በመጋዘኖች እና ዋጋዎች ውስጥ የምርት ሚዛኖች);
  • ደንበኞች;
  • ትዕዛዞች;

ማጌንቶ በመረጃ ቋቱ ውስጥ ያለውን መረጃ ለመቆጣጠር የተለየ የነገሮችን ክፍል ያቀርባል - ማከማቻዎች. በማጌንቶ ልዩ ነገሮች ምክንያት በመረጃ ቋቱ ውስጥ መረጃን በማጠራቀሚያዎች ውስጥ ማከል ቀላል ነው ፣ ግን እሱ ቀርፋፋ ነው እንበል። በዚህ ህትመት ውስጥ አንድ ምርት ወደ Magento 2 በ “ክላሲክ” መንገድ የማከል ዋና ዋና ደረጃዎችን እቆጥራለሁ - የሬፖ ክፍሎችን በመጠቀም።

ደንበኞች እና ትዕዛዞች ብዙውን ጊዜ በሌላ አቅጣጫ ይባዛሉ - ከማጌንቶ ወደ ውጫዊ የኢአርፒ ስርዓቶች። ስለዚህ ፣ ከእነሱ ጋር ቀላል ነው ፣ ከማጌንቶ በኩል ተገቢውን ውሂብ ብቻ መምረጥ ያስፈልግዎታል እና ከዚያ “ጥይቶች ከጎናችን ወጡ".

ውሂብን ወደ የውሂብ ጎታ የመቅዳት መርሆዎች

በአሁኑ ጊዜ በመረጃ ቋቱ ውስጥ የተቀመጡ ዕቃዎችን በፕሮግራም በማጄንቶ መፍጠር ይከናወናል ፋብሪካ:

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);

የ"ፋብሪካ" እና "ማጠራቀሚያ" አቀራረብ በማጌንቶ 2 ጎራ ውስጥ ላሉ ዋና ዋና ሞዴሎች ሁሉ ጥቅም ላይ ሊውል ይችላል።

መሠረታዊ የምርት መረጃ

ከማጌንቶ 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);

ተጨማሪ ባህሪዎች

ማጌንቶን በመጠቀም ተጨማሪ የምርት ባህሪዎችን ማካሄድ አስደሳች ነው። የ 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);

ሚዲያ

እንደ አንድ ደንብ, በሱቅ (ኢ-ኮሜርስ) ውስጥ ለደንበኛው ምርት የሚዲያ ድጋፍ በውስጣዊ የሂሳብ አያያዝ ስርዓት (ኢአርፒ) ውስጥ ለአንድ ሠራተኛ ለተመሳሳይ ምርት ከሚዲያ ድጋፍ ይለያል ። በመጀመሪያው ሁኔታ ምርቱን ፊት ለፊት ማሳየት ተገቢ ነው, በሁለተኛው ውስጥ, ስለ ምርቱ አጠቃላይ ሀሳብ መስጠት በቂ ነው. ነገር ግን፣ ቢያንስ የአንድን ምርት ዋና ምስል ማስተላለፍ በጣም የተለመደ ነው። 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:prodበJSON ፋይል ውስጥ የተገለጹትን ምርቶች የሚያስመጣ./ወዘተ/data/products.json":

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

የማስመጣት ሥዕሎች በካታሎግ ውስጥ አሉ። ./etc/data/img.

ይህንን ዘዴ በመጠቀም 10 ምርቶችን የማስመጣት ጊዜ በእኔ ላፕቶፕ ላይ 10 ሰከንድ ያህል ነው። ይህንን ሃሳብ የበለጠ ካዳበርነው በሰአት ወደ 3600 የሚጠጉ ምርቶች ወደ ሀገር ውስጥ ሊገቡ እንደሚችሉ እና 100ሺህ ምርቶችን ለማስገባት 30 ሰአት ሊፈጅ ይችላል ወደሚል መደምደሚያ ላይ መድረስ ቀላል ነው። ላፕቶፕን በአገልጋይ መተካት ሁኔታውን በመጠኑ እንዲያስተካክሉ ያስችልዎታል። ምናልባት ብዙ ጊዜ እንኳን. ግን በታዛዥነት አይደለም። ምናልባት ይህ ፍጥነት እና ዘገምተኛነት በተወሰነ ደረጃ ለፕሮጀክቱ መከሰት አንዱ ምክንያት ሊሆን ይችላል magento/async-ማስመጣት.

የማስመጣት ፍጥነትን ለመጨመር ሥር ነቀል መፍትሔ በቀጥታ ወደ የውሂብ ጎታው ውስጥ መግባት ሊሆን ይችላል ፣ ግን በዚህ ሁኔታ የማጌንቶን አቅምን በተመለከተ ሁሉም “ጥሩ ነገሮች” ጠፍተዋል - ሁሉንም ነገር እራስዎ ማድረግ አለብዎት ። ይሁን እንጂ ዋጋ ያለው ነው. ከተሰራ, በሚቀጥለው ርዕስ ውስጥ ወደ ዳታቤዝ በቀጥታ ከመጻፍ ጋር ያለውን አቀራረብ ግምት ውስጥ አስገባለሁ.

ምንጭ: hab.com

አስተያየት ያክሉ