ทำไมหนึ่งในหลาย ๆ คุณสมบัติไม่ได้รับการอัพเดตด้วย SOAPv2 WS-I


18

ฉันใช้ Magento CE 1.7.0.2 กับ SOAPv2 และ WS-I ฉันพยายามที่จะปรับปรุงผลิตภัณฑ์ที่มีcatalogProductUpdate-Method

คำอธิบายในตัวอย่างรหัสด้านล่างได้รับการอัพเดต แต่ผู้ผลิต - แอตทริบิวต์ (= เลือก) ไม่ได้ ผลจากการมีcatalogProductUpdatebool(true)

ฉันลองใช้รูปแบบ (ไม่ดีเกินไป แต่ฉันหมดหวัง ;-)) รูปแบบต่าง ๆ เช่น:

  1. กำหนดค่าจำนวนเต็ม 777 เพื่อ$manufacturer->valueตั้งค่า
  2. ภายใน / ไม่มีฟิลด์เพิ่มเติม _attributes ตั้งรหัสผลิตภัณฑ์ (แต่ฉันแน่ใจว่ามันจะต้องมีการตั้งค่าภายในเพิ่มเติม _attributes)
  3. ตั้งชื่อผู้ผลิต$manufacturer->valueแทนค่า 777

รหัส:

$newProductData = new stdClass();
$additionalAttrs = array();

$manufacturer = new stdClass();
$manufacturer->key = "manufacturer";
$manufacturer->value = "777";
$additionalAttrs['single_data'][] = $manufacturer;

$newProductData->description = "Description Test1";
$newProductData->additional_attributes = $additionalAttrs;

$result = $client->catalogProductUpdate((object)array('sessionId' => $sessionId,
        'productId' => "2110000010058 ",
        'productData' => (object)$newProductData,
        NULL,
        'sku'
    ));

แก้ไข:

  • ฉันทดสอบด้วย SOAPv2 โดยไม่มี WS-I - ใช้งานได้ดี
  • ฉันยังสร้างคุณลักษณะอื่นสำหรับการทดสอบด้วยการตั้งค่าเดียวกัน (ดร็อปดาวน์ขอบเขต ... ) ซึ่งยังไม่ได้รับการอัปเดตด้วย SOAPv2 WS-I แต่ทำกับ SOAPv2 ดังนั้นคุณลักษณะที่สร้างขึ้นใหม่เหล่านี้จะทำงานเป็นคุณลักษณะของผู้ผลิต
  • การพยายามตั้งค่าของฟิลด์ข้อความในส่วนเพิ่มเติม _attribute ไม่ทำงาน

ความคิดลิงก์คำแนะนำเกี่ยวกับเรื่องนี้?

ลิงก์: http://www.magentocommerce.com/api/soap/catalog/catalogProduct/catalog_product.update.html

คำตอบ:


14

ในที่สุดฉันก็พบสาเหตุของปัญหาและวิธีแก้ไข:

ปัญหา: SOAPv2 กับ WS-I ไม่ได้ใช้single_dataและmulti_dataคุณลักษณะ ดังนั้นการตรวจสอบใน/app/code/core/Mage/Catalog/Model/Product/Api/V2.phpใน_prepareDataForSaveล้มเหลว วิธีการ_prepareDataForSaveตรวจสอบsingle_dataและmulti_dataที่ไม่ได้เป็นส่วนหนึ่งของ SOAP-Call ตาม WSDL สำหรับ SOAPv2 ด้วย WS-I

SOAPv2 (WSDL) - catalogProductCreateEntity:

<element name="additional_attributes" type="typens:catalogProductAdditionalAttributesEntity" minOccurs="0"/>

SOAPv2 พร้อม WS-I (WSDL) - catalogProductCreateEntity:

<xsd:element name="additional_attributes" type="typens:associativeArray" minOccurs="0">
</xsd:element>

associativeArray เป็นประเภท associativeEntity ซึ่งรวมถึงคู่ของคีย์ / ค่า ใน SOAPv2 ที่มี WS-I ที่catalogProductAdditionalAttributesEntityมีการใช้ (ซึ่งประกอบด้วยค่า single_data และ / หรือ multi_data ซึ่งรวมถึงคู่ของคีย์ / ค่าอีกครั้ง)

นี่คือ SOAPv2 WS-I ส่วนหนึ่งของ WSDL ซึ่งอธิบายรูปแบบของ extra_attributes:

<xsd:complexType name="associativeEntity">
   <xsd:sequence>
      <xsd:element name="key" type="xsd:string"/>
      <xsd:element name="value" type="xsd:string"/>
   </xsd:sequence>
</xsd:complexType>
<xsd:complexType name="associativeArray">
   <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="complexObjectArray" type="typens:associativeEntity"/>
   </xsd:sequence>
</xsd:complexType>

การตรวจสอบเพิ่มเติม/app/code/core/Mage/Catalog/Model/Product/Api/V2.php_attributes worded ปรับ แต่การตรวจสอบ single_data หรือ multi_data กลับเท็จเสมอ

การแก้ไขปัญหา:

ฉันพบปัญหา SOAP อื่นที่นี่ซึ่งคำตอบสุดท้ายคือทางออกของปัญหาของฉัน: /programming//a/9502311/865443 ) ดังนั้นฉันใส่บล็อกนี้ในรหัสของฉัน_prepareDataForSaveซึ่งแก้ไขปัญหาการตั้งค่าเพิ่มเติม _attributes:

if (gettype($productData->additional_attributes) == 'array') {
            foreach ($productData->additional_attributes as $k => $v) {
                    $_attrCode = $k;
                    $productData->$_attrCode = $v;
            }
  }

ฉันหวังว่านี่จะช่วยให้คนอื่นประสบปัญหาเดียวกัน ฉันขอขอบคุณคำอธิบายสำหรับความแตกต่างระหว่าง SOAPv2 และ SOAPv2 WS-I และ / หรือวิธีอื่น ๆ ที่แก้ไขปัญหานี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.