В
دادعا: میګینټو لپاره چمتو شوي فعالیت لري
کوډ چې د دواړو مقالو لیکلو پایله ده د میګینټو ماډل کې لیدل کیدی شي "
- محصولات یوازې جوړ شوي، نوي شوي ندي.
- یو ګودام
- یوازې د کټګورۍ نومونه وارد شوي، پرته له دې چې جوړښت
- د معلوماتو جوړښتونه د 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
- که موږ دا مشخص نه کړو، نو 'ساده' به وکارول شي
ډیټابیس ته مستقیم لیکلو لپاره ، زه پخپله د میګینټو DB اډاپټر کاروم:
function create($sku, $typeId, $attrSetId)
{
/** @var MagentoFrameworkAppResourceConnection $this->resource */
/** @var MagentoFrameworkDBAdapterPdoMysql $conn */
$conn = $this->resource->getConnection();
$table = $this->resource->getTableName('catalog_product_entity');
$bind = [
'sku' => $sku,
'type_id' => $typeId,
'attribute_set_id' => $attrSetId
];
$conn->insert($table, $bind);
$result = $conn->lastInsertId($table);
return $result;
}
د محصول ثبتولو وروسته catalog_product_entity
دا په اډمین پینل کې ښکاره کیږي، د محصول په شبکه کې (کتلاګ/محصولات).
د محصول او ویب پاڼې ترمنځ اړیکه
د سایټ سره د محصول اتحادیه ټاکي چې کوم پلورنځي او محصول به په مخ کې شتون ولري.
function linkToWebsite($prodId, $websiteId)
{
/** @var MagentoFrameworkAppResourceConnection $this->resource */
/** @var MagentoFrameworkDBAdapterPdoMysql $conn */
$conn = $this->resource->getConnection();
$table = $this->resource->getTableName('catalog_product_website');
$bind = [
'product_id' => $prodId,
'website_id' => $websiteId
];
$conn->insert($table, $bind);
}
د محصول بنسټیز ځانګړتیاوې
نوی راجستر شوی محصول لاهم نوم یا توضیحات نلري. دا ټول له لارې ترسره کیږي
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);
}
}
د خاصیت کوډ په کارولو سره، موږ د دې ID او ډیټا ډول وټاکو (datetime
, decimal
, int
, text
, varchar
)، بیا د اداري کړکۍ لپاره ډاټا په مناسب جدول کې ولیکئ (store_id = 0
).
محصول ته د پورته ځانګړتیاو اضافه کولو وروسته ، تاسو دا عکس په اډمین پینل کې ترلاسه کوئ:
د انوینٹری ډاټا
په میګینټو کې د 2.3 نسخه څخه پیل کول ، د میزونو دوه موازي سیټونه شتون لري چې د موجود معلوماتو ذخیره کولو چمتو کوي (د محصول مقدار):
cataloginventory_*
: زوړ جوړښتinventory_*
: نوی جوړښت (MSI - د څو سرچینو لیست)؛
تاسو اړتیا لرئ په دواړو جوړښتونو کې د موجوداتو ډاټا اضافه کړئ، ځکه نوی جوړښت لا تر اوسه په بشپړه توګه له زاړه څخه خپلواک نه دی (دا ډیر احتمال لري چې د دې لپاره default
ګودام په نوي جوړښت کې یو میز شامل دی cataloginventory_stock_status
په توګه inventory_stock_1
).
cataloginventory_
کله چې میګنټو 2.3 ځای په ځای کول موږ په پیل کې 2 داخلې لرو store_website
، کوم چې د دوه سایټونو سره مطابقت لري - اداري او اصلي پیرودونکي:
website_id|code |name |sort_order|default_group_id|is_default|
----------|-----|------------|----------|----------------|----------|
0|admin|Admin | 0| 0| 0|
1|base |Main Website| 0| 1| 1|
میز cataloginventory_stock
موږ یوازې یو ننوتل لرو:
stock_id|website_id|stock_name|
--------|----------|----------|
1| 0|Default |
دا زموږ په زاړه جوړښت کې یوازې یو "ګودام" دی (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
):
source_code|name |enabled|description |latitude|longitude|country_id|...|
-----------|--------------|-------|--------------|--------|---------|----------|...|
default |Default Source| 1|Default Source|0.000000| 0.000000|US |...|
او یو "ګودام»(inventory_stock
):
stock_id|name |
--------|-------------|
1|Default Stock|
«سرچینه» د محصولاتو فزیکي ذخیره استازیتوب کوي (ریکارډ فزیکي همغږي او د بریښنالیک پته لري). "ګودام"د څو "سرچینو" منطقي اتحاد دی (inventory_source_stock_link
)
link_id|stock_id|source_code|priority|
-------|--------|-----------|--------|
1| 1|default | 1|
په هغه کچه چې د پلور چینل سره اړیکه واقع کیږي (inventory_stock_sales_channel
)
type |code|stock_id|
-------|----|--------|
website|base| 1|
د ډیټا جوړښت لخوا قضاوت کول ، د پلور مختلف ډولونه فرض شوي ، مګر په ډیفالټ یوازې اړیکه "سټاک"-"ویب پاڼه"(د ویب پاڼې لینک د ویب پاڼې کوډ تعقیبوي - base
).
یو "ګودام"د څو سره تړل کیدی شي"سرچینې"او یو "سرچینه"- څو ته"ګودامونه"(له ډیرو څخه ډیری اړیکې). استثناوې ډیفالټ دي "سرچینه"او"ګودام". دوی د نورو ادارو سره بیا تړلي ندي (د کوډ په کچه محدودیت - تېروتنه "د ډیفالټ سرچینې یا ډیفالټ سټاک پورې اړوند لینک نشي خوندي کولی"). په میګینټو 2 کې د MSI جوړښت په اړه نور توضیحات په مقاله کې موندل کیدی شي "
زه به د ډیفالټ تشکیلاتو څخه کار واخلم او سرچینې ته ټول موجود معلومات اضافه کړم default
، کوم چې د کوډ سره د ویب پاڼې سره تړلي د پلور چینل کې ښکیل دي base
(د پلورنځي مخکینۍ پای سره مطابقت لري - وګورئ store_website
):
function createNewItem($sku, $qty)
{
/** @var MagentoFrameworkAppResourceConnection $this->resource */
/** @var MagentoFrameworkDBAdapterPdoMysql $conn */
$conn = $this->resource->getConnection();
$table = $this->resource->getTableName('inventory_source_item');
$bind = [
'source_code' => 'default',
'sku' => $sku,
'quantity' => $qty,
'status' => MagentoInventoryApiApiDataSourceItemInterface::STATUS_IN_STOCK
];
$conn->insert($table, $bind);
}
په اډمین پینل کې محصول ته د موجوداتو ډیټا اضافه کولو وروسته ، تاسو دا عکس ترلاسه کوئ:
رسنۍ
کله چې "په لاسي ډول" د اډمین پینل له لارې محصول ته عکس اضافه کړئ ، اړونده معلومات په لاندې جدولونو کې لیکل شوي:
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/
د میډیا فایل (په خپله د فایل ځای په ځای کولو پروسه پدې مقاله کې نه ده بحث شوې):
function createMediaGallery($imgPathPrefixed)
{
$attrId = /* get attribute ID by attribute code 'media_gallery' */
/** @var MagentoFrameworkAppResourceConnection $this->resource */
/** @var MagentoFrameworkDBAdapterPdoMysql $conn */
$conn = $this->resource->getConnection();
$table = $this->resource->getTableName('catalog_product_entity_media_gallery');
$bind = [
'attribute_id' => $attrId,
'value' => $imgPathPrefixed,
/* 'image' or 'video' */
'media_type' => 'image',
'disabled' => false
];
$conn->insert($table, $bind);
$result = $conn->lastInsertId($table);
return $result;
}
کله چې راجستر شي، یو نوی میډیا فایل یو پیژندونکی ګمارل کیږي.
catalog_product_entity_media_gallery_value
موږ د ډیفالټ پلورنځي لپاره د اړوند محصول سره راجستر شوي میډیا فایل شریک کوو:
function createGalleryValue($mediaId, $prodId)
{
/** @var MagentoFrameworkAppResourceConnection $this->resource */
/** @var MagentoFrameworkDBAdapterPdoMysql $conn */
$conn = $this->resource->getConnection();
$table = $this->resource->getTableName('catalog_product_entity_media_gallery_value');
$bind = [
'value_id' => $mediaId,
/* use admin store view by default */
'store_id' => 0,
'entity_id' => $prodId,
'label' => null,
/* we have one only image */
'position' => 1,
'disabled' => false
];
$conn->insert($table, $bind);
}
catalog_product_entity_media_gallery_value_to_entity
موږ د راجستر شوي میډیا فایل د اړوند محصول سره پرته له کوم پلورنځي سره تړلی شریک کوو. دا روښانه نده چې دا ډاټا په ریښتیا چیرې کارول کیږي او ولې د مخکیني جدول څخه ډیټا ته لاسرسی ناممکن دی ، مګر دا جدول شتون لري او ډیټا ورته لیکل کیږي کله چې محصول ته عکس اضافه شي. نو همداسې ده.
function createGalleryValueToEntity($mediaId, $prodId)
{
/** @var MagentoFrameworkAppResourceConnection $this->resource */
/** @var MagentoFrameworkDBAdapterPdoMysql $conn */
$conn = $this->resource->getConnection();
$table = $this->resource->getTableName('catalog_product_entity_media_gallery_value_to_entity');
$bind = [
'value_id' => $mediaId,
'entity_id' => $prodId
];
$conn->insert($table, $bind);
}
catalog_product_entity_varchar
د میډیا فایل د مختلف رولونو سره کارول کیدی شي (د اړونده خاصیت کوډ په قوس کې ښودل شوی):
- اساس(
image
) - کوچنی انځور (
small_image
) - تمبیل (
thumbnail
) - سویچ انځور (
swatch_image
)
د میډیا فایل ته د رولونو لینک کول هغه څه دي چې په کې پیښیږي catalog_product_entity_varchar
. د پابند کوډ د کوډ سره ورته دی "د محصول بنسټیز ځانګړتیاوې".
په اډمین پینل کې محصول ته د عکس اضافه کولو وروسته دا داسې ښکاري:
کټګوري
اصلي جدولونه چې د کټګورۍ له مخې ډاټا لري:
catalog_category_entity
: د کټګوریو راجسترcatalog_category_product
د محصولاتو او کټګوریو ترمنځ اړیکه؛catalog_category_entity_*
: د EAV خاصیت ارزښتونه
په پیل کې، په خالي میګینټو غوښتنلیک کې، د کټګورۍ راجستر 2 کټګورۍ لري (ما د کالم نومونه لنډ کړل: crt
- created_at
, upd
- updated_at
):
entity_id|attribute_set_id|parent_id|crt|upd|path|position|level|children_count|
---------|----------------|---------|---|---|----|--------|-----|--------------|
1| 3| 0|...|...|1 | 0| 0| 1|
2| 3| 1|...|...|1/2 | 1| 1| 0|
د id=1 سره کټګورۍ د میګینټو ټول کتلاګ ریښه ده او نه په اډمین پینل یا په لومړي مخ کې شتون لري. کټګوري د ID = 2 سره (ډیفالټ کټګوري) د اصلي سایټ اصلي پلورنځي لپاره د ریښې کټګورۍ ده (د اصلي ویب پاڼې پلورنځي) رامینځته کیږي کله چې غوښتنلیک ځای په ځای شي (وګورئ. اډمین / پلورنځي / ټول پلورنځي). سربیره پردې ، پخپله د پلورنځي ریښې کټګورۍ هم په مخ کې شتون نلري ، یوازې د هغې فرعي کټګورۍ.
څنګه چې د دې مقالې موضوع لاهم د محصولاتو ډیټا واردول دي ، زه به د کټګوریو رامینځته کولو پرمهال ډیټابیس ته مستقیم ننوتل و نه کاروم ، مګر پخپله د میګینټو لخوا چمتو شوي ټولګي به وکاروم (موډلونه او ذخیره). ډیټابیس ته مستقیم ننوتل یوازې د کټګورۍ سره د وارد شوي محصول د شریکولو لپاره کارول کیږي (کټګورۍ د هغې نوم سره سمون لري، او د کټګورۍ ID د میچ کولو پرمهال ترلاسه کیږي):
function create($prodId, $catId)
{
/** @var MagentoFrameworkAppResourceConnection $this->resource */
/** @var MagentoFrameworkDBAdapterPdoMysql $conn */
$conn = $this->resource->getConnection();
$table = $this->resource->getTableName('catalog_category_product');
$bind = [
'category_id' => $catId,
'product_id' => $prodId,
];
$conn->insert($table, $bind);
}
د "کټګورۍ 1" او "کټګورۍ 2" کټګوریو ته د محصول لینک اضافه کولو وروسته ، په اډمین پینل کې د محصول توضیحات داسې ښکاري:
اضافي کړنې
یوځل چې د معلوماتو واردات بشپړ شي ، تاسو اړتیا لرئ لاندې اضافي مرحلې بشپړ کړئ:
- د معلوماتو لیست کول: په کنسول کې زنګ ووهئ
./bin/magento indexer:reindex
; - د محصولاتو / کټګوریو لپاره د URLs بیا رامینځته کول: تاسو کولی شئ توسیع وکاروئ "
elgentos/regenerate-catalog-urls «
د اضافي کړنو ترسره کولو وروسته په اډمین پینل کې محصولات:
او په مخ کې:
لنډیز
د محصولاتو ورته سیټ (10 ټوټې) لکه څنګه چې په تیر مقاله کې وارد شوي لږترلږه د شدت په ترتیب سره ګړندي (1 ثانیه د 10 په مقابل کې). د سرعت دقیق اندازې کولو لپاره، تاسو د محصولاتو لوی شمیر ته اړتیا لرئ - څو سوه، یا تر اوسه په زرګونو. په هرصورت، حتی د دومره کوچنۍ اندازې ان پټ ډاټا سره، موږ کولی شو دې پایلې ته ورسیږو چې د میګینټو (موډلونو او زیرمو) لخوا چمتو شوي وسیلو کارول مهم دي (زه ټینګار کوم - څومره!) د اړین فعالیت پراختیا ګړندی کړئ ، مګر په ورته وخت کې د پام وړ (زه ټینګار کوم - څومره!) سرعت کم کړئ په کوم کې چې ډاټا ډیټابیس ته راځي.
د پایلې په توګه، اوبه لوند شوې او دا وحی نه ده. په هرصورت، اوس زه د لوبې کولو لپاره کوډ لرم او شاید ځینې نور په زړه پورې پایلو ته ورسیږم.
سرچینه: www.habr.com