Magento ááẠe-commerce ááŒá±ááŸááºážáá»ááºá ááá¯ááá¯áááºááŸá¬á ááá¯ááŸá±á¬ááºáá¯á¶á áá±á¬ááºáá¶á·ááá¯á·áá±á¬ááºáá±áž ááá¯á·ááá¯áẠááœá±ááŒá±ážá á¬áááºážááá¯ááºááœááºáá«ááŸááá±á¬ áá±á¬ááºážáá»ááŒááºážááẠáá¯ááºáá á¹á ááºážáá»á¬ážááᯠáá±á¬ááºážáá»ááẠááá¯ááá¯áááºááœááºáá«áááºá á¡ááŒá¬ážáá±á¬ á¡ááá®áá±ážááŸááºážáá»á¬áž (á¥ááá¬á 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);
áááºáá±á¬ááºáž attribute áá»á¬ážááᯠáááºááá¯ááºáᬠdatabase tables áá»á¬ážááœááºáááºáž ááááºážáááºážáá«áááºá
á á¬áááºážá¡áá»ááºá¡áááº
ááá¯ážááŸááºážáá±á¬á¡áá¯á¶ážá¡ááŸá¯ááºážáá»á¬ážááœáẠ- á
áá±á¬á·ááŸááºáá¬ááŸááá¯ááºáá¯ááºááá¬áá 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);
áá®áá®áá¬
á
ááºážáááºážá¡áá á
ááá¯ážááá¯áẠ(e-commerce) ááŸá áá±á¬ááºáááºáá
áºáŠážá¡ááœáẠáá¯ááºáá¯ááºáá
áºáá¯á¡ááœáẠáá®áá®áá¬áá¶á·ááá¯ážááŸá¯ááẠáá¬áááœááºážá
á¬áááºážááá¯ááºá
áá
Ạ(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);
á¡ááŒá±á¬ááºážáá
áºáá¯áá¯ááŒá±á¬áá·áºá áá¯ááºáá¯ááºááᯠáŠážá
áœá¬ááááºážáááºážááŒá®áž ááŒááºáááºááááºážáááºážááŒá®ážáá±á¬ááºááŸáᬠáá®áá®áá¬ááᯠáá»áááºáááºáá¬ážáááºá ááá»ááá» attribute ááá¯áááºááŸááºáááºááá¯á¡ááºáááºá label
áá¯ááºáá¯ááºáá®áá®áá¬ááŒáááºážááá¯á· ááá·áºááœááºážááá·áºá¡áá« (ááá¯ááºáá«á áá»áœááºá¯ááºááá¯á·ááẠááŒáœááºážáá»ááºáá
áºáá¯ááŒá
áºáááºá Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516
).
á¡áá»áá¯ážá¡á á¬áž
áááŒá¬ááááá¯áááá¯á á ááá¯ážááá¯ááºá á¡áá»áá¯ážá¡á á¬ážááœá²á·á ááºážáá¯á¶ááŸáá·áº áá±á¬ááºáá¶á¡ááá®áá±ážááŸááºáž ááá¯á·ááá¯áẠáááºážááá¯á·ááœáẠáá¯ááºáá¯ááºáá»á¬ážá áá±áá¬áá»áá¬ážááŸá¯ááẠáááááá¬áᬠááœá²ááŒá¬ážááá¯ááºáááºá áááºážááá¯á·á¡ááœááºáž á¡áá»áá¯ážá¡á á¬ážáá»á¬ážááŸáá·áº áá¯ááºáá¯ááºáá»á¬ážááá¯ááºáᬠá¡áá»ááºá¡áááºáá»á¬ážááᯠááœáŸá±á·ááŒá±á¬ááºážááŒááºážá¡ááœáẠááá¬áá»á°áá¬áá»á¬ážááẠá¡áá»ááºáá»á¬ážá áœá¬áá±á«áºááœáẠáá°áááºáá«áááºá á€á¥ááá¬ááœáẠáá»áœááºá¯ááºááẠá¡á±á¬ááºáá«á¡áá»ááºááᯠááá¯ááºáá¬áá«áááºá
- backend ááŸáá·áº store á¡áá»áá¯ážá¡á á¬ážáá»á¬ážááᯠá¡áááºááŒáá·áº ááŸáá¯ááºážááŸááºáá¬ážáá«áááºá
- á
ááá¯ážááœááºááá¯ááºáá±á¬á¡áá»áá¯ážá¡á
á¬ážáá
áºáá¯ááá¯áááºááœááºážáá«áá áááºážááᯠroot á¡áá»áá¯ážá¡á
á¬ážá¡á±á¬ááºááœááºáááºáá®ážáá¬ážááẠ(
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 ááœáẠáááá¯ááááºáá»áá» ááá·áºááẠáá¯ááºáá±ážááŒááºážááẠá¡ááœááºááœááºáá°áááºá á¡áááºáá±á¬áºááŒáá« á¡áá¬á¡á¬ážáá¯á¶ážááᯠááá¯ááºáጠmodule áá
áºáá¯á¡ááŒá
Ạáá±á«ááºážá
ááºááá¯ááºáá«ááŒá®"fl32:import:prod
JSON ááá¯ááºááœáẠáá±á¬áºááŒáá¬ážááá·áº áá¯ááºáá¯ááºáá»á¬ážááᯠáááºááœááºážááá·áº "
[
{
"sku": "...",
"name": "...",
"desc": "...",
"desc_short": "...",
"price": ...,
"qty": ...,
"categories": ["..."],
"image_path": "..."
}
]
áááºááœááºážáááºá¡ááœáẠáá¯á¶áá»á¬ážááẠáááºááá±á¬ááºááœáẠááŸááááºá ./etc/data/img
.
á€áááºážáááºážááᯠá¡áá¯á¶ážááŒá¯á áá¯ááºáá¯áẠ10 áá¯áááºááœááºážáááºá¡áá»áááºááẠáá»áœááºá¯ááºááááºááºáá±á¬á·áá±á«áºááœáẠ10 á
áá¹ááá·áºááá·áºááŒá
áºáááºá á€á¡ááŒá¶á¡á
ááºááᯠáá»áœááºá¯ááºááá¯á· áááºáá¶áá®ááœááºáá«áá áá
áºáá¬áá®áá»áŸáẠáá¯ááºáá
á¹á
ááºáž áááá ááá·áº áááºááœááºážááá¯ááºááŒá®áž áá¯ááºáá
á¹á
ááºáž 3600K áááºááœááºážááẠáá¬áá® 100 ááá·áº ááŒá¬ááá¯ááºáááºáᯠáá±á¬ááºáá»ááºáá»ááẠááœááºáá°áá«áááºá áááºááºáá±á¬á·áá
áºáá¯á¶ážááᯠáá¬áá¬áá
áºáá¯ááŒáá·áº á¡á
á¬ážááá¯ážááŒááºážááẠá¡ááŒá±á¡áá±ááᯠá¡áááºážááẠáá»á±á¬ááœá±á·á
á±áááºá á¡ááŒáááºáá±á«ááºážáá»á¬ážá
áœá¬áá±á¬áẠááŒá
áºááá¯ááºáááºá áá«áá±ááá·áº á¡ááá¯ááºážá¡áá¬áá
áºáá¯á¡áááá±á¬á· ááá¯ááºáá«áá°ážá á€á¡ááŒááºááŸá¯ááºážááŸáá·áº ááŸá±ážááœá±ážááŸá¯ááẠááá±á¬áá»ááºáá±á«áºáá±á«ááºáá¬áááá·áº á¡ááŒá±á¬ááºážáááºážáá»á¬ážáá²á០á¡ááá¯ááºážá¡áá¬áá
áºáá¯á¡áá ááŒá
áºááá¯ááºáááºá
áááºááœááºážááŸá¯á¡ááŸáááºááŒáŸáá·áºááẠá¡á áœááºážáá±á¬ááºááŒá±ááŸááºážáá»ááºááẠáá±áá¬áá±á·á áºáá²ááá¯á· ááá¯ááºááá¯ááºáááºáá±á¬ááºááá¯ááºáá±á¬áºáááºáž á€á¡ááŒá±á¡áá±ááœáẠMagento áááá¯ážáá»á²á·ááá¯ááºááŸá¯ááŸáá·áºáááºáááºáá±á¬ "áá±á¬ááºážáá±á¬" áá»á¬ážá¡á¬ážáá¯á¶áž áá¯á¶ážááŸá¯á¶ážááœá¬ážááẠ- áááºááá¯ááºááá¯áẠ"á¡ááá·áºááŒáá·áºáá±á¬" á¡áá¬á¡á¬ážáá¯á¶ážááᯠáá¯ááºáá±á¬ááºááááºááŒá áºáááºá áá«áá±ááá·áº á¡á²áá«ááᯠááá¯ááºáááºáá«áááºá á¡áááºááŒá±áá«á áá±á¬ááºáá±á¬ááºážáá«ážááœáẠdatabase ááá¯á· ááá¯ááºááá¯ááºá á¬áá±ážááŒááºážááŒáá·áº áá»ááºážáááºáá¯á¶ááᯠáá¯á¶ážáááºáá«áááºá
source: www.habr.com