Kategoriebaum neu aufbauen

Hallo Leute,

diese Frage geht wohl vorallem an Shopware selbst.

Seht ihr ein Problem darin, dass man alle paar Stunden den Kategoriebaum von Hand neu aufbaut?
Wir haben zur Zeit wohl eine Schnittstelle, die verpennt in die s_articles_categories_ro beim hinzufügen von Artikeln die zusätzlichen Verbindungen einzupflegen.

Das führt dann zu einem Fehler, den ich hier beschrieben hatte: Shopware Issuetracker
Wenn man den Kategoriebaum neu aufbaut wird die s_articles_categories_ro neu genriert und der Fehler ist weg.

Meine Frage wäre hier einfach, ob der Neuaufbau irgendwelche Nachteile haben könnte?
Dauerhaft soll natürlich die Schnittstelle alles vernünftig eintragen.

Gruß Yuri

Die Funktion ist eigentlich nicht für die Herstellung der Zuordnung in der s_articles_categories_ro gedacht, sondern vielmehr um den Kategoriebaum zu reparieren. In diesem Fall wäre die Funktion erstmal „zweckentfremdet“ da natürlich der aufbau der categories_ro ein Nebeneffekt ist. Allerdings sind die Querrys nicht performant und nicht für den ständigen Gebrauch gedacht. Als Übergangslösung kann das funktionieren, sollte aber in der Schnittstelle gefixt werden.

 

@Moritz Naczenski schrieb:

Die Funktion ist eigentlich nicht für die Herstellung der Zuordnung in der s_articles_categories_ro gedacht, sondern vielmehr um den Kategoriebaum zu reparieren. In diesem Fall wäre die Funktion erstmal „zweckentfremdet“ da natürlich der aufbau der categories_ro ein Nebeneffekt ist. Allerdings sind die Querrys nicht performant und nicht für den ständigen Gebrauch gedacht. Als Übergangslösung kann das funktionieren, sollte aber in der Schnittstelle gefixt werden.

Hallo Herr Naczenski,

danke für Ihre Antwort. Dazu noch einmal die Nachfrage, da wir mittlerweile auch nicht mehr sicher sind ob es an der s_articles_categories_ro liegt:

Fakt ist, wenn man den Baum neu aufbaut, geht alles wieder.
Was für Tabellen nimmt sich die Funktion Kategoriebaum neu aufbauen, denn im Detail vor?

Und hätten Sie eine Idee wie man das mit der zerschossenen Suchfunktion zusammenbringen kann? Das hängt irgendwie direkt miteinader zusammen.

Gruß aus Dortmund

 

 

Hallo exwe,

ich habe mir für meinen Import das unten stehende SQL-Skript gebaut, welches die s_articles_categories_ro wieder korrigiert. Damit tauchen bei mir keine “Ups! Ein Fehler ist aufgetreten!” mehr auf Grin

Wenn es dennoch Probleme geben sollte: Unter http://community.shopware.com/files/downloads/kategorie-doku-12972014.pdf ist die Tabelle beschrieben.

-- Zu jeder Kategorie-ID alle im Baum übergeordneten IDs (inkl. der eigenen ID holen) als pathid holen
-- Also für 110 mit path |104|102|6|3|
-- id	pathId
-- 110	110
-- 110	104
-- 110	102
-- 110	6
-- 110	3
create temporary table cat_pathIds
	select id, pathId from (
		select id, path, id as pathId from s_categories where path is not null
		union select id, path, 0+SUBSTRING_INDEX(path,'|',1) pathId from s_categories where path is not null
		union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',2),'|',-1) pathId from s_categories
		union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',3),'|',-1) pathId from s_categories 
		union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',4),'|',-1) pathId from s_categories 
		union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',5),'|',-1) pathId from s_categories 
		union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',6),'|',-1) pathId from s_categories 
		union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',7),'|',-1) pathId from s_categories 
		union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',8),'|',-1) pathId from s_categories 
		union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',9),'|',-1) pathId from s_categories 
	) pathIds where pathId > 0
;

-- Die neue s_articles_categories_ro (ohne ids) erstellen
create temporary table RECREATED_articles_categories_ro
	select s_articles_categories.articleID, pathIds.pathId as categoryID, 
			s_articles_categories.categoryID as parentCategoryID 
		from s_articles_categories
		inner join cat_pathIds as pathIds on (s_articles_categories.categoryID = pathIds.id and pathIds.pathId > 0)
	order by articleID, parentCategoryID, categoryID ;

-- Alte Einträge entfernen
truncate s_articles_categories_ro;
-- Korrigierte Einträge ablegen
INSERT INTO s_articles_categories_ro
	(articleID,categoryID,parentCategoryID)
(
	SELECT RECREATED_articles_categories_ro.articleID,
		RECREATED_articles_categories_ro.categoryID,
		RECREATED_articles_categories_ro.parentCategoryID
	FROM RECREATED_articles_categories_ro
);

Achtung: Die Quelltextdarstellung macht z.B. aus “>” “>”, also bei der Übernahme noch mal auf HTML-Entities kontrollieren!

Hinweis: Die alten s_articles_categories_ro.id bleiben nicht erhalten, aber darauf scheint es in Shopware keine Verweise zu geben, weswegen eine etwas aufwendigere Variante des Skript mit Erhalt der IDs wohl nicht notwendig ist.

Für mehr Ebenen muss man nur entsprechend viele unions ergänzen:

union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',10),'|',-1) pathId from s_categories 
union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',11),'|',-1) pathId from s_categories 
[...]

Viele Grüße