Comment créer un produit avec des attributs supplémentaires dans Magento via Soap / Java
Bonne journée!
Je voudrais utiliser Magento de l'API SOAP pour gérer le catalogue de produits, attributs, etc. Je suis à court de configuration suivantes:-
- Magento 1.6
- Soap API WS-I de la conformité
- Mac OSX Lion
- Mamp 2.0.5
Au cas où quelqu'un veut créer un nouveau produit, il est nécessaire de définir quelques propriétés de l'objet produit.
Code suivant va montrer ma démarche pour ce faire :
public int createProduct(DatabaseProduct product) {
ArrayOfString categories = new ArrayOfString();
categories.getComplexObjectArray().add(categoryID);
createEntity.setCategoryIds(categories);
CatalogProductCreateEntity createEntity = populateCreateOrUpdateEntity(product);
CatalogProductCreateRequestParam param = new CatalogProductCreateRequestParam();
param.setSessionId(sessionId);
param.setSet(setId);
param.setSku(product.getSku());
param.setType("simple");
param.setStore(storeId);
param.setProductData(createEntity);
CatalogProductCreateResponseParam response = service.catalogProductCreate(param);
return response.getResult();
}
private CatalogProductCreateEntity populateCreateOrUpdateEntity(DatabaseProduct product) {
CatalogProductCreateEntity createEntity = new CatalogProductCreateEntity();
createEntity.setShortDescription(product.getDescription().substring(0, 20) + "...");
createEntity.setDescription(product.getDescription());
createEntity.setName(product.getName());
createEntity.setPrice(String.valueOf(product.getPrice()));
createEntity.setStatus("1"); //active
createEntity.setVisibility("4"); //visible in search/catalog
createEntity.setWeight("70"); //some value
createEntity.setTaxClassId("2"); //standard
AssociativeArray attributes = new AssociativeArray();
AssociativeEntity attr1 = new AssociativeEntity();
attr1.("attribute1_key";
attr1.("attribute1_value");
attributes.getComplexObjectArray().add(attr1);
AssociativeEntity attr2 = new AssociativeEntity();
attr2.("attribute2_key");
attr2.("attribute2_value");
attributes.getComplexObjectArray().add(attr2);
createEntity.setAdditionalAttributes(attributes);
return createEntity;
}
J'ai réalisé que je reçois une erreur écrite à la "system.log
" de Magento.
2012-01-21T09:41:01+00:00 DEBUG (7): First parameter must either be an object or the name of an existing class/opt/website/magento/app/code/core/Mage/Catalog/Model/Product/Api/V2.php
J'ai pu localiser l'erreur dans le "V2.php
" fichier sur la ligne 265.
Selon l'php.net la documentation de la "property_exists()
" méthode ne peut vérifier les champs dans les objets.
Comme une question de fait, le "$productData
" variable contient une propriété appelée"additional_attributes
", qui est du type array.
Par conséquent, l'exécution de ce code entraînera une erreur.
D'ailleurs, je ne sais pas à reproduire l'objet de la structure de la "$productData
" objet à travers l'utilisation de Magento SOAP API V2.
Si j'examine ce code ("foreach
" boucle) dans la ligne 270, il indique qu'il existe un objet ("$productData
") titulaires d'un array ("additional_attributes
") qui encore une fois est d'encapsuler un ensemble de paires clé/valeur (si je suis à droite)
253 protected function _prepareDataForSave ($product, $productData)
254 {
255 if (property_exists($productData, 'website_ids') && is_array($productData->website_ids)) {
256 $product->setWebsiteIds($productData->website_ids);
257 }
258
259 Mage::log("debug1");
260 Mage::log(property_exists($productData, 'additional_attributes'));
261
262 Mage::log($productData);
263
264 if (property_exists($productData, 'additional_attributes')) {
265 if (property_exists($productData->additional_attributes, 'single_data')) {
266
267 Mage::log("---> single");
268 Mage::log($productData->additional_attributes);
269
270 foreach ($productData->additional_attributes->single_data as $_attribute) {
271 $_attrCode = $_attribute->key;
272 $productData->$_attrCode = $_attribute->value;
273 }
274 }
275 if (property_exists($productData->additional_attributes, 'multi_data')) {
276
277 Mage::log("---> multi");
278 Mage::log($productData->additional_attributes);
279
280 foreach ($productData->additional_attributes->multi_data as $_attribute) {
281 $_attrCode = $_attribute->key;
282 $productData->$_attrCode = $_attribute->value;
283 }
284 }
285
286 Mage::log("debugXXX");
287 unset($productData->additional_attributes);
288 }
289
290 Mage::log("debug2");
291
292 foreach ($product->getTypeInstance(true)->getEditableAttributes($product) as $attribute) {
293 $_attrCode = $attribute->getAttributeCode();
294 if ($this->_isAllowedAttribute($attribute) && (isset($productData->$_attrCode))) {
295 $product->setData(
296 ... etc ...
Ce qui semble être un bug. Voici donc ma question.
Vais-je droit à appeler cela un problème de programmation qui doit être affiché dans le bug de la base?
Est-il un moyen de remédier à ce problème?
Dois-je réécrire une partie du php.code ci-dessus pour satisfaire mon besoin de manipuler le produit de l'information pour créer un produit correctement ?
Merci d'avance
$productData
(
[name] => testname
[description] => testdescription
[short_description] => shorttestdescription
[weight] => 70
[status] => 1
[visibility] => 4
[price] => 359.0
[tax_class_id] => 2
[additional_attributes] => Array
(
[attribute1] => 999.0
[attribute2] => testcontent
)
)
la CatalogProductCreate-Appel à partir du WSDL généré par SoapUI:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:Magento">
<soapenv:Header/>
<soapenv:Body>
<urn:catalogProductCreateRequestParam>
<sessionId>?</sessionId>
<type>?</type>
<set>?</set>
<sku>?</sku>
<productData>
<!--Optional:-->
<categories>
<!--Zero or more repetitions:-->
<complexObjectArray>?</complexObjectArray>
</categories>
<!--Optional:-->
<websites>
<!--Zero or more repetitions:-->
<complexObjectArray>?</complexObjectArray>
</websites>
<!--Optional:-->
<name>?</name>
<!--Optional:-->
<description>?</description>
<!--Optional:-->
<short_description>?</short_description>
<!--Optional:-->
<weight>?</weight>
<!--Optional:-->
<status>?</status>
<!--Optional:-->
<url_key>?</url_key>
<!--Optional:-->
<url_path>?</url_path>
<!--Optional:-->
<visibility>?</visibility>
<!--Optional:-->
<category_ids>
<!--Zero or more repetitions:-->
<complexObjectArray>?</complexObjectArray>
</category_ids>
<!--Optional:-->
<website_ids>
<!--Zero or more repetitions:-->
<complexObjectArray>?</complexObjectArray>
</website_ids>
<!--Optional:-->
<has_options>?</has_options>
<!--Optional:-->
<gift_message_available>?</gift_message_available>
<!--Optional:-->
<price>?</price>
<!--Optional:-->
<special_price>?</special_price>
<!--Optional:-->
<special_from_date>?</special_from_date>
<!--Optional:-->
<special_to_date>?</special_to_date>
<!--Optional:-->
<tax_class_id>?</tax_class_id>
<!--Optional:-->
<tier_price>
<!--Zero or more repetitions:-->
<complexObjectArray>
<!--Optional:-->
<customer_group_id>?</customer_group_id>
<!--Optional:-->
<website>?</website>
<!--Optional:-->
<qty>?</qty>
<!--Optional:-->
<price>?</price>
</complexObjectArray>
</tier_price>
<!--Optional:-->
<meta_title>?</meta_title>
<!--Optional:-->
<meta_keyword>?</meta_keyword>
<!--Optional:-->
<meta_description>?</meta_description>
<!--Optional:-->
<custom_design>?</custom_design>
<!--Optional:-->
<custom_layout_update>?</custom_layout_update>
<!--Optional:-->
<options_container>?</options_container>
<!--Optional:-->
<additional_attributes>
<!--Zero or more repetitions:-->
<complexObjectArray>
<key>?</key>
<value>?</value>
</complexObjectArray>
</additional_attributes>
<!--Optional:-->
<stock_data>
<!--Optional:-->
<qty>?</qty>
<!--Optional:-->
<is_in_stock>?</is_in_stock>
<!--Optional:-->
<manage_stock>?</manage_stock>
<!--Optional:-->
<use_config_manage_stock>?</use_config_manage_stock>
<!--Optional:-->
<min_qty>?</min_qty>
<!--Optional:-->
<use_config_min_qty>?</use_config_min_qty>
<!--Optional:-->
<min_sale_qty>?</min_sale_qty>
<!--Optional:-->
<use_config_min_sale_qty>?</use_config_min_sale_qty>
<!--Optional:-->
<max_sale_qty>?</max_sale_qty>
<!--Optional:-->
<use_config_max_sale_qty>?</use_config_max_sale_qty>
<!--Optional:-->
<is_qty_decimal>?</is_qty_decimal>
<!--Optional:-->
<backorders>?</backorders>
<!--Optional:-->
<use_config_backorders>?</use_config_backorders>
<!--Optional:-->
<notify_stock_qty>?</notify_stock_qty>
<!--Optional:-->
<use_config_notify_stock_qty>?</use_config_notify_stock_qty>
</stock_data>
</productData>
<!--Optional:-->
<store>?</store>
</urn:catalogProductCreateRequestParam>
</soapenv:Body>
</soapenv:Envelope>
source d'informationauteur stereoscope
Vous devez vous connecter pour publier un commentaire.
Pour la V2 API SOAP il semble que nous avons besoin pour imbriquer les additional_attributes dans un multi_data ou single_data couche?
Regardant app/code/core/Mage/Catalog/Model/Product/Api/V2.php #256 je pense que nous avons besoin d'utiliser
ou
pour être utilisé comme:
J'ai effectivement eu de patch app/code/core/Mage/Catalog/Model/Product/Api/V2.php pour obtenir cet appel à fonctionner dans la version 1.6.2.0.
Le code existant vérifie une "single_data" ou "multi_data" attribut sous la 'additional_attributes et de la propriété tente d'effectuer une itération sur les personnes comme un tableau associatif:
Je pense que le problème est que depuis que nous sommes de passage le tableau associatif de la structure:
directement sous la additional_attribtutes bloc puis c'est vraiment le additional_attributes de la propriété qui doit être itéré à tirer de l'attribut clé/valeurs, j'ai donc ajouté des tiers si le bloc:
Avec ce code à la place de mes attributs personnalisés sont ajoutés ou mis à jour.
Voici un exemple de demande:
Ce n'est pas un bug. J'ai été en utilisant cette Magento SOAP API V2 depuis plus d'un an, et le concept de Magento équipe ont appliqué ici est tout à fait correcte.
Tout d'abord, chaque fois que l'une quelconque aide de l'API SOAP V2 se doit de vérifier l'WSDL pleinement de cette respectives Magento, de sorte qu'il peut créer /messages d'appel correctement. L'URL à charger le fichier WSDL, SOAP API V2 est "
<your_magento_home_page_url>/api/v2_soap/index/wsdl/1
".Maintenant revenir à votre question, le type de l'élément "
additional_attributes
" est "associativeArray
", ce qui signifie que ses XML devrait ressembler à quelque chose comme:-Un exemple de ce qui précède format XML seront:-
Donc, votre "
$productData
" variable doit contenir les valeurs comme ceci:-Espère que cela aide.
stroisi est presque tout à fait correct. Juste un correctif à cette réponse:
la troisième condition est que vous avez ajouté permettra d'évaluer à
true
pour la première des deux conditions trop (donc l'ajout de ces attributs à deux reprises dans le cas où vous êtes à l'aide de SOAPv2 non-WSI mode compatible).Que la condition de la chaîne devrait ressembler à ceci:
La troisième condition affirme que les deux
'single_data'
et'multi_data'
sont pas propriétés deadditional_attributes
.Si, à mon avis, la bonne façon de corriger ce bug est de modifier le "wsi.xml" fichier de sorte qu'il est compatible avec wsdl.xml (ou vice versa).
Je suis en utilisant des API SOAP pour l'entrée des produits dans les boutiques magento.
voici le code complet
Dans le cas de sélection multiple attribut personnalisé.