Magento 2: வெளிப்புற மூலங்களிலிருந்து தயாரிப்புகளை இறக்குமதி செய்தல்

Magento என்பது ஒரு e-commerce தீர்வு, அதாவது. கிடங்கு, தளவாடங்கள் அல்லது நிதிக் கணக்கியல் ஆகியவற்றைக் காட்டிலும் தயாரிப்புகளை விற்பனை செய்வதை நோக்கமாகக் கொண்டது. பிற பயன்பாடுகள் (உதாரணமாக, ஈஆர்பி அமைப்புகள்) அதனுடன் இருக்கும் பயன்பாடுகளுக்கு மிகவும் பொருத்தமானது. எனவே, Magento ஐப் பயன்படுத்தும் நடைமுறையில், இந்த மற்ற அமைப்புகளுடன் (எடுத்துக்காட்டாக, 1C) ஒரு கடையை ஒருங்கிணைக்கும் பணி எழுகிறது.

மொத்தத்தில், ஒருங்கிணைப்பை தரவு நகலெடுப்பாக குறைக்கலாம்:

  • பட்டியல் (தயாரிப்புகள், வகைகள்);
  • சரக்கு தரவு (கிடங்குகள் மற்றும் விலைகளில் தயாரிப்பு நிலுவைகள்);
  • வாடிக்கையாளர்கள்;
  • உத்தரவுகள்;

தரவுத்தளத்தில் தரவை கையாளுவதற்கு 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:prod, இது JSON கோப்பில் விவரிக்கப்பட்டுள்ள தயாரிப்புகளை இறக்குமதி செய்கிறது "./etc/data/products.json":

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

இறக்குமதிக்கான படங்கள் பட்டியலில் உள்ளன ./etc/data/img.

இந்த முறையைப் பயன்படுத்தி 10 தயாரிப்புகளை இறக்குமதி செய்வதற்கான நேரம் எனது மடிக்கணினியில் 10 வினாடிகள் ஆகும். இந்த யோசனையை நாம் மேலும் வளர்த்துக் கொண்டால், ஒரு மணி நேரத்திற்கு சுமார் 3600 தயாரிப்புகளை இறக்குமதி செய்யலாம் என்ற முடிவுக்கு வருவது எளிது, மேலும் 100K தயாரிப்புகளை இறக்குமதி செய்ய சுமார் 30 மணிநேரம் ஆகும். மடிக்கணினியை சேவையகத்துடன் மாற்றுவது, நிலைமையை ஓரளவு சீராக்க உங்களை அனுமதிக்கிறது. பல முறை கூட இருக்கலாம். ஆனால் அளவு கட்டளைகளால் அல்ல. ஒருவேளை இந்த வேகமும் மந்தநிலையும் ஓரளவிற்கு திட்டத்தின் தோற்றத்திற்கான காரணங்களில் ஒன்றாகும் magento/async-இறக்குமதி.

இறக்குமதியின் வேகத்தை அதிகரிப்பதற்கான ஒரு தீவிரமான தீர்வு தரவுத்தளத்தில் நேரடியாக நுழைவதாக இருக்கலாம், ஆனால் இந்த விஷயத்தில் Magento இன் விரிவாக்கம் தொடர்பான அனைத்து "இன்னங்களும்" இழக்கப்படுகின்றன - எல்லாவற்றையும் "மேம்பட்ட" நீங்களே செய்ய வேண்டும். இருப்பினும், அது மதிப்புக்குரியது. அது செயல்பட்டால், அடுத்த கட்டுரையில் தரவுத்தளத்திற்கு நேரடியாக எழுதும் அணுகுமுறையை பரிசீலிப்பேன்.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்