Magento 2: εισαγωγή προϊόντων απευθείας στη βάση δεδομένων
В προηγούμενο άρθρο Περιέγραψα τη διαδικασία εισαγωγής προϊόντων στο Magento 2 με τον συνηθισμένο τρόπο - μέσω μοντέλων και αποθετηρίων. Η συνήθης μέθοδος έχει πολύ χαμηλή ταχύτητα επεξεργασίας δεδομένων. Ο φορητός υπολογιστής μου έβγαζε περίπου ένα προϊόν ανά δευτερόλεπτο. Σε αυτή τη συνέχεια, θεωρώ έναν εναλλακτικό τρόπο εισαγωγής ενός προϊόντος - με απευθείας είσοδο στη βάση δεδομένων, παρακάμπτοντας τους τυπικούς μηχανισμούς Magento 2 (μοντέλα, εργοστάσια, αποθετήρια). Η ακολουθία βημάτων για την εισαγωγή προϊόντων μπορεί να προσαρμοστεί σε οποιαδήποτε γλώσσα προγραμματισμού που μπορεί να λειτουργήσει με τη MySQL.
Αποποίηση ευθυνών: Το Magento διαθέτει έτοιμη λειτουργικότητα για εισαγωγή δεδομένων και, πιθανότατα, θα είναι αρκετό για εσάς. Ωστόσο, εάν χρειάζεστε πιο ολοκληρωμένο έλεγχο στη διαδικασία εισαγωγής, χωρίς να περιορίζεται στην προετοιμασία ενός αρχείου CSV για αυτό που έχετε, καλώς ήρθατε στο cat.
Ο κώδικας που προκύπτει από τη σύνταξη και των δύο άρθρων μπορεί να προβληθεί στην ενότητα Magento "flancer32/mage2_ext_demo_import". Ακολουθούν ορισμένοι περιορισμοί που ακολούθησα για να απλοποιήσω τον κώδικα της μονάδας επίδειξης:
Τα προϊόντα δημιουργούνται μόνο, δεν ενημερώνονται.
Μία αποθήκη
Εισάγονται μόνο ονόματα κατηγοριών, χωρίς τη δομή τους
Οι δομές δεδομένων συμμορφώνονται με την έκδοση 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 — αν δεν το προσδιορίσουμε, τότε θα χρησιμοποιηθεί το «απλό».
Για να γράψω απευθείας στη βάση δεδομένων, χρησιμοποιώ τον προσαρμογέα DB του ίδιου του Magento:
Το πρόσφατα καταχωρημένο προϊόν δεν έχει ακόμη όνομα ή περιγραφή. Όλα αυτά γίνονται μέσω Χαρακτηριστικά EAV. Ακολουθεί μια λίστα με τα βασικά χαρακτηριστικά του προϊόντος που απαιτούνται για να εμφανίζεται σωστά το προϊόν στο μπροστινό μέρος:
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);
}
}
Χρησιμοποιώντας τον κωδικό χαρακτηριστικού, προσδιορίζουμε το αναγνωριστικό και τον τύπο δεδομένων του (datetime, decimal, int, text, varchar), στη συνέχεια γράψτε τα δεδομένα για το παράθυρο διαχείρισης στον κατάλληλο πίνακα (store_id = 0).
Αφού προσθέσετε τα παραπάνω χαρακτηριστικά στο προϊόν, λαμβάνετε αυτήν την εικόνα στον πίνακα διαχείρισης:
Δεδομένα αποθέματος
Ξεκινώντας από την έκδοση 2.3 στο Magento, υπάρχουν δύο παράλληλα σύνολα πινάκων που παρέχουν αποθήκευση πληροφοριών αποθέματος (ποσότητα προϊόντος):
cataloginventory_*: παλιά δομή;
inventory_*: νέα δομή (MSI - Απόθεμα πολλαπλών πηγών);
Πρέπει να προσθέσετε δεδομένα αποθέματος και στις δύο δομές, γιατί η νέα δομή δεν είναι ακόμη εντελώς ανεξάρτητη από την παλιά (είναι πολύ πιθανό ότι για default αποθήκη στη νέα δομή εμπλέκεται ένας πίνακας cataloginventory_stock_status ως inventory_stock_1).
κατάλογος απογραφή_
Κατά την ανάπτυξη του Magneto 2.3 έχουμε αρχικά 2 καταχωρήσεις store_website, που αντιστοιχεί σε δύο ιστότοπους - διαχειριστή και κύριο πελάτη:
Δηλαδή, στην παλιά μας δομή υπάρχει μόνο μία "αποθήκη" (stock) και συνδέεται με τον ιστότοπο διαχείρισης. Προσθήκη νέων μέσω του πίνακα διαχείρισης sources/stocks στο MSI (νέα δομή) δεν οδηγεί σε νέες καταχωρήσεις cataloginventory_stock.
Τα δεδομένα αποθέματος για προϊόντα στην παλιά δομή καταγράφονται αρχικά σε πίνακες:
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);
}
καταγραφή εμπορευμάτων_
Αρχικά, η νέα δομή για την αποθήκευση δεδομένων αποθέματος περιέχει 1 "πηγή«(inventory_source):
«Πηγή» αντιπροσωπεύει τη φυσική αποθήκευση προϊόντων (η εγγραφή περιέχει φυσικές συντεταγμένες και ταχυδρομική διεύθυνση). "Αποθήκη"είναι μια λογική ένωση πολλών "πηγών" (inventory_source_stock_link)
στο επίπεδο στο οποίο πραγματοποιείται η σύνδεση με το κανάλι πωλήσεων (inventory_stock_sales_channel)
type |code|stock_id|
-------|----|--------|
website|base| 1|
Κρίνοντας από τη δομή δεδομένων, θεωρούνται διάφοροι τύποι καναλιών πωλήσεων, αλλά από προεπιλογή μόνο η σύνδεση "στοκ"-""(ο σύνδεσμος προς τον ιστότοπο ακολουθεί τον κώδικα του ιστότοπου - base).
Ενας "αποθήκη"μπορεί να συνδεθεί με πολλά"πηγές"και ένα "πηγή"- σε αρκετούς"αποθήκες«(σχέση πολλά-προς-πολλά). Οι εξαιρέσεις είναι προεπιλεγμένες "πηγή"Και"αποθήκη". Δεν επανασυνδέονται με άλλες οντότητες (περιορισμός σε επίπεδο κώδικα - το σφάλμα "Δεν είναι δυνατή η αποθήκευση συνδέσμου που σχετίζεται με την προεπιλεγμένη πηγή ή την προεπιλεγμένη μετοχή"). Περισσότερες λεπτομέρειες σχετικά με τη δομή MSI στο Magento 2 μπορείτε να βρείτε στο άρθρο "Σύστημα διαχείρισης αποθήκης με χρήση CQRS και Event Sourcing. Σχέδιο".
Θα χρησιμοποιήσω την προεπιλεγμένη διαμόρφωση και θα προσθέσω όλες τις πληροφορίες αποθέματος στην πηγή default, το οποίο εμπλέκεται στο κανάλι πωλήσεων που σχετίζεται με τον ιστότοπο με τον κωδικό base (αντιστοιχεί στο μπροστινό μέρος του καταστήματος - βλ store_website):
Αφού προσθέσετε δεδομένα αποθέματος στο προϊόν στον πίνακα διαχείρισης, λαμβάνετε αυτήν την εικόνα:
Μέσα ενημέρωσης
Όταν προσθέτετε "μη αυτόματη" μια εικόνα σε ένα προϊόν μέσω του πίνακα διαχείρισης, οι σχετικές πληροφορίες καταγράφονται στους ακόλουθους πίνακες:
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/ αρχείο πολυμέσων (η διαδικασία τοποθέτησης του ίδιου του αρχείου δεν συζητείται σε αυτό το άρθρο):
Συσχετίζουμε το καταχωρημένο αρχείο πολυμέσων με το αντίστοιχο προϊόν χωρίς να δεσμευόμαστε σε καμία βιτρίνα. Δεν είναι σαφές πού ακριβώς χρησιμοποιούνται αυτά τα δεδομένα και γιατί είναι αδύνατη η πρόσβαση στα δεδομένα από τον προηγούμενο πίνακα, αλλά αυτός ο πίνακας υπάρχει και τα δεδομένα εγγράφονται σε αυτόν όταν προστίθεται μια εικόνα στο προϊόν. Αρα αυτο ειναι.
Ένα αρχείο πολυμέσων μπορεί να χρησιμοποιηθεί με διαφορετικούς ρόλους (ο αντίστοιχος κωδικός χαρακτηριστικών υποδεικνύεται σε παρένθεση):
Βάση(image)
Μικρή εικόνα (small_image)
μικρογραφία (thumbnail)
Swatch εικόνας (swatch_image)
Η σύνδεση ρόλων με ένα αρχείο πολυμέσων είναι ακριβώς αυτό που συμβαίνει μέσα catalog_product_entity_varchar. Ο δεσμευτικός κώδικας είναι παρόμοιος με τον κώδικα στο "Βασικά χαρακτηριστικά προϊόντος".
Αφού προσθέσετε μια εικόνα στο προϊόν στον πίνακα διαχείρισης, φαίνεται ως εξής:
Категории
Κύριοι πίνακες που περιέχουν δεδομένα ανά κατηγορία:
catalog_category_entity: μητρώο κατηγοριών;
catalog_category_product: σύνδεση μεταξύ προϊόντων και κατηγοριών.
Αρχικά, σε μια κενή εφαρμογή Magento, το μητρώο κατηγοριών περιέχει 2 κατηγορίες (συντόμευσα τα ονόματα των στηλών: crt - created_at, upd - updated_at):
Η κατηγορία με id=1 είναι η ρίζα ολόκληρου του καταλόγου Magento και δεν είναι διαθέσιμη ούτε στον πίνακα διαχείρισης ούτε στην πρώτη σελίδα. Κατηγορία με id=2 (προεπιλογή Κατηγορία) είναι η ριζική κατηγορία για το κεντρικό κατάστημα του κύριου ιστότοπου (Κύριο Κατάστημα Ιστοσελίδας) δημιουργείται κατά την ανάπτυξη της εφαρμογής (βλ. Διαχειριστής / Καταστήματα / Όλα τα καταστήματα). Επιπλέον, η βασική κατηγορία του ίδιου του καταστήματος δεν είναι επίσης διαθέσιμη στο μπροστινό μέρος, παρά μόνο οι υποκατηγορίες του.
Δεδομένου ότι το θέμα αυτού του άρθρου εξακολουθεί να είναι η εισαγωγή δεδομένων για προϊόντα, δεν θα χρησιμοποιήσω την απευθείας είσοδο στη βάση δεδομένων κατά τη δημιουργία κατηγοριών, αλλά θα χρησιμοποιήσω τις κλάσεις που παρέχονται από το ίδιο το Magento (μοντέλα και αποθετήρια). Η απευθείας είσοδος στη βάση δεδομένων χρησιμοποιείται μόνο για τη συσχέτιση του εισαγόμενου προϊόντος με μια κατηγορία (η κατηγορία αντιστοιχίζεται με το όνομά της και το αναγνωριστικό κατηγορίας ανακτάται κατά την αντιστοίχιση):
Αφού προσθέσετε έναν σύνδεσμο προϊόντος στις κατηγορίες "Κατηγορία 1" και "Κατηγορία 2", οι λεπτομέρειες του προϊόντος στον πίνακα διαχείρισης μοιάζουν κάπως έτσι:
Πρόσθετες ενέργειες
Μόλις ολοκληρωθεί η εισαγωγή δεδομένων, πρέπει να ολοκληρώσετε τα ακόλουθα πρόσθετα βήματα:
ευρετηρίαση δεδομένων: κλήση στην κονσόλα ./bin/magento indexer:reindex;
αναγέννηση διευθύνσεων URL για προϊόντα/κατηγορίες: μπορείτε να χρησιμοποιήσετε την επέκταση "elgentos/regenere-catalog-urls«
Προϊόντα στον πίνακα διαχείρισης μετά την εκτέλεση πρόσθετων ενεργειών:
και στο μπροστινό μέρος:
Περίληψη
Το ίδιο σύνολο προϊόντων (10 τεμάχια) όπως στο προηγούμενο άρθρο εισάγεται τουλάχιστον κατά μια τάξη μεγέθους ταχύτερα (1 δευτερόλεπτο έναντι 10). Για να εκτιμήσετε με μεγαλύτερη ακρίβεια την ταχύτητα, χρειάζεστε μεγαλύτερο αριθμό προϊόντων - αρκετές εκατοντάδες ή ακόμα καλύτερα χιλιάδες. Ωστόσο, ακόμη και με τόσο μικρό μέγεθος δεδομένων εισόδου, μπορούμε να συμπεράνουμε ότι η χρήση των εργαλείων που παρέχει το Magento (μοντέλα και αποθετήρια) είναι σημαντική (τονίζω - πολύ!) επιταχύνετε την ανάπτυξη της απαιτούμενης λειτουργικότητας, αλλά ταυτόχρονα σημαντικά (τονίζω - πολύ!) μειώστε την ταχύτητα με την οποία τα δεδομένα εισέρχονται στη βάση δεδομένων.
Ως αποτέλεσμα, το νερό αποδείχθηκε υγρό και αυτό δεν είναι αποκάλυψη. Ωστόσο, τώρα έχω τον κώδικα για να παίξω και ίσως να καταλήξω σε κάποια πιο ενδιαφέροντα συμπεράσματα.