Magento 2: εισαγωγή προϊόντων από εξωτερικές πηγές

Το Magento είναι μια λύση ηλεκτρονικού εμπορίου, δηλ. στοχεύει περισσότερο στην πώληση προϊόντων παρά στην αποθήκευση, την εφοδιαστική ή τη χρηματοοικονομική λογιστική που συνοδεύει τις πωλήσεις. Άλλες εφαρμογές (για παράδειγμα, συστήματα ERP) είναι καλύτερα κατάλληλες για συνοδευτικές εφαρμογές. Επομένως, αρκετά συχνά στην πρακτική της χρήσης του Magento προκύπτει το καθήκον της ενοποίησης ενός καταστήματος με αυτά τα άλλα συστήματα (για παράδειγμα, 1C).

Σε γενικές γραμμές, η ενοποίηση μπορεί να περιοριστεί στην αναπαραγωγή δεδομένων με:

  • κατάλογος (προϊόντα, κατηγορίες).
  • δεδομένα αποθέματος (υπόλοιπα προϊόντων σε αποθήκες και τιμές).
  • πελάτες;
  • παραγγελίες?

Το Magento προσφέρει μια ξεχωριστή κατηγορία αντικειμένων για τον χειρισμό δεδομένων στη βάση δεδομένων - αποθετήρια. Λόγω των ιδιαιτεροτήτων του Magento, η προσθήκη δεδομένων στη βάση δεδομένων μέσω αποθετηρίων είναι εύκολη στην κωδικοποίηση, αλλά είναι, ας πούμε, αργή. Σε αυτήν τη δημοσίευση, εξετάζω τα κύρια στάδια της προγραμματικής προσθήκης ενός προϊόντος στο Magento 2 με τον «κλασικό» τρόπο - χρησιμοποιώντας κλάσεις repo.

Οι πελάτες και οι παραγγελίες συνήθως αναπαράγονται προς την άλλη κατεύθυνση - από το 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);

Μέσα ενημέρωσης

Κατά κανόνα, η υποστήριξη μέσων για ένα προϊόν για έναν πελάτη σε ένα κατάστημα (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);

Για κάποιο λόγο, τα μέσα συνδέονται μόνο αφού πρώτα αποθηκεύσετε το προϊόν και το ανακτήσετε ξανά από το χώρο αποθήκευσης. Και πρέπει να καθορίσετε το χαρακτηριστικό label κατά την προσθήκη μιας καταχώρισης στη συλλογή πολυμέσων προϊόντων (διαφορετικά έχουμε μια εξαίρεση Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).

Категории

Συχνά, η δομή κατηγορίας του καταστήματος και η εφαρμογή backend ή η τοποθέτηση προϊόντων σε αυτά μπορεί να διαφέρουν σημαντικά. Οι στρατηγικές για τη μετεγκατάσταση δεδομένων σχετικά με κατηγορίες και προϊόντα εντός αυτών εξαρτώνται από πολλούς παράγοντες. Σε αυτό το παράδειγμα επιμένω στα εξής:

  • Οι κατηγορίες 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);

Η σύνδεση ενός προϊόντος με μια κατηγορία πραγματοποιείται χρησιμοποιώντας το αναγνωριστικό κατηγορίας και το SKU προϊόντος:

/** @var MagentoCatalogModelCategoryProductLinkFactory $factCatProdLink */
/** @var MagentoCatalogApiCategoryLinkRepositoryInterface $repoCatLink */
$link = $factCatProdLink->create();
$link->setCategoryId($catMageId);
$link->setSku($prodSku);
$repoCatLink->save($link);

Σε συνολικά

Η σύνταξη κώδικα για την προσθήκη ενός προϊόντος μέσω προγραμματισμού στο Magento 2 είναι αρκετά εύκολη. Έχω συνδυάσει όλα όσα αναφέρθηκαν παραπάνω σε μια ενότητα επίδειξης "flancer32/mage2_ext_demo_import". Υπάρχει μόνο μία εντολή κονσόλας στη μονάδα fl32:import:prod, το οποίο εισάγει τα προϊόντα που περιγράφονται στο αρχείο JSON "./etc/data/products.json":

[
  {
    "sku": "...",
    "name": "...",
    "desc": "...",
    "desc_short": "...",
    "price": ...,
    "qty": ...,
    "categories": ["..."],
    "image_path": "..."
  }
]

Οι φωτογραφίες για εισαγωγή υπάρχουν στον κατάλογο ./etc/data/img.

Ο χρόνος εισαγωγής 10 προϊόντων χρησιμοποιώντας αυτήν τη μέθοδο είναι περίπου 10 δευτερόλεπτα στον φορητό υπολογιστή μου. Αν αναπτύξουμε περαιτέρω αυτήν την ιδέα, είναι εύκολο να καταλήξουμε στο συμπέρασμα ότι μπορούν να εισαχθούν περίπου 3600 προϊόντα ανά ώρα και μπορεί να χρειαστούν περίπου 100 ώρες για την εισαγωγή 30 προϊόντων. Η αντικατάσταση ενός φορητού υπολογιστή με έναν διακομιστή σάς επιτρέπει να εξομαλύνετε κάπως την κατάσταση. Ίσως και αρκετές φορές. Όχι όμως κατά τάξεις μεγέθους. Ίσως αυτή η ταχύτητα και η βραδύτητα να είναι ως ένα βαθμό ένας από τους λόγους για την ανάδυση του έργου magento/async-import.

Μια ριζική λύση για την αύξηση της ταχύτητας εισαγωγής θα μπορούσε να είναι η απευθείας είσοδος στη βάση δεδομένων, αλλά σε αυτήν την περίπτωση όλα τα "καλά" σχετικά με την επεκτασιμότητα του Magento χάνονται - θα πρέπει να κάνετε τα πάντα "προχωρημένα" μόνοι σας. Ωστόσο, αξίζει τον κόπο. Εάν λειτουργήσει, θα εξετάσω την προσέγγιση με απευθείας εγγραφή στη βάση δεδομένων στο επόμενο άρθρο.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο