Magento 2: استيراد المنتجات من مصادر خارجية

Magento هو حل التجارة الإلكترونية ، أي أكثر تركيزًا على بيع المنتجات من المبيعات المصاحبة للمستودعات أو الخدمات اللوجستية أو المحاسبة المالية. التطبيقات الأخرى (مثل أنظمة تخطيط موارد المؤسسات) مناسبة بشكل أفضل للمرافقين. لذلك ، في كثير من الأحيان في ممارسة استخدام Magento ، تنشأ مهمة دمج متجر مع هذه الأنظمة الأخرى (على سبيل المثال ، مع 1C).


بشكل عام ، يمكن تقليل التكامل إلى تكرار البيانات عن طريق:


  • كتالوج (المنتجات ، الفئات) ؛
  • بيانات المخزون (مخزون المنتجات في المستودعات والأسعار) ؛
  • للعملاء
  • أوامر

Magento لمعالجة البيانات في قاعدة البيانات يوفر فئة منفصلة من الكائنات - المستودعات . نظرًا لخصائص Magento ، فإن إضافة البيانات إلى قاعدة البيانات من خلال المستودعات أمر سهل الترميز ، ولكن هذا يحدث ، دعنا نقول ، ليس بسرعة. في هذا المنشور ، أفكر في المراحل الرئيسية لإضافة منتج برمجيًا إلى Magento 2 بطريقة "كلاسيكية" - باستخدام فئات الريبو.


عادة ما يتم تكرار العملاء والأوامر إلى الجانب الآخر - من Magento إلى أنظمة ERP الخارجية. لذلك ، الأمر أسهل معهم ، على الجانب Magento ، تحتاج فقط إلى تحديد البيانات المناسبة ، ثم " الرصاص الذي أطلق من جانبنا ".


مبادئ كتابة البيانات إلى قاعدة البيانات


في الوقت الحالي ، يتم إنشاء الكائنات المخزنة في قاعدة البيانات برمجيًا في Magento من خلال Factory :


function __construct (\Magento\Cms\Model\BlockFactory $blockFactory) { $this->blockFactory = $blockFactory; } /** @var \Magento\Cms\Model\Block $block */ $block = $this->blockFactory->create(); 

والكتابة إلى قاعدة البيانات من خلال المستودع :


 function __construct (\Magento\Cms\Api\BlockRepositoryInterface $blockRepo) { $this->blockRepo = $blockRepo; } $this->blockRepo->save($block); 

يمكن استخدام نهج المصنع ومستودع التخزين في جميع الموديلات الرئيسية في مجال الماجنتو 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' نوع واحد من المنتجات ( type_id='simple' ) ، مجموعة من attribute_set_id=4 الافتراضية ( attribute_set_id=4 ) has_options سمات has_options و required_options . نظرًا لأن السمات entity_id و entity_id و entity_id يتم إنشاؤها تلقائيًا ، إذن ، في جوهرها ، نحتاج فقط إلى تحديد sku لإضافة منتج جديد. افعل هذا:


 /** @var \Magento\Catalog\Api\Data\ProductInterfaceFactory $factProd */ /** @var \Magento\Catalog\Api\ProductRepositoryInterface $repoProd */ /** @var \Magento\Catalog\Api\Data\ProductInterface $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 \Magento\Store\Model\StoreManagerInterface $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 \Magento\Catalog\Model\Product $prodEntity */ /** @var \Magento\Catalog\Api\ProductRepositoryInterface $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 ). أيضًا ، عند الإضافة من خلال small_image المسؤول ، يتم تعيين image على image ، small_image ، thumbnail ، swatch_image .


 /** @var \Magento\Catalog\Api\ProductRepositoryInterface $repoProd */ /** @var \Magento\Catalog\Model\Product\Gallery\CreateHandler $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 استثناء Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516 ).


الفئات


غالبًا ما يختلف هيكل فئات المتجر والتطبيقات الخلفية أو موضع المنتجات فيها اختلافًا كبيرًا. تعتمد استراتيجيات نقل البيانات حول الفئات والمنتجات فيها على العديد من العوامل. في هذا المثال ، ألتزم بما يلي:


  • تتم مقارنة فئات الخلفية وتخزين بالاسم.
  • إذا تم استيراد فئة غير موجودة في المتجر ، فسيتم إنشاؤها ضمن فئة الجذر ( Default Category ) ويتم افتراض موضعها الإضافي في كتالوج المتجر يدويًا ؛
  • يتم تعيين منتج لفئة فقط عندما يتم إنشاؤه في متجر (الاستيراد الأول) ؛

معلومات الفئة الأساسية موجودة في الجدول catalog_category_entity (كتالوج الفئة). إنشاء فئة في Magento:


 /** @var \Magento\Catalog\Api\Data\CategoryInterfaceFactory $factCat */ /** @var \Magento\Catalog\Api\CategoryRepositoryInterface $repoCat */ $cat = $factCat->create(); $cat->setName($name); $cat->setIsActive(true); $repoCat->save($cat); 

يتم تعيين المنتج لفئة حسب معرف الفئة ومنتج SKU:


 /** @var \Magento\Catalog\Model\CategoryProductLinkFactory $factCatProdLink */ /** @var \Magento\Catalog\Api\CategoryLinkRepositoryInterface $repoCatLink */ $link = $factCatProdLink->create(); $link->setCategoryId($catMageId); $link->setSku($prodSku); $repoCatLink->save($link); 

المجموع


من السهل جدًا كتابة التعليمات البرمجية لإضافة منتج إلى Magento 2 بطريقة برمجية. كل ما سبق ، لقد خفضت إلى وحدة العرض التوضيحي " flancer32 / mage2_ext_demo_import ". يوجد fl32:import:prod واحد فقط fl32:import:prod console في fl32:import:prod ، والذي يستورد المنتجات الموضحة في ملف JSON " ./etc/data/products.json ":


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

توجد صور للاستيراد في الدليل ./etc/data/img .


تبلغ مدة استيراد 10 منتجات بهذه الطريقة حوالي 10 ثوانٍ على الكمبيوتر المحمول. إذا قمنا بتطوير هذه الفكرة بشكل أكبر ، فمن السهل أن نستنتج أنه يمكن استيراد حوالي 3600 منتج في الساعة ، ويمكن أخذ حوالي 30 ساعة لاستيراد 100 ألف منتج. يتيح لك استبدال كمبيوتر محمول بخادم تخفيف الموقف إلى حد ما. ربما حتى في بعض الأحيان. ولكن ليس بأوامر من الحجم. ربما هذا السرعة البطء هو إلى حد ما أحد أسباب ظهور مشروع الماجنتو / الاستيراد غير المتزامن .


قد يكون القرار الأساسي لزيادة سرعة الاستيراد هو الكتابة مباشرة إلى قاعدة البيانات ، ولكن في هذه الحالة ، يتم فقد جميع "الكعك" المتعلقة بامتداد Magento - عليك أن تفعل كل شيء "متقدم" بنفسك. ومع ذلك ، الأمر يستحق كل هذا العناء. إذا نجحت ، فسننظر في النهج مع التسجيل المباشر في قاعدة البيانات في المقالة التالية.

Source: https://habr.com/ru/post/ar436020/


All Articles