Magento๋ ์ ์์๊ฑฐ๋ ์๋ฃจ์ ์ ๋๋ค. ํ๋งค์ ์๋ฐ๋๋ ์ฐฝ๊ณ , ๋ฌผ๋ฅ ๋๋ ์ฌ๋ฌดํ๊ณ๋ณด๋ค๋ ์ ํ ํ๋งค๋ฅผ ๋ ๋ชฉํ๋ก ํฉ๋๋ค. ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ (์: ERP ์์คํ )์ ๋๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ ํฉํฉ๋๋ค. ๋ฐ๋ผ์ Magento๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋งค์ฅ์ ๋ค๋ฅธ ์์คํ (์: 1C)๊ณผ ํตํฉํ๋ ์์ ์ด ์์ฃผ ๋ฐ์ํฉ๋๋ค.
๋์ฒด๋ก ํตํฉ์ ๋ค์์ ํตํด ๋ฐ์ดํฐ ๋ณต์ ๋ก ์ถ์๋ ์ ์์ต๋๋ค.
- ์นดํ๋ก๊ทธ(์ ํ, ์นดํ ๊ณ ๋ฆฌ);
- ์ฌ๊ณ ๋ฐ์ดํฐ(์ฐฝ๊ณ ์ ์ ํ ์๊ณ ๋ฐ ๊ฐ๊ฒฉ)
- ํด๋ผ์ด์ธํธ;
- ๋ช ๋ น;
Magento๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๊ธฐ ์ํ ๋ณ๋์ ๊ฐ์ฒด ํด๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ณ ๊ฐ๊ณผ ์ฃผ๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก Magento์์ ์ธ๋ถ ERP ์์คํ ์ผ๋ก ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ๋ณต์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ ๊ฐ๋จํฉ๋๋ค. Magento ์ธก์์๋ ์ ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ ํํ ๋ค์ "์ด์์ด ์ฐ๋ฆฌ ์ชฝ์์ ๋ ์๊ฐ์ด".
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ๋ ์๋ฆฌ
ํ์ฌ Magento์์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์์
์ ๋ค์์ ํตํด ์ํ๋ฉ๋๋ค.
function __construct (MagentoCmsModelBlockFactory $blockFactory) {
$this->blockFactory = $blockFactory;
}
/** @var MagentoCmsModelBlock $block */
$block = $this->blockFactory->create();
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ธฐ๋ ๋ค์์ ํตํด ์ํ๋ฉ๋๋ค.
function __construct (MagentoCmsApiBlockRepositoryInterface $blockRepo) {
$this->blockRepo = $blockRepo;
}
$this->blockRepo->save($block);
"Factory" ๋ฐ "Repository" ์ ๊ทผ ๋ฐฉ์์ Magento 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'
), ๊ธฐ๋ณธ ์์ฑ ์ธํธ(attribute_set_id=4
) ๋ฐ ์์ฑ ๋ฌด์ has_options
ะธ required_options
. ์์ฑ๋ถํฐ entity_id
, created_at
ะธ updated_at
์๋์ผ๋ก ์์ฑ๋ ๋ค์ ์ค์ ๋ก ์ ์ ํ์ ์ถ๊ฐํ๋ ค๋ฉด ์ค์ ๋ง ํ๋ฉด ๋ฉ๋๋ค. sku
. ๋๋ ์ด๊ฒ์ํ๋ค:
/** @var MagentoCatalogApiDataProductInterfaceFactory $factProd */
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
/** @var MagentoCatalogApiDataProductInterface $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 MagentoStoreModelStoreManagerInterface $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);
repo ๊ฐ์ฒด๋ฅผ ํตํด ๋ชจ๋ธ์ ์ ์ฅํ ๋:
$repoProd->save($prod);
์ถ๊ฐ ์์ฑ๋ ํด๋น ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์ ์ฅ๋ฉ๋๋ค.
์ฌ๊ณ ๋ฐ์ดํฐ
๊ฐ๋จํ ๋งํด์ - ์ฌ๊ณ ๊ฐ ์๋ ์ ํ์ ์์
๋๋ค. Magento 2.3์์ ์ธ๋ฒคํ ๋ฆฌ ๋ฐ์ดํฐ ์ ์ฅ ํ์์ ์ค๋ช
ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
/** @var MagentoCatalogModelProduct $prodEntity */
/** @var MagentoCatalogApiProductRepositoryInterface $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
). ๋ํ ๊ด๋ฆฌ์ ํจ๋์ ํตํด ์ถ๊ฐํ๋ฉด ์ด๋ฏธ์ง์ ํ๊ทธ๊ฐ ์ง์ ๋ฉ๋๋ค. image
, small_image
, thumbnail
, swatch_image
.
/** @var MagentoCatalogApiProductRepositoryInterface $repoProd */
/** @var MagentoCatalogModelProductGalleryCreateHandler $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
).
๋ฒ์ฃผ
์ข ์ข ์์ ๊ณผ ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์นดํ ๊ณ ๋ฆฌ ๊ตฌ์กฐ๋ ์ ํ ๋ฐฐ์น๊ฐ ํฌ๊ฒ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์นดํ ๊ณ ๋ฆฌ ๋ฐ ์นดํ ๊ณ ๋ฆฌ ๋ด ์ ํ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ์ ๋ต์ ์ฌ๋ฌ ์์ธ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ์ด ์์์๋ ๋ค์์ ๊ณ ์ํฉ๋๋ค.
- ๋ฐฑ์๋ ๋ฐ ์์ ์นดํ ๊ณ ๋ฆฌ๋ ์ด๋ฆ์ผ๋ก ๋น๊ต๋ฉ๋๋ค.
- ์คํ ์ด์ ์๋ ์นดํ
๊ณ ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๋ฉด ๋ฃจํธ ์นดํ
๊ณ ๋ฆฌ(
Default Category
) ์์ ์นดํ๋ก๊ทธ์์์ ์ถ๊ฐ ์์น ์ง์ ์ ์๋์ผ๋ก ๊ฐ์ ๋ฉ๋๋ค. - ์ ํ์ ๋งค์ฅ์์ ์์ฑ๋ ๋๋ง ์นดํ ๊ณ ๋ฆฌ์ ์ง์ ๋ฉ๋๋ค(์ฒซ ๋ฒ์งธ ๊ฐ์ ธ์ค๊ธฐ).
์นดํ
๊ณ ๋ฆฌ์ ๋ํ ๊ธฐ๋ณธ ์ ๋ณด๊ฐ ํ์ ๋์ ์์ต๋๋ค. catalog_category_entity
(์นดํ
๊ณ ๋ฆฌ ์นดํ๋ก๊ทธ). Magento์์ ์นดํ
๊ณ ๋ฆฌ ์์ฑ:
/** @var MagentoCatalogApiDataCategoryInterfaceFactory $factCat */
/** @var MagentoCatalogApiCategoryRepositoryInterface $repoCat */
$cat = $factCat->create();
$cat->setName($name);
$cat->setIsActive(true);
$repoCat->save($cat);
์ ํ์ ์นดํ ๊ณ ๋ฆฌ์ ์ฐ๊ฒฐํ๋ ๊ฒ์ ์นดํ ๊ณ ๋ฆฌ ID์ ์ ํ SKU๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค.
/** @var MagentoCatalogModelCategoryProductLinkFactory $factCatProdLink */
/** @var MagentoCatalogApiCategoryLinkRepositoryInterface $repoCatLink */
$link = $factCatProdLink->create();
$link->setCategoryId($catMageId);
$link->setSku($prodSku);
$repoCatLink->save($link);
์ ์ฒด๋ก
ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก Magento 2์ ์ ํ์ ์ถ๊ฐํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋งค์ฐ ์ฝ์ต๋๋ค. ์์์ ์ธ๊ธํ ๋ชจ๋ ๋ด์ฉ์ ๋ฐ๋ชจ ๋ชจ๋๋ก ๊ฒฐํฉํ์ต๋๋ค.fl32:import:prod
, JSON ํ์ผ์ ์ค๋ช
๋ ์ ํ์ ๊ฐ์ ธ์ต๋๋ค.
[
{
"sku": "...",
"name": "...",
"desc": "...",
"desc_short": "...",
"price": ...,
"qty": ...,
"categories": ["..."],
"image_path": "..."
}
]
๊ฐ์ ธ์ฌ ์ฌ์ง์ ์นดํ๋ก๊ทธ์ ์์ต๋๋ค. ./etc/data/img
.
์ด ๋ฐฉ๋ฒ์ผ๋ก ์ ํ 10๊ฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ ๋
ธํธ๋ถ์์๋ 10์ด ์ ๋ ์
๋๋ค. ์ด ์์ด๋์ด๋ฅผ ๋ ๋ฐ์ ์ํค๋ฉด ์๊ฐ๋น ์ฝ 3600๊ฐ์ ์ ํ์ ์์
ํ ์ ์๊ณ , 100K ์ ํ์ ์์
ํ๋๋ฐ ์ฝ 30์๊ฐ์ด ๊ฑธ๋ฆด ์ ์๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ฆฌ๊ธฐ ์ฝ๋ค. ๋
ธํธ๋ถ์ ์๋ฒ๋ก ๊ต์ฒดํ๋ฉด ์ํฉ์ด ๋ค์ ์ํ๋ ์ ์์ต๋๋ค. ์ด์ฉ๋ฉด ์ฌ๋ฌ ๋ฒ์ผ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ท๋ชจ๋ ์๋๋๋ค. ์๋ง๋ ์ด๋ฌํ ์๋์ ๋๋ฆผ์ ์ด๋ ์ ๋ ํ๋ก์ ํธ๊ฐ ์ถํํ ์ด์ ์ค ํ๋์ผ ๊ฒ์
๋๋ค.
๊ฐ์ ธ์ค๊ธฐ ์๋๋ฅผ ๋์ด๋ ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ์ฑ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ์ ๋ ฅํ๋ ๊ฒ์ผ ์ ์์ง๋ง ์ด ๊ฒฝ์ฐ Magento์ ํ์ฅ์ฑ๊ณผ ๊ด๋ จ๋ ๋ชจ๋ "์ข์ ๊ธฐ๋ฅ"์ด ์์ค๋ฉ๋๋ค. ๋ชจ๋ "๊ณ ๊ธ"์ ์ง์ ์ํํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋งํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ฑ๊ณตํ๋ฉด ๋ค์ ๊ธฐ์ฌ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ์ฐ๋ ์ ๊ทผ ๋ฐฉ์์ ๊ณ ๋ คํ ๊ฒ์ ๋๋ค.
์ถ์ฒ : habr.com