Shopware AG Shopware 4.1 Kategorien Erstellt für: Stefan Hamann Erstellt von: Oliver Denter 28. Mai 2013 Shopware AG Eggeroderstrasse 6 48624 Schöppingen Shopware AG Neue Kategorie Struktur Mit der Shopware 4.1 existieren nun zwei Tabellen für die Speicherung der Kategorie Struktur. s_articles_categories s_articles_categories_ro Diese Tabelle ist für die Schreibzugriffe für Kategorie - Artikel Diese Tabelle beinhaltet die Artikel - Kategorie Zuordnung Zuordnungen zuständig. Wenn ein Artikel einer Leaf- denormalisiert. Sobald ein Artikel zu einer Kategorie Kategorie hinzugefügt wird, wird in dieser Tabelle ein neuer zugewiesen wird, wird für jede Parent-Kategorie ein Eintrag für die Zuordnung gespeichert. Eintrag in diese Tabelle geschrieben. Als Anschließend werden aus den hier gespeicherten Daten die Denormalisierten Daten für die s_articles_categories_ro Tabelle generiert. Über Doctrine sind diese Daten wie folgt erreichbar: $category->getArticles(); $article->getCategories(); „parentCategoryID“ wird die ID der Leaf-Kategorie gespeichert. In dem obigen Screenshot wurde der Artikel „2“ der LeafKategorie „14“ zugewiesen. In der s_articles_categories wird für diese Zuordnung nur der Eintrag mit der Artikel ID 2 und der Kategorie ID 14 gespeichert. In der Denormalisierten Tabelle werden zusätzlich die Kategorie IDs 3 und 5 zu diesem Artikel gespeichert, da Neue Zuweisungen können daher wie folgt gespeichert diese beiden Kategorien Parent-Kategorien der Kategorie werden: 14 sind. $entityManager = Shopware()->Models(); $category = $entityManager->getReference( „Shopware\Models\Category\Category“, $categoryId ); $article->addCategory($category); Über Doctrine sind diese Daten wie folgt erreichbar: $category->getAllArticles(); $article->getAllCategories(); Hier werden jedoch direkt Array Daten zurück gegen um zu verhindern, dass die Daten über diese Funktionen modifiziert werden. Shopware 4.1 Kategorien 1 Shopware AG Neue Kategorie Daten erstellen Solange die Artikel Kategorie Zuordnung oder das Erstellen, Löschen oder Verschieben einer Kategorie über die Doctrine Models angestoßen werden, muss der Benutzer / Programmierer sich nicht um die Denormalisierung der Daten oder den Kategorie Pfad kümmern. Sollte der Benutzer / Programmierer jedoch über plain SQL arbeiten muss er die Generierung der Daten selbst anstoßen. Neue Kategorie - Artikel Zuordnungen erstellen $sql = „ INSERT INTO s_articles_categories (articleID, categoryID) VALUES (:articleId, :categoryId) “; Shopware()->Db()->query($sql, array( ,articleId‘ => $articleId, ,categoryId‘ => $categoryId ); $component = Shopware()->CategoryDenormalization(); $component->addAssignment($articleId, $categoryId); Kategorie - Artikel Zuordnung löschen $sql = „DELETE FROM s_articles_categories WHERE categoryID = :categoryId“; Shopware()->Db()->query($sql, array(,categoryId‘ => $categoryId); $component = Shopware()->CategoryDenormalization(); $component->removeAssignment($articleId, $categoryId); Neue Unterkategorie erstellen $parentId = 10; $sql = „INSERT INTO s_categories (name, parent, ...) VALUES (:name, :parent, ...) Shopware()->Db()->query($sql, array( ,name‘ => $name, ,parent‘ => $parentId, ... ); $categoryId = Shopware()->Db()->lastInsertId('s_categories'); $component = Shopware()->CategoryDenormalization(); $component->rebuildCategoryPath($categoryId); Unterkategorie löschen Shopware()->Db->query(„DELETE FROM s_categries WHERE id = :id“, array( ,id‘ => $categoryId ); $component = Shopware()->CategoryDenormalization(); $component-> removeCategoryAssignmentments($categoryId); Shopware 4.1 Kategorien 2 Shopware AG Kategorie Artikel selektieren Die Selektierung von Kategorie Artikeln über Doctrine funktioniert nun wie folgt: $builder = Shopware()->Models()->createQueryBuilder(); $builder->select(array(‘articles‘)) $builder->from(‘Shopware\Models\Article\Article‘, ‘articles‘); $builder->innerJoin(‘articles.allCategories‘, ‘allCategories‘) $builder->where(‘allCategories = :categoryId‘); $builder->setParameter(‘categoryId‘, $categoryId); Die Selektierung von Kategorie Artikeln über plain SQL funktioniert nun wie folgt: $sql = “ SELECT articles.* FROM s_articles_categories_ro articleCategories INNER JOIN s_articles articles ON articles.id = articleCategories.articleID AND articles.active = 1 INNER JOIN s_categories categories ON categories.id = articleCategories.categoryID AND categories.active = 1 WHERE articleCategories.categoryID = :categoryID “; $articles = Shopware()->Db()->fetchAll($sql, array(,categoryId‘ => $categoryId)); Shopware 4.1 Kategorien 3 Shopware AG Unterkategorien auslesen Mit der Shopware 4.0.* war es durch die NestedSet Gedmo Extension möglich, alle Unterkategorien einer bestimmten Kategorie auszulesen. Damit diese Möglichkeit weiterhin besteht wurde das Feld „path“ in der s_categories hinzugefügt. Dieses Feld beinhaltet für jede Kategorie den vollständigen Pfad bis hin zur Shop-Haupt-Kategorie. Als Identifier wird hier die ID der entsprechenden Parent-Kategorie gespeichert. So werden für die Kategorie Edelbrände (ID 14) die IDs der Kategorien: „Tees und Zubehör“ + „Genusswelten“ + „Deutsch“ gespeichert. Die IDs werden in dem Feld „path“ mit einem Pipe getrennt gespeichert. Die Selektierung aller Unterkategorien für die Kategorie Genusswelten (ID 5) kann wie folgt vorgenommen werden (Plain SQL): $sql = “ SELECT * FROM s_categories WHERE path LIKE :path “; $subCategories = Shopware()->Db()->fetchAll($sql, array( ‘path‘ => ‘%|‘ . $categoryId . ‘|%‘ )); Über Doctrine: $builder = Shopware()->Models()->createQueryBuilder(); $builder->select(array(‘categories‘)); $builder->from(‘Shopware\Models\Category\Category‘, ‘categories‘); $builder->where(,categories.path LIKE :path‘); $builder->setParameter(,path‘, ‘%|‘ . $categoryId . ‘|%‘) $subCategories = $builder->getQuery()->getArrayResult(); Shopware 4.1 Kategorien 4 Shopware AG Kategorie Repository Im Kategorie Repository sind die folgenden Funktionen entfernt worden, da diese nur mit Left und Right Werten funktioniert haben: - getArticleQueryBuilder - getActiveChildrenByIdQuery Shopware 4.1 Kategorien 5