В
Disclaimer: Magento нь бэлэн функцтэй
Хоёр өгүүллийг бичсэний үр дүнд гарсан кодыг Magento модулээс үзэх боломжтой "
- Бүтээгдэхүүнийг зөвхөн бүтээдэг, шинэчлээгүй.
- Нэг агуулах
- Зөвхөн категорийн нэрийг бүтэцгүйгээр оруулж ирдэг
- Өгөгдлийн бүтэц нь 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 адаптерийг ашигладаг.
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
).
Дээрх шинж чанаруудыг бүтээгдэхүүнд нэмсний дараа та админ самбарт энэ зургийг авах болно.
Бараа материалын мэдээлэл
Magento-ийн 2.3 хувилбараас эхлэн бараа материалын мэдээллийг (бүтээгдэхүүний тоо хэмжээ) хадгалах боломжийг олгодог хоёр зэрэгцээ хүснэгтүүд байдаг.
cataloginventory_*
: хуучин бүтэц;inventory_*
: шинэ бүтэц (MSI - Олон эх сурвалжийн бараа материал);
Та хоёр бүтцэд бараа материалын өгөгдлийг нэмэх хэрэгтэй, учир нь Шинэ бүтэц нь хуучнаасаа бүрэн хараат бус байгаа (энэ нь маш их магадлалтай default
агуулахын шинэ бүтцэд ширээ оролцов cataloginventory_stock_status
зэрэг inventory_stock_1
).
каталог_
Magneto 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
каталогийн бараа материалын_хувьцааны_зүйл
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);
}
каталогийн бараа материалын_хувьцааны_төлөв
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
).
Нэг"агуулах"хэд хэдэнтэй холбогдож болно"эх сурвалж"ба нэг"эх сурвалж"- хэд хэдэн"агуулахууд"(олон-олон харилцаа). Үл хамаарах зүйлүүд нь өгөгдмөл "эх сурвалж"Мөн"агуулах". Тэд бусад байгууллагуудтай дахин холбогдоогүй (кодын түвшний хязгаарлалт - алдаа "Өгөгдмөл эх сурвалж эсвэл үндсэн хувьцаатай холбоотой холбоосыг хадгалах боломжгүй"). Magento 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
, ингэснээр платформ нь каталогийн бүтээгдэхүүнийг тайлбарлахдаа үүнийг зураг болгон ашиглах боломжтой.
каталогийн_бүтээгдэхүүний_байгууллагын_медиа_галерей
Бүртгэлийг нийтэлсэн ./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;
}
Бүртгүүлсний дараа шинэ медиа файлд танигч оноогддог.
каталогийн_бүтээгдэхүүний_аж ахуйн нэгжийн_медиа_галерейн_утга
Бид бүртгэгдсэн медиа файлыг анхдагч дэлгүүрийн нүүрэнд тохирох бүтээгдэхүүнтэй холбодог:
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);
}
каталогийн_бүтээгдэхүүний_аж ахуйн нэгжийн_медиа_галерейгийн_үнэ цэнэ
Бид бүртгэгдсэн медиа файлыг ямар ч дэлгүүрийн нүүрэн дээр холбохгүйгээр холбогдох бүтээгдэхүүнтэй холбодог. Энэ өгөгдлийг яг хаана ашигласан, яагаад өмнөх хүснэгтийн өгөгдөлд хандах боломжгүй байгаа нь тодорхойгүй байгаа ч энэ хүснэгт байгаа бөгөөд бүтээгдэхүүнд зураг нэмэхэд өгөгдөл бичигдсэн байдаг. Ингээд л болоо.
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);
}
каталог_бүтээгдэхүүний_аж ахуйн нэгж_varchar
Медиа файлыг өөр өөр үүрэгтэй ашиглаж болно (харгалзах шинж чанарын кодыг хаалтанд заасан):
- Үндсэн(
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
):
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-тэй категори нь бүхэл бүтэн Magento каталогийн үндэс бөгөөд админ самбар болон нүүр хуудсанд байхгүй. id=2-той ангилал (Өгөгдмөл ангилал) нь сайтын үндсэн дэлгүүрийн үндсэн ангилал юм (Вэб сайтын үндсэн дэлгүүр) програмыг байршуулах үед үүсгэсэн (харна уу. Админ / Дэлгүүрүүд / Бүх дэлгүүрүүд). Түүгээр ч зогсохгүй дэлгүүрийн үндсэн категори нь урд талд байдаггүй, зөвхөн дэд категорууд байдаг.
Энэ нийтлэлийн сэдэв нь бүтээгдэхүүний талаарх мэдээллийг импортлох хэвээр байгаа тул категори үүсгэхдээ мэдээллийн санд шууд нэвтрэхийг ашиглахгүй, харин Magento-ийн өөрөө өгсөн ангиудыг (загвар ба хадгалах газар) ашиглах болно. Мэдээллийн санд шууд оруулах нь зөвхөн импортын бүтээгдэхүүнийг ангилалтай холбоход ашиглагддаг (ангиллыг нэрээр нь тааруулж, тохирох үед ангиллын 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
; - Бүтээгдэхүүн/категорийн URL-уудыг сэргээх: та өргөтгөлийг ашиглаж болно.
elgentos/regenerate-catalog-urls «
Нэмэлт үйлдлүүдийг хийсний дараа админ самбар дээрх бүтээгдэхүүнүүд:
мөн урд талд:
Хураангуй
Өмнөх нийтлэлд дурдсантай ижил багц бүтээгдэхүүнийг (10 ширхэг) хамгийн багадаа илүү хурдан импортолдог (1 секундын эсрэг 10). Хурдыг илүү нарийвчлалтай тооцоолохын тулд танд илүү олон тооны бүтээгдэхүүн хэрэгтэй - хэдэн зуун, эсвэл илүү сайн мянга. Гэсэн хэдий ч ийм жижиг хэмжээтэй оролтын өгөгдлүүдтэй байсан ч гэсэн бид Magento-ийн өгсөн хэрэгслүүдийг (загвар ба хадгалах газар) ашиглах нь чухал ач холбогдолтой гэж дүгнэж болно (би онцолж байна - их!) шаардлагатай функцийг хөгжүүлэх ажлыг хурдасгах, гэхдээ нэгэн зэрэг мэдэгдэхүйц (би онцолж байна - их!) мэдээллийн санд өгөгдөл орох хурдыг багасгах.
Үүний үр дүнд ус нойтон болсон бөгөөд энэ нь илчлэлт биш юм. Гэсэн хэдий ч одоо надад тоглох код байгаа бөгөөд магадгүй илүү сонирхолтой дүгнэлтэд хүрэх болно.
Эх сурвалж: www.habr.com