Guten Tag, seit kurzem arbeite ich daran, Shopware so an meine Bedürfnisse anzupassen, dass z.B. auch die vorhandenen Daten optimal importiert werden. Dabei ist mir aufgefallen, dass die Import-API einen Fall nicht vorsieht, der im Backend bei manueller Artikelerfassung durchaus möglich ist: Nämlich einer Filter-Option mehrere, über Pipe-Zeichen getrennte Einträge zuzuordnen. (Vgl. Shopware-Wiki) Ich habe mir die dafür verantwortliche Datei (/engine/connectors/api/import/shopware.php) mal genauer angesehen und festgestellt, dass das dort verwendete Verfahren einerseits nicht mehrere Eigenschaften für eine Option erlaubt und außerdem möglicherweise Probleme verursacht, wenn es mit bereits manuell angelegten Mehrfach-Eigenschaften konfrontiert wird. Deswegen habe ich mich dazu entschlossen, die Funktion sArticleAttributeGroup neu zu schreiben und mein Ergebnis hier zur Verfügung zu stellen. Im Prinzip gehe ich nun so vor, dass zunächst alle bestehenden Eigenschaftszuordnungen des übergebenen Artikels gelöscht werden und anschließend die neuen Values angelegt werden. Die Funktion eignet sich somit also nicht zum Hinzufügen von Werten, sondern nur zur vollständigen Neuerstellung. Außerdem habe ich auf den Subshop(Multilanguage)-Teil verzichtet, da ich diesen nicht nutze. Um Mehrfachwerte zu übergeben, werden diese einfach entweder wie im Backend mit Pipe | getrennt oder als Array übergeben. Hier die Funktion, in der Hoffnung, dass sie auch anderen von Nutzen ist: /\*\* \* Insert an article attribute group \* \* Fundamentally changed to allow for multiple entries \* for a single option, as allowed by backend functionality \* For multiple entries, either use pipe-delimited strings \* or an array. \* \* Both of the following formats work the same: \* \* $import-\>sArticleAttributeGroup( \* array( \* "ordernumber"=\>"12345", \* "attributegroupID"=\>1, \* "values"=\> array( \* 1=\>array("Wert 1","Wert 2"), \* 2=\>"Wert 3" \* ), \* ) \* ); \* \* $import-\>sArticleAttributeGroup( \* array( \* "ordernumber"=\>"12345", \* "attributegroupID"=\>1, \* "values"=\> array( \* 1=\>"Wert 1|Wert 2", \* 2=\>"Wert 3" \* ), \* ) \* ); \* \* \* @param int|array $article \* @return bool \*/ function sArticleAttributeGroup ($article) { if(empty($article)||!is\_array($article)) return false; $article["articleID"] = $this-\>sGetArticleID($article); if(empty($article["articleID"])) return false; // First change: Delete all existing attribute group values for this article $this-\>sDeleteArticleAttributeGroup((int)$article["articleID"]); // Second change: If no attributegroupID or values are provided, that's it if(empty($article["attributegroupID"]) OR empty($article["values"])) { return; } // Update filtergroupID in table s\_articles for this article (unchanged) $sql = "UPDATE s\_articles SET filtergroupID=? WHERE id=?"; $this-\>sDB-\>Execute($sql, array($article["attributegroupID"], $article["articleID"])); // Third change: Insert new values from article $sql = "INSERT INTO s\_filter\_values (groupID, optionID, articleID, value) VALUES (?, ?, ?, ?)"; foreach($article["values"] as $key =\> $values) { if(!is\_array($values)) { $values = explode('|', $values); }; foreach($values as $value) { $this-\>sDB-\>Execute($sql,array( $article["attributegroupID"], $key, $article["articleID"], $this-\>sValDescription($value) )); } } return true; }
Schließlich ist mir bei alldem auch noch ein Bug in der Funktion sDeleteArticleAttributeGroupValues aufgefallen. In der ersten Zeile sollte sichergestellt werden, dass $articleID als Integer übergeben wird: $articleID = $this-\>sGetArticleID((int)$articleID);
Was mir nicht ganz klar ist, ist allerdings, ob ich diese Änderungen auch in einem Plugin o.ä. unterbringen kann, statt die Coredatei zu verändern. Da würde ich mich über Hinweise freuen.