Magento 2: import cov khoom ncaj qha rau hauv cov ntaub ntawv

Π’ tsab xov xwm dhau los Kuv tau piav qhia txog cov txheej txheem ntawm kev xa khoom tuaj rau hauv Magento 2 raws li ib txwm muaj - los ntawm cov qauv thiab cov chaw khaws khoom. Txoj kev ib txwm muaj cov ntaub ntawv ua haujlwm tsawg heev. Kuv lub laptop tau tsim txog ib yam khoom ib ob. Hauv qhov txuas ntxiv no, kuv xav txog lwm txoj hauv kev los import cov khoom lag luam - los ntawm kev nkag ncaj qha rau hauv cov ntaub ntawv, hla cov txheej txheem Magento 2 (cov qauv, cov chaw tsim khoom, cov chaw khaws khoom). Cov theem ntawm cov kauj ruam los import cov khoom tuaj yeem hloov mus rau txhua hom lus programming uas tuaj yeem ua haujlwm nrog MySQL.

Disclaimer: Magento tau npaj ua haujlwm rau cov ntaub ntawv import thiab, feem ntau yuav, nws yuav txaus rau koj. Txawm li cas los xij, yog tias koj xav tau kev tswj hwm ntau dua ntawm cov txheej txheem ntshuam, tsis txwv rau kev npaj cov ntaub ntawv CSV rau yam koj muaj, txais tos miv.

Magento 2: import cov khoom ncaj qha rau hauv cov ntaub ntawv

Cov cai uas tshwm sim los ntawm kev sau ob kab lus tuaj yeem pom hauv Magento module "flancer32/mage2_ext_demo_import". Nov yog qee qhov kev txwv kuv ua raws kom yooj yim rau demo module code:

  • Cov khoom tsuas yog tsim, tsis hloov kho.
  • Ib lub tsev khaws khoom
  • Tsuas yog qeb npe raug xa tawm, tsis muaj lawv cov qauv
  • Cov qauv ntaub ntawv ua raws li version 2.3

JSON rau import ib yam khoom:

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

Txheej txheem cej luam ntawm lub ntsiab theem ntawm ntshuam

  • sau npe ntawm cov khoom nws tus kheej
  • kev sib txuas ntawm cov khoom thiab lub vev xaib
  • Basic Product Attributes (EAV)
  • Cov ntaub ntawv khaws cia (ntau ntawm cov khoom hauv Tshuag)
  • media (cov duab)
  • kev sib txuas nrog pawg catalog

Kev sau npe khoom

