Tại sao một trong nhiều thuộc tính không được cập nhật với SOAPv2 WS-I?


18

Tôi đang sử dụng Magento CE 1.7.0.2 với SOAPv2 và WS-I. Tôi đang cố gắng cập nhật sản phẩm với catalogProductUpdate-Method.

Mô tả trong ví dụ mã bên dưới được cập nhật, nhưng thuộc tính của nhà sản xuất (= select) thì không. Kết quả catalogProductUpdatebool(true).

Tôi đã thử một số biến thể (không quá tốt, nhưng tôi tuyệt vọng ;-)), chẳng hạn như:

  1. gán giá trị nguyên 777 để $manufacturer->valueđặt giá trị
  2. trong / không có trường thêm_attribut đặt id sản phẩm (nhưng tôi chắc chắn rằng nó cần được đặt trong thêm_attribut)
  3. đặt tên nhà sản xuất $manufacturer->valuethay vì giá trị 777

Mã số:

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

Chỉnh sửa:

  • Tôi đã thử nghiệm nó với SOAPv2 mà không có WS-I - hoạt động tốt.
  • Tôi cũng đã tạo một thuộc tính khác để thử nghiệm với cùng các cài đặt (Dropdown, Phạm vi, ...) cũng không được cập nhật với SOAPv2 WS-I nhưng thực hiện với SOAPv2. Vì vậy, các thuộc tính mới được tạo này hoạt động như thuộc tính của nhà sản xuất.
  • Cố gắng đặt giá trị của trường văn bản trong phần bổ sung cũng không hoạt động.

Bất kỳ ý tưởng, liên kết, đề xuất về điều này?

Liên kết: http : //www.magentoc Commerce.com/api/soap/catalog/catalogSub/catalog_product.update.html

Câu trả lời:


14

Cuối cùng tôi đã tìm thấy lý do cho vấn đề và giải pháp:

Vấn đề: SOAPv2 với WS-I không sử dụng các thuộc tính single_datamulti_data. Do đó, việc kiểm tra /app/code/core/Mage/Catalog/Model/Product/Api/V2.phptrong _prepareDataForSavethất bại. Phương thức _prepareDataForSavekiểm tra single_datamulti_datacả hai đều không phải là một phần của Cuộc gọi SOAP, theo WSDL cho SOAPv2 với WS-I.

SOAPv2 (WSDL) - danh mục sản phẩmCreateEntity:

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

SOAPv2 với WS-I (WSDL) - danh mục sản phẩmCreateEntity:

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

AssociativeArray có kiểu AssociativeEntity bao gồm các cặp khóa / giá trị. Trong SOAPv2 withous WS-I, catalogProductAdditionalAttributesEntityđược sử dụng (bao gồm các giá trị single_data và / hoặc multi_data, một lần nữa bao gồm các cặp khóa / giá trị).

Đây là phần SOAPv2 WS-I của WSDL mô tả định dạng của Extra_attribut:

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

Việc kiểm tra /app/code/core/Mage/Catalog/Model/Product/Api/V2.phpthêm_attribution đã diễn đạt tốt, nhưng kiểm tra cho single_data hoặc multi_data luôn trả về false.

Giải pháp:

Tôi đã tìm thấy một vấn đề SOAP khác ở đây , nơi câu trả lời cuối cùng là giải pháp cho vấn đề của tôi: /programming//a/9502311/865443 ). Vì vậy, tôi đặt khối này vào mã của mình _prepareDataForSaveđể giải quyết vấn đề đặt các giá trị Extra_attribut:

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

Tôi hy vọng điều này sẽ giúp người khác gặp phải vấn đề tương tự. Tôi cũng sẽ đánh giá cao một lời giải thích cho sự khác biệt này giữa SOAPv2 và SOAPv2 WS-I và / hoặc các cách khác đã giải quyết vấn đề này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.