ะ
์ฑ
์ ๋ถ์ธ: Magento์๋ ๋ค์์ ์ํ ๊ธฐ์ฑ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
๋ ๊ธฐ์ฌ๋ฅผ ๋ชจ๋ ์์ฑํ์ฌ ์์ฑ๋ ์ฝ๋๋ Magento ๋ชจ๋์์ ๋ณผ ์ ์์ต๋๋ค.
- ์ ํ์ ์์ฑ๋๊ธฐ๋ง ํ๊ณ ์ ๋ฐ์ดํธ๋์ง๋ ์์ต๋๋ค.
- ์ฐฝ๊ณ XNUMX๊ฐ
- ๊ตฌ์กฐ ์์ด ์นดํ ๊ณ ๋ฆฌ ์ด๋ฆ๋ง ๊ฐ์ ธ์ต๋๋ค.
- ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ๋ฒ์ 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
โ ์ง์ ํ์ง ์์ผ๋ฉด 'simple'์ด ์ฌ์ฉ๋ฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ์ฐ๋ ค๋ฉด 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
์นดํ๋ก๊ทธinventory_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);
}
์นดํ๋ก๊ทธ์ฌ๊ณ _์ฌ๊ณ _์ํ
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
, ํ๋ซํผ์ด ์นดํ๋ก๊ทธ์ ์ ํ์ ์ค๋ช
ํ ๋ ์ด๋ฏธ์ง๋ก ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
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 ์์ฑ ๊ฐ;
์ฒ์์๋ ๋น 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-์นดํ๋ก๊ทธ-urls ยซ
์ถ๊ฐ ์์ ์ ์ํํ ํ ๊ด๋ฆฌ์ ํจ๋์ ์ ํ:
๊ทธ๋ฆฌ๊ณ ์์ชฝ์:
๊ฐ์
์ด์ ๊ธฐ์ฌ์ ๋์ผํ ์ ํ ์ธํธ(10๊ฐ)๋ฅผ ์ต์ํ 1๋ฐฐ ๋ ๋น ๋ฅด๊ฒ ๊ฐ์ ธ์ต๋๋ค(10์ด ๋ XNUMX). ์๋๋ฅผ ๋ ์ ํํ๊ฒ ์ถ์ ํ๋ ค๋ฉด ๋ ๋ง์ ์์ ์ ํ(์๋ฐฑ ๊ฐ ๋๋ ์์ฒ ๊ฐ ์ด์)์ด ํ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ ฅ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ์ด๋ ๊ฒ ์๋๋ผ๋ Magento์์ ์ ๊ณตํ๋ ๋๊ตฌ(๋ชจ๋ธ ๋ฐ ๋ฆฌํฌ์งํ ๋ฆฌ)์ ์ฌ์ฉ์ด ์ค์ํ๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ฆด ์ ์์ต๋๋ค. ๋ง์!) ํ์ํ ๊ธฐ๋ฅ์ ๊ฐ๋ฐ ์๋๋ฅผ ๋์ด๋ฉด์ ๋์์ ์๋นํ (๊ฐ์กฐํฉ๋๋ค - ๋ง์!) ๋ฐ์ดํฐ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ค์ด๊ฐ๋ ์๋๋ฅผ ์ค์ ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฌผ์ด ์ ์ ๊ฒ์ผ๋ก ํ๋ช ๋์์ผ๋ฉฐ ์ด๋ ๊ณ์๊ฐ ์๋๋๋ค. ๊ทธ๋ฌ๋ ์ด์ ๋๋ ๊ฐ์ง๊ณ ๋ ์ ์๋ ์ฝ๋๋ฅผ ๊ฐ๊ฒ ๋์๊ณ ์๋ง๋ ์ข ๋ ํฅ๋ฏธ๋ก์ด ๊ฒฐ๋ก ์ ๋๋ฌํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ถ์ฒ : habr.com