Mengapa salah satu dari banyak atribut tidak diperbarui dengan SOAPv2 WS-I?

18

Saya menggunakan Magento CE 1.7.0.2 dengan SOAPv2 dan WS-I. Saya mencoba memperbarui produk dengan catalogProductUpdate-Metode.

Deskripsi dalam contoh kode di bawah ini diperbarui, tetapi atribut pabrikan (= pilih) tidak. Hasilnya catalogProductUpdateadalah bool(true).

Saya mencoba beberapa variasi (tidak terlalu bagus, tapi saya putus asa ;-)) seperti:

  1. menetapkan nilai integer 777 untuk $manufacturer->valuemengatur nilai
  2. di dalam / tanpa bidang penambahan_atribut atur id produk (tapi saya yakin itu perlu diatur dalam penambahan_atribut)
  3. atur nama pabrikan sebagai $manufacturer->valueganti nilai 777

Kode:

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

Edit:

  • Saya mengujinya dengan SOAPv2 tanpa WS-I - berfungsi dengan baik.
  • Saya juga membuat atribut lain untuk pengujian dengan pengaturan yang sama (Dropdown, Scope, ...) yang juga tidak diperbarui dengan SOAPv2 WS-I tetapi dilakukan dengan SOAPv2. Jadi atribut yang baru dibuat ini berperilaku sebagai atribut produsen.
  • Mencoba mengatur nilai bidang teks di dalam penambahan_attributes juga tidak berfungsi.

Adakah ide, tautan, saran tentang ini?

Tautan: http://www.magentocommerce.com/api/soap/catalog/catalogProduct/catalog_product.update.html

Anna Völkl
sumber

Jawaban:

14

Saya akhirnya menemukan alasan untuk masalah dan solusinya:

Masalahnya: SOAPv2 dengan WS-I tidak menggunakan single_datadan multi_dataatribut. Karenanya check- /app/code/core/Mage/Catalog/Model/Product/Api/V2.phpin _prepareDataForSavegagal. Metode _prepareDataForSavememeriksa single_datadan multi_datayang keduanya bukan bagian dari SOAP-Call, menurut WSDL untuk SOAPv2 dengan WS-I.

SOAPv2 (WSDL) - catalogProductCreateEntity:

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

SOAPv2 dengan WS-I (WSDL) - catalogProductCreateEntity:

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

associativeArray adalah tipe associativeEntity yang mencakup pasangan kunci / nilai. Dalam SOAPv2 withous WS-I, catalogProductAdditionalAttributesEntitydigunakan (yang terdiri dari nilai-nilai single_data dan / atau multi_data yang lagi-lagi menyertakan pasangan kunci / nilai).

Ini adalah bagian SOAPv2 WS-I dari WSDL yang menguraikan format penambahan_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>

Pemeriksaan untuk penambahan_atribut /app/code/core/Mage/Catalog/Model/Product/Api/V2.phpworded baik, tetapi pemeriksaan untuk single_data atau multi_data selalu kembali palsu.

Solusinya:

Saya menemukan Masalah SABUN lainnya di sini di mana jawaban terakhir adalah solusi untuk masalah saya: /programming//a/9502311/865443 ). Jadi saya meletakkan blok ini dalam kode saya di _prepareDataForSavemana memecahkan masalah pengaturan nilai-nilai additional_attributes:

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

Saya harap ini membantu orang lain menghadapi masalah yang sama. Saya juga akan menghargai penjelasan untuk perbedaan ini antara SOAPv2 dan SOAPv2 WS-I dan / atau cara lain yang memecahkan masalah ini.

Anna Völkl
sumber