2012-01-22 16 views
11

के माध्यम से अतिरिक्त विशेषताओं के साथ एक उत्पाद कैसे बना सकता हूं!मैं मैपेंटो में साबुन/जावा

मैं उत्पाद सूची प्रबंधन करने के लिए Magento के सोप API उपयोग करना चाहते हैं, गुण आदि मैं निम्नलिखित विन्यास चल रहा हूँ: -

  • Magento 1.6
  • साबुन एपीआई WS-I अनुपालन
  • मैक OSX शेर
  • MAMP 2.0.5

मामले में किसी को एक नया उत्पाद बनाना चाहता है, यह एक फ़े स्थापित करने के लिए आवश्यक है उत्पाद वस्तु के डब्ल्यू गुण। के बाद कोड यह करने के लिए मेरे दृष्टिकोण का प्रदर्शन करेंगे:

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

मुझे एहसास हुआ कि मैं Magento के "system.log" के लिए लिखा कोई त्रुटि मिलती है।

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 

मैं लाइन 265. पर "V2.php" फ़ाइल में त्रुटि स्थानीय बनाना सकता है php.net प्रलेखन "property_exists()" विधि केवल वस्तुओं में क्षेत्रों के लिए जाँच कर सकते हैं के अनुसार। वास्तव में "$productData" चर के रूप में "additional_attributes" नामक एक संपत्ति है जो कि प्रकार सरणी है। इसलिए इस कोड के निष्पादन से एक त्रुटि होगी।

इसके अलावा मैं ऑब्जेक्ट को "$productData" ऑब्जेक्ट की संरचना को Magento के SOAP API V2 के उपयोग के माध्यम से पुन: उत्पन्न करने के बारे में नहीं जानता।

अगर मैं इस कोड ("foreach" लूप) लाइन 270 में जांच करते हैं, यह इंगित करता है एक वस्तु ("$productData") एक सरणी ("additional_attributes") जो फिर से कुंजी/मान जोड़े का एक सेट को संपुटित करेगा पकड़े है कि वहाँ (अगर मैं सही हूं)

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

SoapUI द्वारा उत्पन्न डबल्यूएसडीएल से CatalogProductCreate-कॉल में धन्यवाद:

<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> 
+0

'product_data' का आउटपुट क्या है? यहाँ पेस्ट करें। –

उत्तर

8

V2 सोप API के लिए ऐसा लगता है कि हम घोंसला करने के लिए एक multi_data या single_data परत में additional_attributes की जरूरत है:

यहां एक नमूना अनुरोध है?

एप्लिकेशन/कोड/कोर/दाना/सूची/मॉडल/उत्पाद को देखते हुए/एपीआई/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(); 
    } 
+0

में यह सही है! लेकिन wsdl द्वारा उत्पन्न साबुन एपीआई संभव नहीं है। – stereoscope

+0

मुझे समझ में नहीं आ रहा है कि इसका मतलब क्या नहीं है? – creuzerm

+2

wsdl द्वारा उत्पन्न कक्षाएं एकल या मल्टीडाटा सेट बनाने के लिए डेटास्ट्रक्चर प्रदान नहीं करती हैं। इसलिए अनुरोध में डेटा को पैकेज करना संभव नहीं है। – stereoscope

3

यह एक बग नहीं है। मैं इस Magento SOAP API V2 का उपयोग एक वर्ष से अधिक समय से कर रहा हूं, और जिस अवधारणा ने Magento टीम ने यहां आवेदन किया है वह बिल्कुल सही है।

सबसे पहले, हर बार एसओएपी एपीआई वी 2 का उपयोग करने वाले किसी भी व्यक्ति को उस संबंधित Magento से पूरी तरह से डब्लूएसडीएल की जांच करनी चाहिए, ताकि वह संदेशों को सही तरीके से बना/कॉल कर सके। एसओएपी एपीआई वी 2 के डब्ल्यूएसडीएल को लोड करने के लिए यूआरएल "<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> 

एक उदाहरण हो जाएगा : -

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

उम्मीद है कि यह मदद करता है।

+0