Cov ntaub ntawv tseem ceeb ntawm cov khoom lag luam tuaj yeem pom hauv 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`)
)

Cov ntaub ntawv yam tsawg kawg nkaus uas yuav tsum tau tsim kom muaj kev nkag mus rau hauv cov npe khoom yog:

  • attribute_set_id
  • sku

ntxiv:

  • type_id - yog tias peb tsis qhia nws, ces 'yooj yim' yuav raug siv

Txhawm rau sau ncaj qha rau hauv cov ntaub ntawv, kuv siv DB adapter ntawm Magento nws tus kheej:

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

Tom qab sau npe cov khoom nrog catalog_product_entity nws yuav pom nyob rau hauv lub vaj huam sib luag admin, hauv daim phiaj khoom (Catalog/cov khoom).

Magento 2: import cov khoom ncaj qha rau hauv cov ntaub ntawv

Kev sib raug zoo ntawm cov khoom thiab lub vev xaib

Kev sib koom ua ke ntawm cov khoom lag luam nrog lub xaib txiav txim siab nyob rau hauv cov khw muag khoom thiab qhia cov khoom yuav muaj nyob rau pem hauv ntej.

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: import cov khoom ncaj qha rau hauv cov ntaub ntawv

Cov yam ntxwv ntawm cov khoom tseem ceeb

Cov khoom tsim tawm tshiab tseem tsis tau muaj npe lossis piav qhia. Tag nrho cov no yog ua tiav los ntawm EAV attributes. Ntawm no yog ib daim ntawv teev cov yam ntxwv ntawm cov khoom lag luam uas xav tau rau cov khoom kom pom tseeb rau pem hauv ntej:

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

Ib tus cwj pwm cais tau ntxiv rau cov khoom zoo li no (cov ntsiab lus ntawm kev tau txais tus cim thiab hom ntawm tus cwj pwm los ntawm nws cov cai raug tshem tawm):

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

Siv tus cwj pwm code, peb txiav txim siab nws tus ID thiab cov ntaub ntawv hom (datetime, decimal, int, text, varchar), tom qab ntawd sau cov ntaub ntawv rau lub qhov rais tswj hwm rau hauv lub rooj tsim nyog (store_id = 0).

Tom qab ntxiv cov yam ntxwv saum toj no rau cov khoom, koj tau txais daim duab no hauv admin vaj huam sib luag:

Magento 2: import cov khoom ncaj qha rau hauv cov ntaub ntawv

Cov ntaub ntawv khaws tseg

Pib los ntawm version 2.3 hauv Magento, muaj ob qhov sib npaug ntawm cov rooj uas muab cov ntaub ntawv khaws cia (cov khoom kom muaj nuj nqis):

  • cataloginventory_*: qub qauv;
  • inventory_*: Cov qauv tshiab (MSI - Ntau Qhov Chaw Muag Khoom);

Koj yuav tsum tau ntxiv cov ntaub ntawv khaws cia rau ob qho tib si, vim tus qauv tshiab tseem tsis tau muaj kev ywj pheej kiag li ntawm qhov qub (nws yog qhov muaj feem ntau rau default warehouse nyob rau hauv cov qauv tshiab ib lub rooj koom tes cataloginventory_stock_status raws li inventory_stock_1).

catalog khoom_

Thaum xa tawm Magneto 2.3 peb pib muaj 2 nkag hauv store_website, uas sib raug rau ob qhov chaw - kev tswj hwm thiab cov neeg siv khoom loj:

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

Rooj cataloginventory_stock peb tsuas muaj ib qho nkag:

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

Qhov ntawd yog, hauv peb cov qauv qub tsuas muaj ib qho "warehouse" (stock) thiab nws txuas nrog rau kev tswj hwm lub vev xaib. Ntxiv cov tshiab los ntawm lub vaj huam sib luag admin sources/stocks hauv MSI (cov qauv tshiab) tsis ua rau cov nkag tshiab hauv cataloginventory_stock.

Cov ntaub ntawv khaws tseg txog cov khoom hauv cov qauv qub yog pib sau rau hauv cov lus:

  • cataloginventory_stock_item
  • cataloginventory_stock_status

cataloginventory_stock_ khoom

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

cov khoom muag_

Thaum xub thawj, cov qauv tshiab rau kev khaws cov ntaub ntawv khaws cia muaj 1 "qhov chaw"(inventory_source):

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

thiab ib "tsev rau khoom"(inventory_stock):

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

Β«Tau qhov twg losΒ» sawv cev rau lub cev cia rau cov khoom lag luam (cov ntaub ntawv muaj cov kev tswj xyuas lub cev thiab chaw nyob xa ntawv). "Khwv Ciaj"yog ib qho kev sib koom ua ke ntawm ntau "qhov chaw" (inventory_source_stock_link)

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

nyob rau theem ntawm kev sib txuas mus rau kev muag khoom tshwm sim (inventory_stock_sales_channel)

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

Judging los ntawm cov ntaub ntawv qauv, ntau hom kev muag khoom raws li xav, tab sis los ntawm lub neej ntawd tsuas yog kev sib txuas "Tshuag"-"website"(qhov txuas mus rau lub vev xaib ua raws li lub vev xaib code - base).

Ib "tsev rau khoom" tuaj yeem txuas rau ntau yam "rau cov chaw"thiab ib"qhov chaw"- mus rau ntau"cov tsev khaws khoom"(ntau-rau-ntau txoj kev sib raug zoo). Cov kev zam yog default "qhov chaw"Thiab"tsev rau khoom". Lawv tsis rov txuas rau lwm qhov chaw (kev txwv ntawm qib code - qhov yuam kev "Tsis tuaj yeem khaws qhov txuas ntsig txog Default Source lossis Default Tshuag"). Cov ntsiab lus ntxiv txog MSI qauv hauv Magento 2 tuaj yeem pom hauv kab lus "Warehouse Management system siv CQRS thiab Event Sourcing. Tsim".

Kuv yuav siv lub neej ntawd configuration thiab ntxiv tag nrho cov ntaub ntawv khaws tseg rau hauv qhov chaw default, uas yog koom nrog hauv kev muag khoom txuas nrog lub vev xaib nrog cov cai base (hloov mus rau pem hauv ntej kawg ntawm lub khw - saib 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);
}

Tom qab ntxiv cov ntaub ntawv khaws cia rau cov khoom hauv lub vaj huam sib luag admin, koj tau txais daim duab no:

Magento 2: import cov khoom ncaj qha rau hauv cov ntaub ntawv

Xov Xwm

Thaum "manually" ntxiv cov duab rau ib yam khoom los ntawm admin vaj huam sib luag, cov ntaub ntawv cuam tshuam tau sau rau hauv cov lus hauv qab no:

  • catalog_product_entity_media_gallery: media registry (duab thiab video ntaub ntawv);
  • catalog_product_entity_media_gallery_value: txuas xov xwm rau cov khoom lag luam thiab kev nthuav qhia (localization);
  • catalog_product_entity_media_gallery_value_to_entity: txuas cov xov xwm rau cov khoom lag luam nkaus xwb (tsuas yog cov ntsiab lus ntawm kev tshaj tawm rau cov khoom lag luam);
  • catalog_product_entity_varchar: Cov luag haujlwm uas siv cov duab tau muab khaws cia ntawm no;

thiab cov dluab lawv tus kheej raug cawm rau hauv phau ntawv ./pub/media/catalog/product/x/y/qhov twg x ΠΈ y - thawj thiab thib ob tsab ntawv ntawm cov duab cov ntaub ntawv npe. Piv txwv li, cov ntaub ntawv image.png yuav tsum tau txais kev cawmdim li ./pub/media/catalog/product/i/m/image.png, kom lub platform siv tau raws li cov duab thaum piav qhia cov khoom los ntawm cov catalog.

Sau npe tso rau hauv ./pub/media/catalog/product/ media file (txoj kev tso cov ntaub ntawv nws tus kheej tsis tau tham hauv kab lus no):

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

Thaum sau npe, cov ntaub ntawv xov xwm tshiab raug muab rau tus cim.

Peb koom nrog cov ntaub ntawv xov xwm sau npe nrog cov khoom sib xws rau lub khw muag khoom ua ntej:

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

Peb koom nrog cov ntaub ntawv xov xwm sau npe nrog cov khoom sib xws yam tsis tau khi rau ib qho chaw muag khoom. Nws tsis paub meej tias qhov twg cov ntaub ntawv no raug siv thiab vim li cas nws thiaj li tsis tuaj yeem nkag mus rau cov ntaub ntawv los ntawm cov lus dhau los, tab sis cov lus no muaj nyob thiab cov ntaub ntawv tau sau rau nws thaum daim duab ntxiv rau cov khoom. Yog li ntawd yog nws.

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

Cov ntaub ntawv xov xwm tuaj yeem siv nrog lub luag haujlwm sib txawv (tus cwj pwm sib raug zoo yog qhia hauv kab lus):

  • Base(image)
  • Duab me (small_image)
  • Thumbnail (thumbnail)
  • Swatch Duab (swatch_image)

Txuas lub luag haujlwm rau cov ntaub ntawv xov xwm yog qhov tshwm sim hauv catalog_product_entity_varchar. Txoj cai khi zoo ib yam li cov cai hauv "Cov yam ntxwv ntawm cov khoom tseem ceeb".

Tom qab ntxiv cov duab rau cov khoom hauv lub vaj huam sib luag admin nws zoo li no:

Magento 2: import cov khoom ncaj qha rau hauv cov ntaub ntawv

Pawg

Cov lus tseem ceeb muaj cov ntaub ntawv los ntawm qeb:

  • catalog_category_entity: sau npe ntawm pawg;
  • catalog_category_product: kev sib txuas ntawm cov khoom thiab pawg;
  • catalog_category_entity_*: EAV attribute values;

Thaum xub thawj, hauv daim ntawv thov Magento khoob, pawg npe muaj 2 pawg (Kuv luv cov npe kab: 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|

Cov qeb nrog id=1 yog lub hauv paus ntawm tag nrho Magento catalog thiab tsis muaj nyob rau hauv lub vaj huam sib luag admin lossis nyob rau sab pem hauv ntej. Qeb nrog id=2 (Default Category) yog pawg hauv paus rau lub vev xaib lub khw tseem ceeb (Lub Vev Xaib Loj) tsim thaum daim ntawv thov raug xa mus (saib. Admin / Khw / Txhua Lub Khw). Ntxiv mus, lub hauv paus qeb ntawm lub khw nws tus kheej kuj tsis muaj nyob rau pem hauv ntej, tsuas yog nws subcategories.

Txij li thaum lub ntsiab lus ntawm tsab xov xwm no tseem yog importing cov ntaub ntawv ntawm cov khoom, kuv yuav tsis siv ncaj qha nkag mus rau hauv lub database thaum tsim pawg, tab sis yuav siv cov chav kawm muab los ntawm Magento nws tus kheej (qauv qauv thiab repositories). Kev nkag ncaj qha rau hauv cov ntaub ntawv tsuas yog siv los koom nrog cov khoom tuaj txawv teb chaws nrog ib pawg (cov qeb yog sib luag los ntawm nws lub npe, thiab qeb id raug muab rov qab thaum sib piv):

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

Tom qab ntxiv cov khoom txuas mus rau pawg "Qeb 1" thiab "Qeb 2", cov ntsiab lus ntawm cov khoom lag luam hauv pawg tswj hwm saib qee yam zoo li no:

Magento 2: import cov khoom ncaj qha rau hauv cov ntaub ntawv

Kev ua ntxiv

Thaum cov ntaub ntawv import tiav, koj yuav tsum ua kom tiav cov kauj ruam ntxiv hauv qab no:

  • data indexing: hu rau hauv lub console ./bin/magento indexer:reindex;
  • regenerating URLs rau cov khoom / pawg: koj tuaj yeem siv qhov txuas ntxiv "elgentos/regenerate-catalog-urlsΒ«

Cov khoom hauv pawg tswj hwm tom qab ua haujlwm ntxiv:

Magento 2: import cov khoom ncaj qha rau hauv cov ntaub ntawv

thiab pem hauv ntej:

Magento 2: import cov khoom ncaj qha rau hauv cov ntaub ntawv

Txoj kev xaus

Tib yam khoom (10 daim) raws li nyob rau hauv tsab xov xwm dhau los yog imported tsawg kawg yog ib qho kev txiav txim siab ceev (1 thib ob piv rau 10). Txhawm rau kwv yees qhov nrawm dua, koj xav tau ntau cov khoom lag luam - ntau pua, lossis zoo dua ntau txhiab. Txawm li cas los xij, txawm tias qhov me me ntawm cov ntaub ntawv tawm tswv yim, peb tuaj yeem txiav txim siab tias kev siv cov cuab yeej muab los ntawm Magento (cov qauv thiab cov chaw khaws cia) yog qhov tseem ceeb (Kuv hais txog - npaum li cas!) ua kom txoj kev loj hlob ntawm qhov xav tau kev ua haujlwm, tab sis tib lub sijhawm tseem ceeb (Kuv hais txog - npaum li cas!) txo qhov ceev ntawm cov ntaub ntawv nkag mus rau hauv cov ntaub ntawv.

Yog li ntawd, cov dej tau hloov mus rau ntub thiab qhov no tsis yog kev tshwm sim. Txawm li cas los xij, tam sim no kuv muaj cov cai ua si nrog thiab tej zaum tuaj rau qee qhov kev txiav txim siab ntxiv.

Tau qhov twg los: www.hab.com