Como criar um produto com atributos adicionais no Magento via Soap / Java

Dia bom

Gostaria de usar a API SOAP do Magento para gerenciar o catálogo de produtos, atributos etc. Estou executando a seguinte configuração: -

Magento 1.6onformidade com WS-I da API do SAPMac OSX LionMamp 2.0.5

Caso alguém queira criar um novo produto, é necessário definir algumas propriedades do objeto do produto. O código a seguir demonstrará minha abordagem para fazer isso:

    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;
    }

Eu percebi que recebi um erro gravado no "system.log "do 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

Pode localizar o erro no campo "V2.php "na linha 265. De acordo com a documentação do php.net, o arquivo"property_exists() "apenas pode verificar campos em objetos. De fato, o"$productData "variável contém uma propriedade chamada"additional_attributes ", que é do tipo array. Portanto, a execução desse código levará a um erro.

Além disso, não sei reproduzir o objeto e a estrutura do "$productData "usando o SOAP API V2 do Magento.

Se eu examinar esse código ("foreach "loop) na linha 270, indica que há um objeto ("$productData ") segurando uma matriz ("additional_attributes "), que novamente deve encapsular um conjunto de pares de chave / valor (se eu estiver certo)

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 ...

Isto parece ser um inseto. Então aqui está a minha pergunta

Estou indo direto para chamar isso de um problema de programação que deve ser publicado na base de erros? Existe uma maneira de superar esse problema? Devo reescrever partes do php.code acima para satisfazer minha necessidade de lidar com as informações do produto para criar um produto corretamente?

Desde já, obrigad

    $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
            )
    )

the CatalogProductCreate-Call do WSDL gerado pelo 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>

questionAnswers(10)

yourAnswerToTheQuestion