Comment utilisez-vous l'API pour ajouter des produits à un paquet?
-
22-10-2019 - |
Question
Je développe un système qui intègre une application Django existante avec un magasin Magento. J'ai réussi, en utilisant cette bibliothèque , de créer des produits de type bundle, ainsi que les attributs et les catégories comme prévu. Le problème est que je ne peux pas trouver un moyen, en utilisant l'API (soit par la bibliothèque mentionnée ci-dessus ou en appelant les méthodes de xmlrpc
directement), d'ajouter des produits à un paquet précédemment créé. Appel de la méthode catalog_product.info
ne retourne pas quelque chose d'utile sur les objets groupés.
La recherche en ligne, je n'ai trouvé des solutions qui impliquent soit:
- scripts PHP qui utilisent la base de code Magento
- insertion droite à la base de données
Aucune de ces est actuellement une option pour moi en ce moment, et je ne pense pas être en mesure de le faire en utilisant simplement l'API (soit REST ou SOAP) ne soit pas une attente irréaliste d'avoir.
La solution
Arrière-plan
Il est pas possible avec l'API hors-boîte seule; la documentation semble assez claire à ce sujet car il documente aucun moyen d'établir des sélections, des options pour un paquet
En dehors de cela, l'absence d'un fichier api.xml dans le paquet Mage_Bundle
est dit qu'il n'y a pas de soutien. Voilà qui contraste avec un autre type de produit qui est arrivé après 1,0, comme téléchargeable, et il est évident que le manque de soutien semble être intentionnel.
Alors, pourquoi seraient-ils intentionnellement soutien Omettre ici? L'équipe de base peut probablement carillon à cette fin. Je pense que le nombre d'options disponibles et de la complexité dans la conception d'une API comme celui-ci n'a tout simplement pas marché dans les calculs coûts / bénéfices.
Alors, Wut faire?
Comme Oleksii déjà indiqué, vous devrez étendre l'API Magento pour permettre que cela se produise.
Un barebone de script autonome qui crée ressemblerait à quelque chose comme une sélection option / bundle ceci:
<?php
require('app/Mage.php');
Mage::app();
$items[] = array(
'title' => 'test title',
'option_id' => '',
'delete' => '',
'type' => 'radio',
'required' => 1,
'position' => 0
);
$selections = array();
$selectionRawData[] = array(
'selection_id' => '',
'option_id' => '',
'product_id' => '159',
'delete' => '',
'selection_price_value' => '10',
'selection_price_type' => 0,
'selection_qty' => 1,
'selection_can_change_qty' => 0,
'position' => 0
);
$selections[] = $selectionRawData;
$product = Mage::getModel('catalog/product')->setStoreId(0);
$product->load(182);
if (!$product) {
//bail
throw new Exception('Product loaded does not exist');
}
Mage::register('product', $product);
Mage::register('current_product', $product);
$product->setCanSaveConfigurableAttributes(false);
$product->setCanSaveCustomOptions(true);
$product->setBundleOptionsData($items);
$product->setBundleSelectionsData($selections);
$product->setCanSaveCustomOptions(true);
$product->setCanSaveBundleSelections(true);
$product->save();
au plus tout ce que nous aurions à faire est de fournir une interface API pour les options requises. Créer un nouveau module avec un modèle qui étend le modèle abstrait API Magento, et une méthode qui prend la $items
et $selectionRawData
comme paramètres:
<?php
class YourCompany_YourModule_Model_Api extends Mage_Api_Model_Resource_Abstract
{
public function createSelectionLink($items, $selectionRawData, $productId, $storeid)
{
$selections = array();
//check if product id in selection data is valid
$optionProduct = Mage::getModel('catalog/product')->load($selectionRawData['product_id']);
if(!$optionProduct->getId()){
throw new Exception('Selection product provided does not reference a valid product');
}
$selections[] = $selectionRawData;
$product = Mage::getModel('catalog/product')->setStoreId($storeid);
$product->load($productId);
if (!$product->getId()) {
//bail
throw new Exception('Product loaded does not exist');
}
Mage::register('product', $product);
Mage::register('current_product', $product);
$product->setCanSaveConfigurableAttributes(false);
$product->setCanSaveCustomOptions(true);
$product->setBundleOptionsData($items);
$product->setBundleSelectionsData($selections);
$product->setCanSaveCustomOptions(true);
$product->setCanSaveBundleSelections(true);
$product->save();
}
}
Rappelez-vous que $items
et $selectionRawData
sont des tableaux (exemples sont énumérés ci-dessus dans le bloc de code script autonome).
Maintenant, créez un api.xml fichier dans votre répertoire etc
de votre module avec le contenu suivant:
<?xml version="1.0"?>
<config>
<api>
<resources>
<bundle_link translate="title" module="yourcompany_bundleapi">
<title>Bundle creation extension</title>
<model>bundleapi/api</model>
<methods>
<createSelectionLink translate="title" module="yourcompany_bundleapi">
<title>Create a selection link</title>
</createSelectionLink>
</methods>
</bundle_link>
</resources>
</api>
</config>
Voilà.
Et d'appeler la nouvelle API, nous utilisons:
$proxy->call($sessionId, 'bundle_link.createSelectionLink', array($items, $selectionRawData, $productId, $storeid));
Mises en garde / pré-requis
- Vous devez avoir déjà créé un produit de paquet shell
- Vous devez avoir déjà un produit simple lien dans la sélection
- Vous devez comprendre le format des paramètres du tableau API ou bien l'appel
save
va étouffer, lancer des exceptions - Il utilise uniquement un type de bouton
radio
- il y a d'autres.dropdown
,checkbox
par exemple - Le tableau de
$items
crée un élément de paquet à prix fixe. Cela peut être ignoré ou peut étouffer pour un faisceau de prix dynamique. - Le code ci-dessus est un exemple et raccourci pour des raisons de brièveté; si vous construisez ce que vous voudriez le code pour être plus riche en fonctionnalités / résiliente afin de ne pas conduire vos développeurs fou en essayant de créer des interfaces qui fabriquent des produits.
Références:
http: // kavinduthundeniya. blogspot.de/2012/11/magento-extention-api-for-bundle.html