हाय! धन्यवाद। मुझे यूआरएल का उपयोग करने के बारे में पता है: .../api/v2_soap/index/wsdl/1 या .../api/v2_soap? Wsdl = 1। तो यदि मैं एक सहयोगी ऐरे बनाता हूं तो मैं इसे स्ट्रिंग मानों से भर सकता हूं। इसके अलावा मैंने wached से जावा फ़ाइलों को अपाचे सीएक्सएफ – stereoscope

+0

@fritz के साथ बनाया - यह सुनकर बहुत अच्छा लगा। मुझे उम्मीद है कि अब आप इसे हल करने में सक्षम होंगे। :) –

+0

मुझे खेद है कि मुझे अपने कोड की समीक्षा करनी चाहिए, लेकिन अगर मैं एक सहयोगी बना देता हूं तो मैं केवल सहयोगी जोड़ सकता हूं लेकिन सहयोगी नहीं। इसलिए आपके द्वारा वर्णित इस प्रकार के डेटास्ट्रक्चर को बनाना संभव नहीं है। अंत में मैं एक कोड समीक्षा करूंगा और कल अपनी प्रगति पोस्ट करूंगा। – stereoscope

7

मुझे संस्करण 1.6.2.0 में काम करने के लिए वास्तव में ऐप/कोड/कोर/मैज/कैटलॉग/मॉडल/उत्पाद/एपीआई/वी 2.एफपी पैच करना पड़ा।

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

मुझे लगता है कि मुद्दा है:

या तो एक "single_data" या "multi_data" 'additional_attributes' संपत्ति के तहत विशेषता के लिए मौजूदा कोड की जांच और एक साहचर्य सरणी के रूप में उन से अधिक पुनरावृति करने की कोशिश करता कि जब हम गुजर रहे हैं साहचर्य सरणी संरचना:

<item> 
    <key>...</key> 
    <value>...</value> 
</item> 
<item> 
    <key>...</key> 
    <value>...</value> 
</item> 
सीधे additional_attribtutes तहत

को अवरुद्ध यह वास्तव में additional_attributes संपत्ति उस गुण कुंजी/मान खींचने के लिए अधिक दोहराया जाना चाहिए है, तो मैं अगर तीसरे जोड़ा ब्लॉक:

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> 
+0

आप एक प्रतिभाशाली हैं, धन्यवाद। अन्य सभी उत्तर विजुअल स्टूडियो जेनरेट प्रॉक्सी के साथ काम नहीं करते हैं। –

+0

बढ़िया! यह मेरी समस्या का समाधान भी था: http://magento.stackexchange.com/questions/1308/why-does-one-of-many-attributes-does-not-get-updated-with-soapv2-ws- i –

+1

यह उपयोग करने का उत्तर है यदि आप डब्लूएसडीएल से कोड उत्पन्न कर रहे हैं और Magento PHP कोड भी संशोधित कर सकते हैं। मैं पुष्टि कर सकता हूं कि समस्या 1.9.1 में मौजूद है और इस फिक्स ने मुझे विशेषताओं को अपडेट करने की अनुमति दी है। –

2

stroisi लगभग पूरी तरह से सही है। उस उत्तर में केवल एक फिक्स: आपके द्वारा जोड़ी गई तीसरी शर्त पहले दो स्थितियों के लिए true का मूल्यांकन करेगी (इस प्रकार यदि आप गैर-WSI- अनुरूप मोड में SOAPv2 का उपयोग कर रहे हैं तो इन गुणों को दो बार जोड़ना)। हालत श्रृंखला इस तरह दिखना चाहिए

कि:

// ... 
     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 की नहीं गुण।


हालांकि, मेरी राय में, इस बग को ठीक करने का सही तरीका "wsi.xml" फ़ाइल को संपादित करने तो यह wsdl.xml (या इसके विपरीत) के साथ संगत है।

1

मैं Magento दुकानों में उत्पादों को दर्ज करने के लिए SOAP API का उपयोग कर रहा हूं। यहां पूर्ण कोड

बहुविकल्पीय कस्टम विशेषता के मामले में है।

   $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))) 
       )); 
संबंधित मुद्दे