Shopware 4.0.2 verfügbar

Hallo zusammen, Shopware 4.0.2 ist nun verfügbar: Das Update-Paket & weitere Infos zum Update findet ihr unter: http://wiki.shopware.de/_detail_918_454.html Wichtig bei der Installation des Updates - unbedingt an das Ausführen der SQL-Befehle denken! [*] Die Installationsversion ist auf unserer Download-Seite ebenfalls bereits auf 4.0.2 aktualisiert. http://www.shopware.de/wiki/Downloads_cat_448.html Das UwAmp-Package und das VMware-Image werden am Montag 17.07. auf Basis 4.0.2 bereitgestellt. [*] Darüber hinaus steht Shopware 4 nun täglich aktuell (= Aktuelle Entwicklungsversion) auch auf Github zur Verfügung. Shopware 4 auf Github https://github.com/ShopwareAG/shopware-4

Guten Abend, soeben das Update gemacht, SQL gibt einen Fehler aus: Fehler SQL-Befehl: RENAME TABLE s_emotion TO s_emotion_backup; MySQL meldet: #1017 - Can’t find file: ‘./usrdb_babonorr/s_emotion.frm’ (errno: 2) Erste Hilfe?

Frontend folglich nicht korrekt darstellbar, Footer verschossen: Ups! Ein Fehler ist aufgetreten! Die nachfolgenden Hinweise sollten Ihnen weiterhelfen. SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘usrdb_babonorr.s_emotion’ doesn’t exist in Doctrine/DBAL/Connection.php on line 628 Stack trace: #0 Doctrine/DBAL/Connection.php(628): PDOStatement->execute() #1 Doctrine/ORM/Query/Exec/SingleSelectExecutor.php(46): Doctrine\DBAL\Connection->executeQuery(‘SELECT s0_.id A…’, Array, Array, NULL) #2 Doctrine/ORM/Query.php(260): Doctrine\ORM\Query\Exec\SingleSelectExecutor->execute(Object(Doctrine\DBAL\Connection), Array, Array) #3 Doctrine/ORM/AbstractQuery.php(595): Doctrine\ORM\Query->_doExecute() #4 Doctrine/ORM/AbstractQuery.php(432): Doctrine\ORM\AbstractQuery->execute(Array, 2) #5 Shopware/Controllers/Widgets/Emotion.php(50): Doctrine\ORM\AbstractQuery->getArrayResult() #6 Shopware/Controllers/Widgets/Emotion.php(106): Shopware_Controllers_Widgets_Emotion->getEmotion(Object(Shopware_Proxies_ShopwareModelsEmotionRepositoryProxy)) #7 Enlight/Controller/Action.php(135): Shopware_Controllers_Widgets_Emotion->indexAction() #8 Enlight/Controller/Dispatcher/Default.php(521): Enlight_Controller_Action->dispatch(‘indexAction’) #9 Enlight/Template/Plugins/function.action.php(94): Enlight_Controller_Dispatcher_Default->dispatch(Object(Enlight_Controller_Request_RequestHttp), Object(Enlight_Controller_Response_ResponseHttp)) #10 cache/templates/compile/frontend_emotion_turquoise_de_DE_1/b3/bd/a3/b3bda3df3518bf69c22fbe405bc7ad1d8f3f6468.snippet.index.tpl.php(415): smarty_function_action(Array, Object(Enlight_Template_Default)) #11 Smarty/sysplugins/smarty_internal_templatebase.php(180): content_50536a0bec1618_96040331(Object(Enlight_Template_Default)) #12 Enlight/View/Default.php(266): Smarty_Internal_TemplateBase->fetch() #13 Enlight/Controller/Plugins/ViewRenderer/Bootstrap.php(212): Enlight_View_Default->render(Object(Enlight_Template_Default)) #14 Enlight/Controller/Plugins/ViewRenderer/Bootstrap.php(238): Enlight_Controller_Plugins_ViewRenderer_Bootstrap->renderTemplate(Object(Enlight_Template_Default)) #15 Enlight/Controller/Plugins/ViewRenderer/Bootstrap.php(136): Enlight_Controller_Plugins_ViewRenderer_Bootstrap->render() #16 [internal function]: Enlight_Controller_Plugins_ViewRenderer_Bootstrap->onPostDispatch(Object(Enlight_Event_EventArgs)) #17 Enlight/Event/Handler/Default.php(91): call_user_func(Array, Object(Enlight_Event_EventArgs)) #18 Enlight/Event/EventManager.php(156): Enlight_Event_Handler_Default->execute(Object(Enlight_Event_EventArgs)) #19 Enlight/Controller/Action.php(147): Enlight_Event_EventManager->notify(‘Enlight_Control…’, Array) #20 Enlight/Controller/Dispatcher/Default.php(521): Enlight_Controller_Action->dispatch(‘indexAction’) #21 Enlight/Controller/Front.php(214): Enlight_Controller_Dispatcher_Default->dispatch(Object(Enlight_Controller_Request_RequestHttp), Object(Enlight_Controller_Response_ResponseHttp)) #22 Shopware/Bootstrap.php(79): Enlight_Controller_Front->dispatch() #23 Enlight/Application.php(192): Shopware_Bootstrap->run() #24 shopware.php(74): Enlight_Application->run() #25 {main}

