Magento 2: lowetsani katundu mwachindunji mu nkhokwe

Π’ nkhani yapita Ndidafotokoza njira yobweretsera zinthu ku Magento 2 mwanjira yanthawi zonse - kudzera mumitundu ndi nkhokwe. Njira yachizolowezi imakhala ndi liwiro lotsika kwambiri la data. Laputopu yanga inali kupanga pafupifupi chinthu chimodzi pamphindikati. Popitiliza izi, ndikuwona njira ina yogulitsira katundu - polowera mwachindunji mumsungidwe, ndikudutsa njira za Magento 2 (zitsanzo, mafakitale, nkhokwe). Mndandanda wa njira zogulitsira katundu ukhoza kusinthidwa ku chinenero chilichonse cha mapulogalamu chomwe chingagwire ntchito ndi MySQL.

chandalama: Magento ali ndi magwiridwe antchito okonzeka kulowetsa kwa data ndipo, mwinamwake, zidzakhala zokwanira kwa inu. Komabe, ngati mukufuna kuwongolera kokwanira pakulowetsa, osangokhala pokonzekera fayilo ya CSV pazomwe muli nazo, landirani ku mphaka.

Magento 2: lowetsani katundu mwachindunji mu nkhokwe

Khodi yobwera chifukwa cholemba zolemba zonse ziwiri imatha kuwonedwa mu gawo la Magento "flancer32/mage2_ext_demo_import". Nazi zina zoletsa zomwe ndidatsatira kuti ndichepetse nambala yachiwonetsero:

  • Zogulitsa zimangopangidwa, osati kusinthidwa.
  • Malo amodzi
  • Mayina amagulu okha ndi omwe amatumizidwa kunja, popanda kapangidwe kake
  • Mapangidwe a data amagwirizana ndi mtundu 2.3

JSON potumiza kunja chinthu chimodzi:

{
  "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"
}

Chidule cha magawo akulu otengera kunja

  • kalembera wa mankhwala palokha
  • kugwirizana pakati pa malonda ndi webusaitiyi
  • Makhalidwe azinthu zoyambira (EAV)
  • Inventory data (kuchuluka kwa zinthu zomwe zili mgulu)
  • media (zithunzi)
  • kugwirizana ndi magulu a catalog

Kulembetsa Katundu

