Добрый день!
Я хотел бы использовать SOAP API Magento для управления каталогом продуктов, атрибутами и т. Д. Я запускаю следующую конфигурацию:
Если кто-то хочет создать новый продукт, необходимо установить несколько свойств объекта продукта. Следующий код продемонстрирует мой подход:
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; }
Я понял, что я получил сообщение об ошибке « system.log
» 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
Я могу локализовать ошибку в файле « V2.php
» в строке 265. Согласно документации php.net метод property_exists()
может проверять только поля в объектах. На самом деле переменная $productData
содержит свойство, называемое « additional_attributes
$productData
», которое относится к массиву типов. Поэтому выполнение этого кода приведет к ошибке.
Более того, я не знаю, чтобы воспроизвести объект в структуре объекта « $productData
» через использование SOAP API V2 Magento.
Если я рассмотрю этот код (цикл foreach
) в строке 270, он указывает, что существует объект (« $productData
»), содержащий массив (« additional_attributes
»), который снова должен инкапсулировать набор пар ключ / значение (если I прав)
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 ...
Кажется, это ошибка. Вот мой вопрос.
Правильно ли я назвал это проблемой программирования, которая должна быть опубликована в базе ошибок? Есть ли способ преодолеть эту проблему? Должен ли я переписать части php.code сверху, чтобы удовлетворить мою потребность обрабатывать информацию о продукте для правильного создания продукта?
заранее спасибо
$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 ) )
CatalogProductCreate-Call из WSDL, созданного 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>
-<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>
-<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>
-<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>
-<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>
Для API V2 SOAP API кажется, что нам нужно вложить дополнительные_трибуты в слой multi_data или single_data?
Глядя на приложение / код / ядро / Маг / Каталог / Модель / Продукт / Api / V2.php # 256 Я думаю, нам нужно использовать
$manufacturer = new stdClass(); $manufacturer->key = "manufacturer"; $manufacturer->value = "20"; $additionalAttrs['single_data'][] = $manufacturer;
или
$manufacturer = new stdClass(); $manufacturer->key = "manufacturer"; $manufacturer->value = "20"; $additionalAttrs['multi_data'][] = $manufacturer;
для использования как:
$productData = new stdClass(); $additionalAttrs = array(); // manufacturer from one of the two above ^ $productData->name = $data['name']; $productData->description = $data['description']; $productData->short_description = $data['short_description']; $productData->weight = 0; $productData->status = 2; // 1 = active $productData->visibility = 4; //visible in search/catalog $productData->category_ids = $data['categories']; $productData->price = $data['price']; $productData->tax_class_id = 2; // 2=standard $productData->additional_attributes = $additionalAttrs; // Create new product try { $proxy->catalogProductCreate($sessionId, 'virtual', 9, $sku, $productData); // 9 is courses } catch (SoapFault $e) { print $e->getMessage(); //Internal Error. Please see log for details. exit(); }
На самом деле мне пришлось заплатить приложение / код / ядро / Mage / Catalog / Model / Product / Api / V2.php, чтобы этот вызов работал в версии 1.6.2.0.
Существующий код проверяет либо атрибут «single_data», либо «multi_data» в свойстве «Additional_attributes» и пытается перебрать их как ассоциативный массив:
if (property_exists($productData, 'additional_attributes')) { if (property_exists($productData->additional_attributes, 'single_data')) { foreach ($productData->additional_attributes->single_data as $_attribute) { $_attrCode = $_attribute->key; $productData->$_attrCode = $_attribute->value; } } if (property_exists($productData->additional_attributes, 'multi_data')) { foreach ($productData->additional_attributes->multi_data as $_attribute) { $_attrCode = $_attribute->key; $productData->$_attrCode = $_attribute->value; } } }
Я думаю, что проблема в том, что, поскольку мы передаем ассоциативную структуру массива:
<item> <key>...</key> <value>...</value> </item> <item> <key>...</key> <value>...</value> </item>
непосредственно под блоком Additional_attribtutes, то это действительно свойство Additional_attributes, которое необходимо перебрать для вытягивания ключа / значений атрибута, поэтому я добавил третий блок if:
if (gettype($productData->additional_attributes) == 'array') { foreach ($productData->additional_attributes as $k => $v) { $_attrCode = $k; $productData->$_attrCode = $v; } }
С помощью этого кода мои пользовательские атрибуты добавляются / обновляются.
Вот пример запроса:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:Magento"> <soapenv:Header/> <soapenv:Body> <urn:catalogProductUpdateRequestParam> <sessionId>100fe1f9d0518b0fd0ed49cc460c1fa6</sessionId> <productId>1</productId> <productData> <name>product 3</name> <!-- the custom attributes to updated.... --> <additional_attributes> <complexObjectArray> <key>feed_id</key> <value>56920</value> </complexObjectArray> <complexObjectArray> <key>feed_active</key> <value>1</value> </complexObjectArray> </additional_attributes> </productData> </urn:catalogProductUpdateRequestParam> </soapenv:Body> </soapenv:Envelope>
Это не ошибка. Я использую этот Magento SOAP API V2 более года, и концепция, которую команда Magento применила здесь, абсолютно верна.
Прежде всего, каждый раз, когда любой, использующий SOAP API V2, должен полностью проверить WSDL этого соответствующего Magento, чтобы он мог правильно создавать / вызывать сообщения. URL-адрес для загрузки WSDL API-интерфейса SOAP API: « <your_magento_home_page_url>/api/v2_soap/index/wsdl/1
».
Теперь, возвращаясь к вашему вопросу, тип элемента « additional_attributes
» является « associativeArray
», что означает, что его XML должен выглядеть примерно так:
<additional_attributes> <!-- This XML tag "item" can be anything; it's what I use, but can definitely be any other valid non-used literal. --> <item> <key>attribute_1_code</key> <value>attribute_1_value_as_defined_in_database</value> </item> <item> <key>attribute_2_code</key> <value>attribute_2_value_as_defined_in_database</value> </item> </additional_attributes>
Одним из примеров приведенного выше формата XML будет:
<additional_attributes> <item> <key>color</key> <!-- I haven't provided the name / string "Blue", because Magento's EAV database structure will only hold the option value (which is a unique ID) and not the option literal string. --> <value>56</value> <!-- assuming this value for "Blue" color --> </item> <item> <key>manufacturer</key> <value>87</value> <!-- assuming this value for the manufacturer "Intel" --> </item> </additional_attributes>
Итак, ваша переменная $productData
должна содержать следующие значения:
$productData ( [name] => testname [description] => testdescription [short_description] => shorttestdescription [weight] => 70 [status] => 1 [visibility] => 4 [price] => 359.0 [tax_class_id] => 2 [additional_attributes] => Array ( [0] => Array ( [key] => attribute1 [value] => 999.0 ) [1] => Array ( [key] => attribute2 [value] => testcontent ) ) )
Надеюсь, поможет.
Стройси почти полностью прав. Только одно исправление для этого ответа: добавленное вами третье условие будет равно true
для первых двух условий (таким образом, добавление этих атрибутов дважды, если вы используете SOAPv2 в режиме, не совместимом с WSI).
Эта цепочка условий должна выглядеть так:
// ... if (property_exists($productData->additional_attributes, 'single_data')) { foreach ($productData->additional_attributes->single_data as $_attribute) { $_attrCode = $_attribute->key; $productData->$_attrCode = $_attribute->value; } } if (property_exists($productData->additional_attributes, 'multi_data')) { foreach ($productData->additional_attributes->multi_data as $_attribute) { $_attrCode = $_attribute->key; $productData->$_attrCode = $_attribute->value; } } else if (! property_exists($productData->additional_attributes, 'single_data')) { foreach ($productData->additional_attributes as $key => $value) { $productData->$key = $value; } } // ...
Третье условие утверждает, что 'single_data'
и 'multi_data'
не являются свойствами additional_attributes
'multi_data'
.
Хотя, на мой взгляд, правильный способ исправить эту ошибку – отредактировать файл «wsi.xml», чтобы он соответствовал wsdl.xml (или наоборот).
Я использую SOAP API для ввода продуктов в магазинах magento. вот полный код
В случае мультиселективного пользовательского атрибута.
$arrProductTime = explode(',', '136,139'); $result = $client->catalogProductCreate($session, 'simple', $attributeSet->set_id, 'product_sku1234', array( 'categories' => array(36), 'websites' => array(1), 'name' => 'my_pdt1008', 'description' => 'my_pdt1', 'short_description' => 'my_pdt1000', 'weight' => '11', 'status' => '1', 'url_key' => 'product-url-key1', 'url_path' => 'product-url-path1', 'visibility' => '4', 'price' => '100', 'tax_class_id' => 1, 'meta_title' => 'Product meta title1', 'meta_keyword' => 'Product meta keyword1', 'meta_description' => 'Product meta description1', 'stock_data' => array('qty'=>'100','is_in_stock'=>1,'manage_stock'=>1), 'additional_attributes' => array('multi_data' => array(array('key' => 'product_time', 'value' => $arrProductTime))) ));