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