Hi Community, leider bin ich gerade so ziemlich am verzweifeln was das Abholen von Artikelinformationen über die lokale API betrifft. Die eingesetzte Shopware Version ist: 4.1.4 Build Rev 201312061433 Im System selbst sind zwei Shops eingerichtet. Hier ein kleines CodeSnippet, damit man sieht worum es eigentlich geht: $articleResource = MyResourceManager::getArticleResource(); $articleList = $articleResource-\>getList(0,0); $articleCount = $articleList['total']; $articleList = $articleResource-\>getList(0,$articleCount); foreach($articleList['data'] as $article) { $articleDetails = $articleResource-\>getOne($article['id']); // Hier rennt der Server schon beim ersten Artikel in einen Internal Server Error }
Leider habe ich keine Möglichkeit an die Server-Logs zu kommen um dort weitere Informationen zu beziehen. Es wird weder eine Exception geworfen, noch werden sonstige Informationen angezeigt. In diesem Zusammenhang bin ich durch die Klassen in Shopware gegangen und habe mich dort mal auf die Suche begeben. In der getOne() Funktion in Resource/Article.php gibt es folgenden Code-Block: if ($this-\>getResultMode() == self::HYDRATE\_ARRAY) { $query = $this-\>getManager()-\>createQuery('SELECT shop FROM Shopware\Models\Shop\Shop as shop'); $shops = $query-\>getArrayResult(); $translationReader = new \Shopware\_Components\_Translation(); foreach ($shops as $shop) { $translation = $translationReader-\>read($shop['id'], 'article', $id); if (!empty($translation)) { $translation['shopId'] = $shop['id']; $article['translations'][$shop['id']] = $translation; } } }
Es wird ein TranslationReader erzeugt, der eine Funktion read aufruft, in der als erster Parameter die Id des Shops mitgegeben wird. Jetzt guckt man sich die Funktion mal an. /\*\* \* Reads translation data from the storage. \* \* @param $language \* @param $type \* @param int $key \* @param bool $merge \* @return array \*/ public function read($language, $type, $key = 1, $merge = false) { if($type == 'variantMain') { $type = 'article'; } $sql = ' SELECT `objectdata` FROM `s_core_translations` WHERE `objecttype` = ? AND `objectkey` = ? AND `objectlanguage` = ? '; $data = Shopware()-\>Db()-\>fetchOne($sql, array( $type, $merge ? 1 : $key, $language )); return $this-\>unFilterData($type, $data, $merge ? $key : null); }
Es wird eine languageId erwartet, übergeben wird aber die Id des Shops. Kann es sein, dass hier noch ein Fehler vorliegt oder verstehe ich da was grundlegendes falsch? Leider kann ich auch keine Änderungen an den Resourcen Dateien vornehmen, da ich keinen Zugriff auf diese bekomme. Auf anderen Systemen (Single Shop) funktioniert dieser Aufruf einwandfrei. Gibt es dort generelle Probleme mit der API und Multishops oder muss man dort was grundlegendes beachten? Kann es vielleicht an Doctrine oder mit was auch immer der Datenbankzugriff erfolgt liegen? Über Informationen würde ich mich freuen. Beste Grüße, miralab
Da Reihe ich mich auch ein. Bin auch an den sprachrelevanten Daten pro Shop interessiert, auch über die lokale API. Genau das brauch ich auch … Selektierst Du mit der Liste vielleicht zuviel auf einmal? … Jedenfalls: Der read- Methode wird ja offensichtlich die Shop-ID übergeben. Diese ID wird bei dem SQL- select mit objectlanguage
verwendet … In objectlanguage
steht bei mir (in einem Standard Single-Shop Setup mit Hauptshop und Engl.) einmal „en“ und „2“. Bedeutet, in objectlanguage
steht offensichtlich weder die language- noch die Shop-ID? … Schöne Grüße, Niklas