Zambiri zamalonda zitha kupezeka mu 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`)
)

Zomwe zimafunikira kuti mupange cholowa mu kaundula wazinthu ndi:

  • attribute_set_id
  • sku

zowonjezera:

  • type_id - ngati sitifotokoza, ndiye kuti 'zosavuta' zidzagwiritsidwa ntchito

Kulemba mwachindunji ku database, ndimagwiritsa ntchito DB adapter ya Magento palokha:

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;
}

Pambuyo kulembetsa mankhwala ndi catalog_product_entity zimawonekera mu gulu la admin, mu gridi yazinthu (Catalog/Zogulitsa).

Magento 2: lowetsani katundu mwachindunji mu nkhokwe

Mgwirizano pakati pa malonda ndi webusaitiyi

Kugwirizana kwa malonda ndi malowa kumatsimikizira kuti ndi masitolo ndi mawonetsedwe ati omwe angakhalepo kutsogolo.

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);
}

Magento 2: lowetsani katundu mwachindunji mu nkhokwe

Makhalidwe azinthu zoyambira

Chogulitsa chatsopanocho sichinatchulidwe kapena kulongosola. Zonsezi zachitika Zotsatira za EAV. Nawu mndandanda wazinthu zofunikira zomwe zimafunikira kuti chinthucho chiwoneke bwino kutsogolo:

  • name
  • price
  • description
  • short_description
  • status
  • tax_class_id
  • url_key
  • visibility

Lingaliro lapadera limawonjezedwa ku chinthu chonga ichi (zambiri zopezera chizindikiritso ndi mtundu wa mawonekedwe ake zasiyidwa):

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);
    }
}

Pogwiritsa ntchito chizindikiro, timazindikira id ndi mtundu wa data (datetime, decimal, int, text, varchar), kenako lembani zomwe zili pawindo loyang'anira patebulo loyenera (store_id = 0).

Mutawonjezera zomwe zili pamwambapa pazogulitsa, mumapeza chithunzichi pagulu la admin:

Magento 2: lowetsani katundu mwachindunji mu nkhokwe

Deta yazinthu

Kuyambira pa mtundu wa 2.3 ku Magento, pali matebulo awiri ofanana omwe amapereka kusungirako zidziwitso (kuchuluka kwazinthu):

  • cataloginventory_*: kapangidwe kakale;
  • inventory_*: dongosolo latsopano (MSI - Multi Source Inventory);

Muyenera kuwonjezera deta yazinthu kuzinthu zonse ziwiri, chifukwa dongosolo latsopano silinadziyimire kwathunthu pa yakale (ndizotheka kuti kwa default nyumba yosungiramo katundu mumpangidwe watsopano tebulo likukhudzidwa cataloginventory_stock_status monga inventory_stock_1).

mndandanda wa mabuku_

Potumiza Magneto 2.3 timakhala ndi zolowa ziwiri store_website, yomwe ikufanana ndi masamba awiri - oyang'anira ndi kasitomala wamkulu:

website_id|code |name        |sort_order|default_group_id|is_default|
----------|-----|------------|----------|----------------|----------|
         0|admin|Admin       |         0|               0|         0|
         1|base |Main Website|         0|               1|         1|

Table cataloginventory_stock tili ndi cholowa chimodzi chokha:

stock_id|website_id|stock_name|
--------|----------|----------|
       1|         0|Default   |

Ndiko kuti, m'nyumba yathu yakale muli "nyumba yosungiramo zinthu" imodzi yokha (stock) ndipo imalumikizidwa ndi webusayiti yoyang'anira. Kuwonjezera zatsopano kudzera pa gulu la admin sources/stocks mu MSI (kapangidwe katsopano) sizimalowetsamo zatsopano cataloginventory_stock.

Zambiri zazinthu zomwe zili mumpangidwe wakale zimalembedwa m'matebulo:

  • 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);
}

kufufuza_

Poyambirira, mawonekedwe atsopano osungiramo zinthu zomwe zili ndi 1 ".gwero"(inventory_source):

source_code|name          |enabled|description   |latitude|longitude|country_id|...|
-----------|--------------|-------|--------------|--------|---------|----------|...|
default    |Default Source|      1|Default Source|0.000000| 0.000000|US        |...|

ndi chimodzi"nyumba yosungiramo katundu"(inventory_stock):

stock_id|name         |
--------|-------------|
       1|Default Stock|

Β«KuchokeraΒ» imayimira kusungidwa kwazinthu (zolembazo zili ndi makonzedwe akuthupi ndi adilesi yamakalata). "Nyumba yosungiramo katundu"ndi mgwirizano womveka wa "magwero" angapo (inventory_source_stock_link)

link_id|stock_id|source_code|priority|
-------|--------|-----------|--------|
      1|       1|default    |       1|

pamlingo womwe kulumikizana ndi njira yogulitsa kumachitika (inventory_stock_sales_channel)

type   |code|stock_id|
-------|----|--------|
website|base|       1|

Kutengera mawonekedwe a data, mitundu yosiyanasiyana ya njira zogulitsira imaganiziridwa, koma mwachisawawa, kulumikizana kokha "katundu"-"webusaiti"(ulalo wa webusayiti umatsata tsamba lawebusayiti - base).

Mmodzi"nyumba yosungiramo katundu"ikhoza kugwirizanitsidwa ndi angapo"magwero"ndi chimodzi"gwero"- kwa angapo"nkhokwe"(maubwenzi ambiri ndi ambiri). Zosiyana ndizosasintha "gwero"Ndipo"nyumba yosungiramo katundu". Sakulumikizidwanso ndi mabungwe ena (zoletsa pamlingo wa code - cholakwika "Sitingathe kusunga ulalo wokhudzana ndi Default Source kapena Default Stock"). Zambiri za kapangidwe ka MSI ku Magento 2 zitha kupezeka m'nkhani "Makina oyang'anira nyumba yosungiramo zinthu pogwiritsa ntchito CQRS ndi Event Sourcing. Kupanga".

Ndidzagwiritsa ntchito makonzedwe osasinthika ndikuwonjezera zonse zosungira ku gwero default, yomwe ikukhudzidwa ndi njira yogulitsa yogwirizana ndi webusaitiyi ndi code base (zofanana ndi kumapeto kwa sitolo - onani 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);
}

Pambuyo powonjezera zomwe zili pagulu la admin, mumapeza chithunzi ichi:

Magento 2: lowetsani katundu mwachindunji mu nkhokwe

Media

Mukawonjezera "pamanja" chithunzi ku chinthu kudzera pagulu la admin, mfundo zoyenera zimalembedwa m'matebulo otsatirawa:

  • catalog_product_entity_media_gallery: registry media (zithunzi ndi mafayilo amakanema);
  • catalog_product_entity_media_gallery_value: kulumikiza media kuzinthu ndi mawonetsero (kukhazikika);
  • catalog_product_entity_media_gallery_value_to_entity: kulumikiza media kuzinthu zokhazokha (mwinamwake zosasinthika zamtundu wazinthu);
  • catalog_product_entity_varchar: Maudindo omwe chithunzicho chimagwiritsidwa ntchito amasungidwa apa;

ndipo zithunzizo zimasungidwa ku chikwatu ./pub/media/catalog/product/x/y/kumene x ΠΈ y - chilembo choyamba ndi chachiwiri cha dzina la fayilo ya fano. Mwachitsanzo, fayilo image.png ayenera kupulumutsidwa monga ./pub/media/catalog/product/i/m/image.png, kotero kuti nsanja ikhoza kuigwiritsa ntchito ngati chithunzi pofotokoza zinthu zochokera m'kabukhu.

Register yatumizidwa ./pub/media/catalog/product/ media file (njira yoyika fayilo palokha siyikukambidwa m'nkhaniyi):

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;
}

Mukalembetsedwa, fayilo yatsopano yapa media imapatsidwa chizindikiritso.

Timayanjanitsa fayilo yolembetsedwa yolembetsedwa ndi chinthu chofananira ndi malo osungirako zinthu zakale:

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);
}

Timagwirizanitsa fayilo ya media yolembetsedwa ndi chinthu chofananira popanda kumangidwa ndi malo ogulitsira. Sizidziwikiratu komwe detayi imagwiritsidwira ntchito komanso chifukwa chake sizingatheke kupeza deta kuchokera patebulo lapitalo, koma tebulo ili liripo ndipo deta imalembedwa pamene chithunzi chikuwonjezeredwa ku mankhwala. Kotero ndi zimenezo.

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

Fayilo yapa media ikhoza kugwiritsidwa ntchito ndi maudindo osiyanasiyana (chithunzi chofananira chikuwonetsedwa m'makolo):

  • Base (image)
  • Chithunzi chaching'ono (small_image)
  • Thumbnail (thumbnail)
  • Swatch Image (swatch_image)

Kulumikiza maudindo ku fayilo ya media ndizomwe zimachitika catalog_product_entity_varchar. Khodi yomanga ikufanana ndi code yomwe ili mu "Makhalidwe azinthu zoyambira".

Pambuyo powonjezera chithunzi pazogulitsa pagulu la admin zikuwoneka motere:

Magento 2: lowetsani katundu mwachindunji mu nkhokwe

Zigawo

Matebulo akulu okhala ndi data potengera gulu:

  • catalog_category_entity: kaundula wa magulu;
  • catalog_category_product: kugwirizana pakati pa malonda ndi magulu;
  • catalog_category_entity_*: Makhalidwe a EAV;

Poyambirira, mu pulogalamu yopanda kanthu ya Magento, zolembera zamagulu zili ndi magulu a 2 (Ndinafupikitsa mayina amzawo: 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|

Gulu lomwe lili ndi id=1 ndiye muzu wa kabukhu lonse la Magento ndipo silipezeka pagulu la admin kapena patsamba loyamba. Gulu lokhala ndi id=2 (Gulu Losasinthika) ndiye gulu la mizu ya sitolo yayikulu ya tsamba lalikulu (Main Website Store) idapangidwa pomwe pulogalamuyo itumizidwa (onani. Admin / Masitolo / Masitolo Onse). Kuphatikiza apo, gulu la mizu ya sitolo palokha silipezekanso kutsogolo, ndi magawo ake ang'onoang'ono.

Popeza mutu wa nkhaniyi ukutumizabe deta pazinthu zamalonda, sindidzagwiritsa ntchito kulowetsa mwachindunji muzosungirako popanga magulu, koma ndidzagwiritsa ntchito makalasi operekedwa ndi Magento mwiniwake (zitsanzo ndi nkhokwe). Kulowa mwachindunji mu nkhokwe kumagwiritsidwa ntchito kungogwirizanitsa zinthu zomwe zatumizidwa ndi gulu (gululo likugwirizana ndi dzina lake, ndipo id ya gulu imatengedwanso panthawi yofananira):

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);
}

Mukawonjezera ulalo wazinthu kumagulu a "Gawo 1" ndi "Gawo 2", tsatanetsatane wazogulitsa pagulu la admin zikuwoneka motere:

Magento 2: lowetsani katundu mwachindunji mu nkhokwe

Zochita Zowonjezera

Kutumiza kwa data kukamalizidwa, muyenera kuchita izi:

  • data indexing: imbani mu console ./bin/magento indexer:reindex;
  • kukonzanso ma URL azinthu / magulu: mutha kugwiritsa ntchito kuwonjezera "elgentos/regenerate-catalog-urlsΒ«

Zogulitsa mu gulu la admin mutachita zina zowonjezera:

Magento 2: lowetsani katundu mwachindunji mu nkhokwe

ndi kutsogolo:

Magento 2: lowetsani katundu mwachindunji mu nkhokwe

Chidule

Zogulitsa zomwezo (zidutswa 10) monga momwe zilili m'nkhani yapitayi zimatumizidwa kunja osachepera dongosolo la kukula mofulumira (1 sekondi motsutsana ndi 10). Kuti muwerenge molondola liwiro, mufunika kuchuluka kwazinthu - mazana angapo, kapena bwino masauzande. Komabe, ngakhale ndi chiwerengero chochepa chothandizira, tikhoza kunena kuti kugwiritsa ntchito zida zoperekedwa ndi Magento (zitsanzo ndi zosungirako) ndizofunikira (ndikutsindika - kwambiri!) kufulumizitsa kukula kwa magwiridwe antchito, koma nthawi yomweyo kwambiri (ndikutsindika - kwambiri!) kuchepetsa liwiro lomwe deta imalowa mu database.

Zotsatira zake, madziwo adakhala onyowa ndipo izi sizinali vumbulutso. Komabe, tsopano ndili ndi code yoti ndisewere nayo ndipo mwina ndifika pamalingaliro ena osangalatsa.

Source: www.habr.com