Hast du die update.sql aus dem Package ausgeführt oder die SQL-Anweisungen manuell aus dem Artikel kopiert? Von welcher Version hast du aktualisiert ? 4.0.0 oder 4.0.1? Hast du ggf. beim rauskopieren Teile des SQL-Updates übersehen oder aber das Delta mehrfach ausgeführt und bereits vorher einen anderen Fehler erhalten? Du kannst im Zweifelsfall die Tabelle mit folgendem SQL-Befehl wiederherstellen: CREATE TABLE IF NOT EXISTS `s_emotion` ( `id` int(11) NOT NULL AUTO\_INCREMENT, `active` int(1) NOT NULL, `name` varchar(255) COLLATE utf8\_unicode\_ci NOT NULL, `cols` int(11) DEFAULT NULL, `cell_height` int(11) NOT NULL, `article_height` int(11) NOT NULL, `container_width` int(11) NOT NULL, `rows` int(11) NOT NULL, `valid_from` datetime DEFAULT NULL, `valid_to` datetime DEFAULT NULL, `userID` int(11) DEFAULT NULL, `show_listing` int(1) NOT NULL, `is_landingpage` int(1) NOT NULL, `landingpage_block` varchar(255) COLLATE utf8\_unicode\_ci NOT NULL, `landingpage_teaser` varchar(255) COLLATE utf8\_unicode\_ci NOT NULL, `seo_keywords` varchar(255) COLLATE utf8\_unicode\_ci NOT NULL, `seo_description` text COLLATE utf8\_unicode\_ci NOT NULL, `create_date` datetime DEFAULT NULL, `template` varchar(255) COLLATE utf8\_unicode\_ci NOT NULL, `modified` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8\_unicode\_ci AUTO\_INCREMENT=1; Alternativ einmal über PHPMyAdmin schauen, ob es ein Backup der Tabelle unter s_emotion_backup gibt, falls ja, dieses einfach in s_emotion umbenennen! Eigentlich kann der Fehler aber nur auftreten, wenn das SQL-Delta nicht in einem Rutsch ausgeführt worden ist!

Update lief bei mir glatt durch und hat sogar die Suche repariert, die bei mir vorher äußerst instabil war (funktionierte nur 1x nach Cacheleerung und dann kam ein SQL-Fehler). Außerdem funktioniert nun auch die Generierung von über 4000 Varianten (führte bei mir bisher zu einer Erfolgmeldung nebst leerer Varianten-Liste). Also mich habt ihr mit dem Update (noch) glücklich(er) gemacht, danke! :thumbup:

1 „Gefällt mir“

Und ich dachte ich bräuchte hier bei Shopware keinen Programmierer. :frowning: Ich habe das Update laufen lassen von 4.0.1 zu 4.0.2. Habe zunächst die Zeilen manuell kopiert, bin mir aber sicher nichts vergessen zu haben. Nach der Fehlermeldung habe ich dann die Datei eingespielt. Auch Fehlermeldung. Nun habe ich Deine Wiederherstellung genutzt. Lief einwandfrei durch. Nun existiert auch ein s_emotion Eintrag. Ist denn nun alles fertig?

Ich habe auch das Update gemacht und hatte diesen Fehler. Ebenfalls nutze ich die Reparatur, jedoch kann ich nun keine Einkaufswelten mehr anlegen bzw. werden die angelegten nicht mehr angezeigt. Ist dies bei euch auch so?

So weit sind wir noch gar nicht. Wir richten alles ein um das System dann dem Designer zu übergeben der dann solche Sachen wie die Einkaufswelten für uns erledigt. Trotzdem will ich natürlich dass das Ding richtig läuft ehe wir es weitergeben und hoffe auf eine schnelle Antwort von SW, am besten noch vorm Wochenende. Die Armen.

Update erfolgreich ausgeführt! Vielen Dank SW-Team Ein Problem habe ich jedoch, wobei das auch in der 4.0.1 schon war. Ich habe in den Artikel Varianten z.B. eine Farbe “Blau” dort steht dann inFeld “Zusätzlicher Text” “Blau” im Artikel wird aber dieser Zusätzliche Text nicht im Titel angezeigt! Ist das ein Bug oder sttehe ich auf der Leitung?

@BabyRossa Das sollte soweit dann bei dir passen. @Knidux Kommt irgendein Fehler beim Anlegen der Einkaufswelt? Der u.g. Befehlt erzeugt die Tabelle ja neu, ohne Daten. Wie bist du genau beim Ausführen der SQL-Befehle vorgegangen? Kannst du das kurz beschreiben?

1 „Gefällt mir“

@Stefan Hamann Ich habe das Update ganz normal ausgeführt einmal mit der sql Datei und einmal als Befehl um zu sehen ob es daran liegt…. Bei beiden entstand jedes Mal der Fehler (das s_emation nicht mehr da war). Diesbezüglich habe ich dann den Reparatur Befehl ausgeführt, wodurch im Frontend soweit alles wieder funktioniert. Als ich nun die Einkaufswelt neu anlegte, da diese nun nicht mehr da war, wurde dies ganz normal ohne Fehler gemacht. Jedoch Ohne das sie im Frontend angezeigt wird.

Hast du die Möglichkeit mal einen Screenshot von deinen Tabellen in PHPMyAdmin einzustellen - nur die Tabellen die mit s_emotion anfangen - Weißt du zufällig welche MySQL-Version du im Einsatz hast? Ansonsten wg. dem Problem mit der neu angelegten Einkaufswelt - prüfe mal, ob die wirklich aktiv ist und die Einstellungen soweit alle passen - ich vermute mal das dort der Fehler liegt.

Hi! Wie funktioniert denn nun „SW-3694 - Alte (Pre 4.0) API auf neue Datenbank-Struktur migriert“ ? Ich habe mein Importscript von 3.5.6 aufrufen wollen, bekomme aber nur eine weisse Seite ohne Fehlermeldungen. Bitte um Unterstützung. Ich bräuchte das, um Kategorien und Artikel aus einer anderen Datenbnak zu importieren. Der manuelle Import übers Backend bringt mir daher wenig und die REST API lackt ja momentan an dem fehlendem Kategorieimport. Beste Grüße!

Kannst du dein Import-Script hier mal einstellen?

Gerne: [code]<?php /**
*
*

  • @author markus.h
  • @version 1
  • @copyright
  • @package default
    */

error_reporting(E_ALL);

class Import {
private $api;
private $import;
private $rootCatDE;
private $rootCatEN;
private $catMap;

public function __construct() {
	require_once('../api/api.php');
	$this->api = new sAPI(); $this-\>import =& $this-\>api-\>import-\>shopware; $this-\>rootCatDE = 3; $this-\>rootCatEN = 4; } public function importCategories() { $kategorien = $this-\>api-\>sDB-\>GetAll("SELECT \* FROM kategorien"); $result = array(); $this-\>import-\>sCategory(array("id"=\>$this-\>rootCatDE,"parent"=\>1,"description"=\>"Deutsch")); $this-\>import-\>sCategory(array("id"=\>$this-\>rootCatEN,"parent"=\>1,"description"=\>"Englisch")); foreach($kategorien as $kategorie) { $arr\_category = array( "id" =\> (int) $kategorie['ID']\*10, "parent" =\> (int) $kategorie['ParentID'] === 0 ? (int) $this-\>rootCatDE : $kategorie['ParentID']\*10, "description" =\> $kategorie['KatName'], "ac\_attr1" =\> $kategorie['KatalogCodeID'] ); $result[$this-\>import-\>sCategory($arr\_category)] = $kategorie['KatalogCodeID']; } foreach($kategorien as $kategorie) { $arr\_category = array( "id" =\> (int) $kategorie['ID']\*100, "parent" =\> (int) $kategorie['ParentID'] === 0 ? (int) $this-\>rootCatEN : $kategorie['ParentID']\*100, "description" =\> $kategorie['KatName\_Engl'], "ac\_attr1" =\> $kategorie['KatalogCodeID'] ); $result[$this-\>import-\>sCategory($arr\_category)] = $kategorie['KatalogCodeID']; } $this-\>catMap = $result; } public function importArticles() { echo "

"; $xml = simplexml\_load\_file('data/s\_articles.xml'); $pricesXML = simplexml\_load\_file('data/s\_prices.xml'); $arrPrices = array(); foreach ($pricesXML as $prices) { $arrPrices[(string) $prices-\>ordernumber] = (string) $prices-\>price; } $article\_data = array(); foreach($xml-\>articles as $article) { $article\_data = array( "name" =\> (string) utf8\_decode($article-\>name), "ordernumber" =\> (string) $article-\>ordernumber, "supplier" =\> (string) $article-\>supplier, "description" =\> (string) utf8\_decode( $article-\>description ), "description\_long" =\> (string) utf8\_decode($article-\>description\_long ), "pseudosales" =\> (string) $article-\>pseudosales, "added" =\> substr((string) $article-\>added,0,4).'-'.substr((string) $article-\>added,4,2).'-'.substr((string) $article-\>added,6,2), "changed" =\> substr((string) $article-\>changed,0,4).'-'.substr((string) $article-\>changed,4,2).'-'.substr((string) $article-\>changed,6,2), "taxID" =\> 4, "minpurchase" =\> (string) $article-\>minpurchase, "unitID" =\> 9, "weight" =\> (string) $article-\>weight, "attr1" =\> (string) utf8\_decode( $article-\>attr1 ), "attr2" =\> (string) utf8\_decode( $article-\>attr2 ) ); $importedArticle = $this-\>import-\>sArticle($article\_data); $artKats = explode(";",$article-\>KatCodesIDs); foreach($artKats as $artKat) { foreach($this-\>catMap as $key =\> $cat) { if($artKat === $cat){ $this-\>import-\>sArticleCategory ($importedArticle["articleID"], $key); //print\_r($return); } } } // MAP IMAGES $filename = '../../../../tl\_files/Covers/' . strtolower((string) $article-\>ordernumber) . '.jpg'; if(file\_exists($filename)) { $imageId = $this-\>import-\>sArticleImage( array( "image"=\> $filename, "articleID"=\> $importedArticle["articleID"] )); $this-\>import-\>sDeleteOtherArticleImages($importedArticle["articleID"],array($imageId)); } // MAP PRICES $price = array( "articledetailsID" =\> $importedArticle['articledetailsID'], "pricegroup" =\> "EK", "price" =\> $arrPrices[(string) $article-\>ordernumber], "from"=\>1, "tax"=\>7 ); $this-\>import-\>sArticleAttributeGroup( array( "articleID"=\>$importedArticle['articleID'], "attributegroupID"=\>1, "values"=\> array( 1 =\> (string) utf8\_decode( $article-\>attr1 ), 2 =\> (string) utf8\_decode( $article-\>attr2 ) )/\*, "values\_en"=\> array( 1=\>"Value 1", 2=\>"Value 2" )\*/ ) ); $this-\>import-\>sArticlePrice($price); } echo "fertig"; //print\_r($this-\>catMap); //print\_r($article\_data); } } $importAction = new Import(); $importAction-\>importCategories(); $importAction-\>importArticles(); [/code]

Hallo nochmals. Ich bin jetzt auf euren Beitrag Custom API in Shopware 4.0.2 gestoßen. Da ist alles genau erklärt. Kenn mich jetzt aus. Danke trotzdem für den tollen Support.

Hallo nochmals. Wie es aussieht kann ich einer Kategorie keine eigene id vergeben. Die Tabelle s_categories inkrementiert ID’s, was es schwierig macht parent und child aus einer custom db zusammenzubringen. Über den Backend Import per CSV-Datei können ID’s vergeben werden. Wie soll das funktionieren? Beste Grüße!

Hallo Markus, im Import/Export-Modul wird dazu der IdGeneratorType auf None gesetzt. Damit könnte man auch hier arbeiten und die ID dann via „id“ als Parameter übergeben. Das könnte wie folgt aussehen: $metaData = Shopware()-\>Models()-\>getMetadataFactory()-\>getMetadataFor('Shopware\Models\Category\Category'); $metaData-\>setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR\_TYPE\_NONE); $result = $resource-\>sCategory(array( 'description' =\> "test", 'id' =\> 71, 'position' =\> 1 )); Du musst dabei natürlich im Auge haben, dass du dir damit auch die Probleme einfängst, die man durch Auto-Increment vermeiden will - etwa kollidierende IDs. Wenn du im selben Request noch weiter mit den Kategorien arbeitest, kann es nötig sein, den Generator-Type wieder zurück zu stellen (i.d.R. GENERATOR_TYPE_IDENTITY). Ich würde hier also wirklich eine gewisse Vorsicht walten lassen und es nicht ohne Sicherung testen. Ich habe sCategory einige Male durchgetestet - aber das Setzen von Primär-IDs war dabei eigentlich nicht vorgesehen :). Eine alternative Lösung, mit der man die Auto-IDs nicht aushebelt, wäre das rekursive Durchlaufen des Kategorien-Baums. Dabei könntest du ein Mapping anlegen, bei dem die neuen und alten IDs einander zugeordnet werden. Da wir in den meisten Models gar keine Setter für IDs mehr haben, dürfte diese Variante auch die generischere sein. lG Daniel

Hallo Daniel, vielen Dank für deine ausführliche Antwort. Ja die Sache mit der fix übergebenen ID ist nicht sehr schön, doch ich wollte das Testscript von 3.5.6 in SW4 übernehmen, damit ich unserem Kunden das Update auf V4 mit importierten Produkten zeigen kann. In zukunft werde ich wohl auf eine sauberere Variante zurückgreifen. Eine Frage habe ich aber noch. Wie kann ich Attribute zu Kategorien hinzufügen? Mit dem alten Parameter ac_attr1 dürfte es nicht funktionieren? Viele Grüße, Markus

Ja, ist richtig, ist mir bei der Anpassung wohl durchgerutscht. /\*\* \* New method to create categories \* @param array $category \*/ function sCategory($category = array()) { // In order to be compatible with the old API syntax but to also be able to use -\>fromArray(), // we map from the old keys to doctrine keys $mappings = array( 'description' =\> 'name', 'cmsheadline' =\> 'cmsHeadline' ); foreach($mappings as $original =\> $new) { if(isset($category[$original])) { $category[$new] = $category[$original]; unset($category[$original]); } } $categoryRepository = $this-\>getCategoryRepository(); // If user wants to update the category if($category['updateID']) { $model = $categoryRepository-\>find((int) $category['updateID']); if($model === null) { $this-\>sAPI-\>sSetError("Category {$category['updateID']} not found", 10405); return false; } $model-\>fromArray($category); Shopware()-\>Models()-\>persist($model); Shopware()-\>Models()-\>flush(); // Create a new category }else{ if(isset($category['parent'])) { $parentModel = $categoryRepository-\>find((int) $category['parent']); if($parentModel === null) { $this-\>sAPI-\>sSetError("Parent category {$category['parent']} not found", 10406); return false; } // $category['parent'] = $parentModel; } $model = new \Shopware\Models\Category\Category(); $model -\>fromArray($category); $model-\>setParent($parentModel); Shopware()-\>Models()-\>persist($model); Shopware()-\>Models()-\>flush(); } // set categories $upset = array(); for ($i=1;$i\<=6;$i++) { if(isset($category['ac\_attr'.$i])) { $upset['attribute'.$i] = (string)$category['ac\_attr'.$i]; } elseif(isset($category['attr'][$i])) { $upset['attribute'.$i] = (string)$category['attr'][$i]; } } if(!empty($upset)) { $attributeID = Shopware()-\>Db()-\>fetchOne("SELECT id FROM s\_categories\_attributes WHERE categoryID=?", array($model-\>getId())); if($attributeID === false) { $upset['categoryID'] = $model-\>getId(); Shopware()-\>Db()-\>insert('s\_categories\_attributes', $upset); }else{ Shopware()-\>Db()-\>update('s\_categories\_attributes', $upset, array('categoryID = ?' =\> $model-\>getId()) ); } } return $model-\>getId(); } Auf die Schnelle könnte man die Funktion sCategory in engine/Shopware/Plugins/Default/Core/Api/Components/import.php wie oben beschrieben abändern. Ohne die Änderung wird es wohl nicht gehen, sry. lG Daniel