Beim Versuch, unsere Magento-Schnittstelle zum GB Soft Warenwirtschaftssystem um die Erstellung von Produktkategorien zu erweitern, stieß ich auf folgenden Fehler:
Uncaught SoapFault exception: [103] Attribute "include_in_menu" is required
Nichts ungewöhnliches, dachte ich im ersten Moment. Beim näheren Blick auf die WSDL fiel mir jedoch sofort auf, dass ein Attribut mit dem Namen "include_in_menu" gar nicht vorgesehen ist! Ein bereits im Vorhinein zum Scheitern verurteilter Versuch, das Attribut trotzdem in den Request aufzunehmen, misslang natürlicherweise.
Bug oder Feature?
Dass die Arbeit mit der SOAP v2 Schnittstelle von Magento rauchende Köpfe verursachen kann, ist mir seit der ersten Auseinandersetzung damit bekannt. Dieses Problem roch aber von Anfang an sehr stark nach einem Bug. Dieser Eintrag im Magento-Forum bestätigte dann auch sogleich meinen Verdacht: es handelt sich um einen Fehler in der aktuellen Magento-Version!
Im erwähnten Forumeintrag wurden auch gleich folgende Workarounds vorgeschlagen, um das Problem bis zum offiziellen Bugfix zu beseitigen:
You have 4 ways.
First - Change app/code/core/Mage/Catalog/etc/wsdl.xml after line 188 add
<element name="include_in_menu" type="xsd:int" minOccurs="0" />
Second - Change logic of Api Model app/code/core/Mage/Catalog/Model/Category/Api/V2.php in code add this attribute to the new object.
Third - Report bug to the magento and wait until it resolved (near 1-2 month)
Fourth - And least create you extension where you just override app/code/core/Mage/Catalog/etc/wsdl.xml add your paramters to the WSDL file, change API model in your extensions for additional parameters.
My proposal use 4th way.
Ich werde das gleich mal ausprobieren!
und noch ein Fehler!
Kaum war der erste Fehler korrigiert, tauchte die nächste Fehlermeldung auf:
Uncaught SoapFault exception: [103] Attribute "available_sort_by" is required
Dieses Attribut existiert zwar in der WSDL, hat aber die falsche Signatur. Laut WSDL wird ein Array von String-Werten erwartet. Seit Version 1.4 verwaltet Magento dieses Attribut scheinbar nicht mehr als Array, sondern als komma-getrennten String. Auf das Webservice wurde aber offensichtlich komplett vergessen. Weder wird im Endpoint das Array auf einen String umgemappt, noch wurde die WSDL angepasst. Dh diese Änderung muss dann auch wieder manuell durchgeführt werden!
Den entscheidenden HInweis dafür habe ich wieder einmal im Magentoforum gefunden: http://www.magentocommerce.com/boards/v/viewthread/48184/#t163088
PHP WSDL Cache leeren
Zu guter letzt noch ein wichtiger Hinweis: wenn Sie die WSDL angepasst haben und danach immer noch die gleiche Fehlermeldung auftritt, sollten Sie sich vergewissern, dass Ihnen der WSDL-Cache von PHP nicht einen Strich durch die Rechnung macht. Standardmäßig wird die WSDL nämlich gecached. Gerade, wenn man den Type eines Attributs anpasst, kann das zu Problemen führen. Aus diesem Grund sollten Sie vorübergehend den WSDL-Cache abdrehen:
ini_set("soap.wsdl_cache_enabled", "0");
Ich finde es ehrlich gesagt eine Frechheit von Varien, dass man so schleißig mit solchen Bugs umgeht. Sowas müsste IMHO sofort auffallen, würde man die API vor einem Release auch nur ein einziges mal testen.
Jetzt haben wir die 1.5.0.1er Version und der Bug ist immer noch da.
Danke jedenfalls für das Teilen deiner Erfahrungen in diesem Blog-Post!
Gern geschehen :)
Leider kommt mir das auch so vor, dass sie den v2 Webservice entwickelt, einmal getestet und dann nie wieder angegriffen haben. Unbeachtet dessen, dass Veränderungen im Model dann zu Problemen mit dem Webservice führen können. Neue Features gehen scheinbar vor, Bugs ausbessern scheint da eine niedrigere Priorität zu haben.
Was ich aber noch schlimmer finde, sind die teils folgenreichen Änderungen im Model selbst bei kleinen Versionssprüngen. Ehrlichgesagt traue ich mir kein Magento-Update zu machen, wenn das Ding einmal läuft. Auch dann nicht, wenn man Module und Template sauber mit Overriding erstellt hat und nicht in den core-Files rumgepfuscht hat...