پرو ہوسٹر > بلاگ > انتظامیہ > Magento 2: مصنوعات کو براہ راست ڈیٹا بیس میں درآمد کریں۔
Magento 2: مصنوعات کو براہ راست ڈیٹا بیس میں درآمد کریں۔
В پچھلا مضمون میں نے Magento 2 میں مصنوعات کی درآمد کے عمل کو معمول کے مطابق ماڈلز اور ریپوزٹریز کے ذریعے بیان کیا۔ معمول کے طریقہ کار میں ڈیٹا پروسیسنگ کی رفتار بہت کم ہوتی ہے۔ میرا لیپ ٹاپ فی سیکنڈ تقریباً ایک پروڈکٹ تیار کر رہا تھا۔ اس تسلسل میں، میں کسی پروڈکٹ کو درآمد کرنے کے متبادل طریقے پر غور کرتا ہوں - ڈیٹا بیس میں براہ راست داخلے کے ذریعے، معیاری Magento 2 میکانزم (ماڈل، فیکٹریاں، ذخیرے) کو نظرانداز کرتے ہوئے۔ مصنوعات کو درآمد کرنے کے اقدامات کی ترتیب کو کسی بھی پروگرامنگ زبان میں ڈھال لیا جا سکتا ہے جو MySQL کے ساتھ کام کر سکتی ہے۔
اعلانِ لاتعلقی: Magento کے لیے ریڈی میڈ فعالیت ہے۔ ڈیٹا کی درآمد اور، غالباً، یہ آپ کے لیے کافی ہوگا۔ تاہم، اگر آپ کو درآمدی عمل پر مزید مکمل کنٹرول کی ضرورت ہے، جو آپ کے پاس ہے اس کے لیے CSV فائل تیار کرنے تک محدود نہیں، بلی میں خوش آمدید۔
دونوں مضامین لکھنے کے نتیجے میں آنے والے کوڈ کو Magento ماڈیول میں دیکھا جا سکتا ہے۔flancer32/mage2_ext_demo_import" یہاں کچھ پابندیاں ہیں جن پر میں نے ڈیمو ماڈیول کوڈ کو آسان بنانے کے لیے پیروی کی:
مصنوعات صرف تخلیق کی جاتی ہیں، اپ ڈیٹ نہیں کی جاتی ہیں۔
ایک گودام
صرف زمرے کے نام درآمد کیے جاتے ہیں، ان کی ساخت کے بغیر
ڈیٹا ڈھانچے ورژن 2.3 کے مطابق ہیں۔
ایک پروڈکٹ درآمد کرنے کے لیے JSON:
{
"sku": "MVA20D-UBV-3",
"name": "Заглушка для пломбировки ВА47-29 IEK",
"desc": "Обеспечение доступа к устройствам ...",
"desc_short": "Заглушка для пломбировки ВА47-29 IEK предназначена для ...",
"price": 5.00,
"qty": 25,
"categories": ["Категория 1", "Категория 2"],
"image_path": "mva20d_ubv_3.png"
}
درآمد کے اہم مراحل کا جائزہ
خود پروڈکٹ کی رجسٹریشن
مصنوعات اور ویب سائٹ کے درمیان کنکشن
بنیادی مصنوعات کی خصوصیات (EAV)
انوینٹری ڈیٹا (اسٹاک میں مصنوعات کی مقدار)
میڈیا (تصاویر)
کیٹلاگ کیٹیگریز کے ساتھ کنکشن
پروڈکٹ رجسٹریشن
پروڈکٹ کی بنیادی معلومات اس میں مل سکتی ہیں۔ catalog_product_entity:
CREATE TABLE `catalog_product_entity` (
`entity_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Entity Id',
`attribute_set_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Attribute Set ID',
`type_id` varchar(32) NOT NULL DEFAULT 'simple' COMMENT 'Type ID',
`sku` varchar(64) DEFAULT NULL COMMENT 'SKU',
`has_options` smallint(6) NOT NULL DEFAULT '0' COMMENT 'Has Options',
`required_options` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Required Options',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Creation Time',
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Update Time',
PRIMARY KEY (`entity_id`),
KEY `CATALOG_PRODUCT_ENTITY_ATTRIBUTE_SET_ID` (`attribute_set_id`),
KEY `CATALOG_PRODUCT_ENTITY_SKU` (`sku`)
)
پروڈکٹ رجسٹری میں اندراج بنانے کے لیے درکار کم از کم معلومات یہ ہیں:
attribute_set_id
sku
اضافی:
type_id - اگر ہم اس کی وضاحت نہیں کرتے ہیں، تو 'سادہ' استعمال کیا جائے گا۔
ڈیٹا بیس پر براہ راست لکھنے کے لیے، میں خود Magento کا DB اڈاپٹر استعمال کرتا ہوں:
نئی رجسٹرڈ پروڈکٹ کا ابھی تک کوئی نام یا تفصیل نہیں ہے۔ یہ سب کچھ کے ذریعے کیا جاتا ہے۔ EAV اوصاف. یہاں پراڈکٹ کے بنیادی اوصاف کی ایک فہرست ہے جو پروڈکٹ کو سامنے پر صحیح طریقے سے ظاہر کرنے کے لیے درکار ہیں:
name
price
description
short_description
status
tax_class_id
url_key
visibility
اس طرح کے پروڈکٹ میں ایک الگ وصف شامل کیا جاتا ہے (شناخت کنندہ حاصل کرنے کی تفصیلات اور اس کے کوڈ سے وصف کی قسم کو خارج کر دیا جاتا ہے):
public function create($prodId, $attrCode, $attrValue)
{
$attrId = /* get attribute ID by attribute code */
$attrType = /* get attribute type [datetime|decimal|int|text|varchar]) by attribute code */
if ($attrId) {
/** @var MagentoFrameworkAppResourceConnection $this->resource */
/** @var MagentoFrameworkDBAdapterPdoMysql $conn */
$conn = $this->resource->getConnection();
$tblName = 'catalog_product_entity_' . $attrType;
$table = $this->resource->getTableName($tblName);
$bind = [
'attribute_id' => $attrId,
'entity_id' => $prodId,
/* put all attributes to default store view with id=0 (admin) */
'store_id' => 0,
'value' => $attrValue
];
$conn->insert($table, $bind);
}
}
انتساب کوڈ کا استعمال کرتے ہوئے، ہم اس کی شناخت اور ڈیٹا کی قسم کا تعین کرتے ہیں (datetime, decimal, int, text, varchar)، پھر انتظامی ونڈو کے لیے ڈیٹا کو مناسب جدول میں لکھیں (store_id = 0).
پروڈکٹ میں مندرجہ بالا صفات کو شامل کرنے کے بعد، آپ کو ایڈمن پینل میں یہ تصویر ملتی ہے:
انوینٹری ڈیٹا
Magento میں ورژن 2.3 سے شروع کرتے ہوئے، میزوں کے دو متوازی سیٹ ہیں جو انوینٹری کی معلومات کا ذخیرہ فراہم کرتے ہیں (مصنوعات کی مقدار):
آپ کو دونوں ڈھانچے میں انوینٹری ڈیٹا شامل کرنے کی ضرورت ہے، کیونکہ نیا ڈھانچہ ابھی تک پرانے سے مکمل طور پر آزاد نہیں ہے (یہ بہت ممکن ہے کہ اس کے لیے default نئے ڈھانچے میں گودام میں ایک میز شامل ہے۔ cataloginventory_stock_status کے طور پر inventory_stock_1).
cataloginventory_
میگنیٹو 2.3 کو تعینات کرتے وقت ہمارے پاس ابتدائی طور پر 2 اندراجات ہوتے ہیں۔ store_website، جو دو سائٹس کے مساوی ہے - انتظامی اور مرکزی کلائنٹ:
یعنی ہمارے پرانے ڈھانچے میں صرف ایک "گودام" ہے (stock) اور یہ انتظامی ویب سائٹ سے منسلک ہے۔ ایڈمن پینل کے ذریعے نئے شامل کرنا sources/stocks MSI میں (نئی ساخت) کے نتیجے میں نئی اندراجات نہیں ہوتی ہیں۔ cataloginventory_stock.
پرانے ڈھانچے میں مصنوعات کے بارے میں انوینٹری ڈیٹا ابتدائی طور پر جدولوں میں ریکارڈ کیا جاتا ہے:
cataloginventory_stock_item
cataloginventory_stock_status
cataloginventory_stock_item
function createOldItem($prodId, $qty)
{
$isQtyDecimal = (((int)$qty) != $qty);
$isInStock = ($qty > 0);
/** @var MagentoFrameworkAppResourceConnection $this->resource */
/** @var MagentoFrameworkDBAdapterPdoMysql $conn */
$conn = $this->resource->getConnection();
$table = $this->resource->getTableName('cataloginventory_stock_item');
$bind = [
'product_id' => $prodId,
/* we use one only stock in 'cataloginventory' structure by default */
'stock_id' => 1,
'qty' => $qty,
'is_qty_decimal' => $isQtyDecimal,
'is_in_stock' => $isInStock,
/* default stock is bound to admin website (see `cataloginventory_stock`) */
'website_id' => 0
];
$conn->insert($table, $bind);
}
cataloginventory_stock_status
function createOldStatus($prodId, $qty)
{
$isInStock = ($qty > 0);
/** @var MagentoFrameworkAppResourceConnection $this->resource */
/** @var MagentoFrameworkDBAdapterPdoMysql $conn */
$conn = $this->resource->getConnection();
$table = $this->resource->getTableName('cataloginventory_stock_status');
$bind = [
'product_id' => $prodId,
/* we use one only stock in 'cataloginventory' structure by default */
'stock_id' => 1,
'qty' => $qty,
'stock_status' => MagentoCatalogInventoryApiDataStockStatusInterface::STATUS_IN_STOCK,
/* default stock is bound to admin website (see `cataloginventory_stock`) */
'website_id' => 0
];
$conn->insert($table, $bind);
}
انوینٹری_
ابتدائی طور پر، انوینٹری ڈیٹا کو ذخیرہ کرنے کے لیے نئے ڈھانچے میں 1 "ذرائع("inventory_source):
«ماخذ» مصنوعات کے لیے فزیکل اسٹوریج کی نمائندگی کرتا ہے (ریکارڈ میں فزیکل کوآرڈینیٹس اور میلنگ ایڈریس ہوتا ہے)۔ "گودام"متعدد "ذرائع" کا ایک منطقی اتحاد ہے (inventory_source_stock_link)
اس سطح پر جس پر سیلز چینل سے کنکشن ہوتا ہے (inventory_stock_sales_channel)
type |code|stock_id|
-------|----|--------|
website|base| 1|
اعداد و شمار کے ڈھانچے کو دیکھتے ہوئے، مختلف قسم کے سیلز چینلز فرض کیے جاتے ہیں، لیکن پہلے سے طے شدہ طور پر صرف کنکشن "اسٹاک"-"ویب سائٹ"(ویب سائٹ کا لنک ویب سائٹ کوڈ کی پیروی کرتا ہے - base).
ایک"گودام"کئی سے منسلک کیا جا سکتا ہے"ذرائع"اور ایک "ذرائع"- کئی تک"گودام"(بہت سے زیادہ رشتہ)۔ مستثنیات پہلے سے طے شدہ ہیں "ذرائع"اور"گودام" وہ دوسرے اداروں سے دوبارہ منسلک نہیں ہیں (کوڈ کی سطح پر حد - غلطی "ڈیفالٹ سورس یا ڈیفالٹ اسٹاک سے متعلق لنک کو محفوظ نہیں کیا جا سکتا")۔ Magento 2 میں MSI ڈھانچے کے بارے میں مزید تفصیلات مضمون میں مل سکتی ہیں۔CQRS اور ایونٹ سورسنگ کا استعمال کرتے ہوئے ویئر ہاؤس مینجمنٹ سسٹم۔ ڈیزائن".
میں ڈیفالٹ کنفیگریشن استعمال کروں گا اور انوینٹری کی تمام معلومات کو سورس میں شامل کروں گا۔ default، جو کوڈ کے ساتھ ویب سائٹ سے وابستہ سیلز چینل میں شامل ہے۔ base (اسٹور کے سامنے والے سرے سے مساوی ہے - دیکھیں store_website):
ایڈمن پینل میں پروڈکٹ میں انوینٹری ڈیٹا شامل کرنے کے بعد، آپ کو یہ تصویر ملتی ہے:
میڈیا
ایڈمن پینل کے ذریعے کسی پروڈکٹ میں "دستی طور پر" تصویر شامل کرنے پر، متعلقہ معلومات درج ذیل جدولوں میں لکھی جاتی ہیں:
catalog_product_entity_media_gallery: میڈیا رجسٹری (تصاویر اور ویڈیو فائلز)؛
catalog_product_entity_media_gallery_value: میڈیا کو مصنوعات اور نمائشوں سے جوڑنا (لوکلائزیشن)؛
catalog_product_entity_media_gallery_value_to_entity: میڈیا کو صرف مصنوعات سے منسلک کرنا (ممکنہ طور پر پروڈکٹ کے لیے پہلے سے طے شدہ میڈیا مواد)؛
catalog_product_entity_varchar: وہ کردار جن میں تصویر استعمال کی گئی ہے وہ یہاں محفوظ ہیں۔
اور تصاویر خود ڈائریکٹری میں محفوظ ہوجاتی ہیں۔ ./pub/media/catalog/product/x/y/جہاں x и y - تصویری فائل کے نام کے پہلے اور دوسرے حروف۔ مثال کے طور پر، فائل image.png کے طور پر محفوظ کیا جانا چاہئے ./pub/media/catalog/product/i/m/image.png، تاکہ پلیٹ فارم کیٹلاگ سے مصنوعات کی وضاحت کرتے وقت اسے بطور تصویر استعمال کر سکے۔
catalog_product_entity_media_gallery
رجسٹر میں پوسٹ کیا گیا۔ ./pub/media/catalog/product/ میڈیا فائل (فائل رکھنے کے عمل پر اس مضمون میں بحث نہیں کی گئی ہے):
ہم رجسٹرڈ میڈیا فائل کو متعلقہ پروڈکٹ کے ساتھ کسی بھی اسٹور فرنٹ سے منسلک کیے بغیر منسلک کرتے ہیں۔ یہ واضح نہیں ہے کہ یہ ڈیٹا بالکل کہاں استعمال ہوا ہے اور پچھلے ٹیبل سے ڈیٹا تک رسائی کیوں ناممکن ہے، لیکن یہ ٹیبل موجود ہے اور جب پروڈکٹ میں تصویر شامل کی جاتی ہے تو اس پر ڈیٹا لکھا جاتا ہے۔ تو بس۔
ایک میڈیا فائل کو مختلف کرداروں کے ساتھ استعمال کیا جا سکتا ہے (متعلقہ انتساب کوڈ قوسین میں اشارہ کیا گیا ہے):
بنیاد(image)
چھوٹی تصویر (small_image)
تھمب نیل (thumbnail)
سویچ امیج (swatch_image)
میڈیا فائل سے کرداروں کو جوڑنا بالکل وہی ہے جو اس میں ہوتا ہے۔ catalog_product_entity_varchar. بائنڈنگ کوڈ میں کوڈ کی طرح ہے "مصنوعات کی بنیادی خصوصیات".
ایڈمن پینل میں پروڈکٹ میں تصویر شامل کرنے کے بعد یہ اس طرح لگتا ہے:
زمرہ جات
زمرہ کے لحاظ سے ڈیٹا پر مشتمل اہم میزیں:
catalog_category_entity: زمروں کا رجسٹر؛
catalog_category_product: مصنوعات اور زمروں کے درمیان تعلق؛
catalog_category_entity_*: EAV انتساب اقدار؛
ابتدائی طور پر، ایک خالی Magento ایپلی کیشن میں، زمرہ رجسٹری میں 2 زمرے ہوتے ہیں (میں نے کالم کے ناموں کو مختصر کیا: crt - created_at, upd - updated_at):
id=1 والا زمرہ پورے Magento کیٹلاگ کی جڑ ہے اور نہ تو ایڈمن پینل میں یا صفحہ اول پر دستیاب ہے۔ id=2 کے ساتھ زمرہ (پہلے سے طے شدہ زمرہ) مرکزی سائٹ کے مین اسٹور کے لیے روٹ کیٹیگری ہے (مرکزی ویب سائٹ اسٹورجب ایپلی کیشن تعینات کی جاتی ہے تو بنائی جاتی ہے (دیکھیں۔ ایڈمن / اسٹورز / تمام اسٹورز)۔ مزید یہ کہ اسٹور کی جڑ کیٹیگری بھی سامنے دستیاب نہیں ہے، صرف اس کی ذیلی زمرہ جات ہیں۔
چونکہ اس مضمون کا موضوع اب بھی مصنوعات پر ڈیٹا درآمد کر رہا ہے، اس لیے میں زمرہ جات بناتے وقت ڈیٹا بیس میں براہ راست داخلے کا استعمال نہیں کروں گا، لیکن خود Magento کی فراہم کردہ کلاسز کا استعمال کروں گا (ماڈل اور ریپوزٹریز)۔ ڈیٹا بیس میں براہ راست اندراج صرف درآمد شدہ پروڈکٹ کو زمرہ کے ساتھ منسلک کرنے کے لیے استعمال کیا جاتا ہے (زمرہ اس کے نام سے مماثل ہے، اور زمرہ کی شناخت مماثلت کے دوران حاصل کی جاتی ہے):
اضافی کارروائیاں کرنے کے بعد ایڈمن پینل میں مصنوعات:
اور سامنے:
خلاصہ
پروڈکٹس کا وہی سیٹ (10 ٹکڑے) جیسا کہ پچھلے مضمون میں ہے کم از کم ایک آرڈر کی شدت کے ساتھ تیزی سے درآمد کیا جاتا ہے (1 سیکنڈ بمقابلہ 10)۔ رفتار کا زیادہ درست اندازہ لگانے کے لیے، آپ کو پروڈکٹس کی ایک بڑی تعداد کی ضرورت ہے - کئی سو، یا اس سے بہتر لیکن ہزاروں۔ تاہم، ان پٹ ڈیٹا کے اتنے چھوٹے سائز کے ساتھ بھی، ہم یہ نتیجہ اخذ کر سکتے ہیں کہ میگینٹو (ماڈل اور ریپوزٹریز) کے ذریعہ فراہم کردہ ٹولز کا استعمال اہم ہے (میں زور دیتا ہوں - زیادہ سے زیادہ!) مطلوبہ فعالیت کی ترقی کو تیز کریں، لیکن ساتھ ہی نمایاں طور پر (میں زور دیتا ہوں - زیادہ سے زیادہ!) اس رفتار کو کم کریں جس سے ڈیٹا ڈیٹا بیس میں آتا ہے۔
اس کے نتیجے میں پانی گیلا نکلا اور یہ وحی نہیں ہے۔ تاہم، اب میرے پاس کھیلنے کا کوڈ ہے اور شاید کچھ اور دلچسپ نتائج پر پہنچوں۔