Table con_cat inkonsistent
Verfasst: Fr 11. Dez 2009, 10:10
Eine Contenido-Installation (mit über 10 Mandanten) bei mir hat dringenden Bedarf, die Tabelle con_cat (bzw. $[Prefix]_cat) aufzuräumen. Mit einem kleinen Script habe ich festgestellt, dass es darin viele Kategorien gibt, die mit parentid und/oder preid und/oder postid auf inexistente Kategorien verweisen oder auf solche, die zu anderen Mandanten gehören. Oft passen auch postid und preid[postid] bzw. preid und postid[preid] nicht zusammen. Noch mehr Kategorien gibt es, deren idcat in con_art_lang nicht vorkommt. Und dann gibt es auch Fälle, wo es zu einem Mandanten gar keine Kategorie mit parentid=0 und preid=0 (also keinen ersten Baum) gibt. Ich vermute, dass es an diesen Inkonsistenzen liegt, wenn gelegentlich Bäume im Backend unter "Content" - "Kategorien" (und leider dann auch im Frontend) ganz verschwinden, wenn man bloß eine weitere Kategorie hinzufügt, oder wenn andere ähnliche sehr seltsame Effekte auftreten.
Nun würde ich gerne ein Script basteln (oder gibt es das schon?), das con_cat sowie ggf. andere damit zusammenhängende Tabellen in einen konsistenten Zustand bringt (den man dann im Backend nachbearbeiten kann). Da die Mandanten derzeit im Wesentlichen funktionieren und das nicht zerstört werden soll, muss ich bei widersprüchlichen Daten wohl eher die Daten als vermutlich richtig betrachten, die bei der Anzeige im Frontend auch ausgewertet werden. Daher vermute ich, dass ein preid (falls nicht preid=0) eher zu korrigieren sein wird als ein postid, das damit im Widerspruch steht (richtig??). Meine Idee zum Vorgehen (jeweils bei einzelnen Mandanten!) ist:
1. Alle Kategorien, deren parentid auf Kategorien anderer Mandanten zeigt, werden mit parentid=0 (und passend zu setzenden preid und postid) als neuer Baum "unten" angehängt (auf evtl. inkonsistente Ketten wird dabei geachtet, siehe Aufgabe Nr. 5).
2. Wenn postid einer Kategorie X auf eine Kategorie Y mit gleichem parentid verweist, dann wird ggf. preid[Y]=X gesetzt.
3. Alle preid und postid, die auf Kategorien fremder Mandanten weisen, werden korrigiert (d.h. die betroffene Kategorie wird unter ihrem parent jeweils "unten" angehängt)
4. Wenn es (im jeweiligen Mandanten) keine Kategorie mit parentid=0 && preid=0 gibt, dann wird aus den Kategorien mit parentid=0 eine ausgewählt (vorzugsweise die mit dem Namen "Hauptnavigation") und preid=0 gesetzt.
5. Bei den Kategorien mit parentid=0 (im jeweiligen Mandanten) werden preid und ggf. postid so korrigiert, dass sie eine ordnungsgemäße "Kette" bilden.
6. Analog zu 4 und 5 werden zu jeder Kategorie deren Unterkategorien, falls vorhanden und fehlerhaft, korrigiert.
Fragen dazu:
a) Wäre das ein geeignetes Vorgehen?
b) Was ist zu tun, wenn es in con_cat eine Kategorie, gibt, deren idcat in con_cat_lang nicht vorkommt?
c) Wären zusätzlich Eingriffe in anderen Tabellen notwendig oder sinnvoll?
d) Falls es in diesem Zusammenhang sinnvoll ist, eine Kategorie ganz neu anzulegen (z.B. als Behälter für "lost categories"), in welchen Tabellen muss das geschehen?
Ich wäre sehr dankbar für Rückmeldungen!
Im Übrigen fände ich es gut, wenn es in Contenido selbst einen Mechanismus gäbe, solche Inkonsistenzen zu beheben. Nach den vielen Meldungen von Nutzern darüber, dass "ganze Bäume" verschwinden, scheint hier wirklich ein Problem zu liegen, das ich nicht allein habe.
Nun würde ich gerne ein Script basteln (oder gibt es das schon?), das con_cat sowie ggf. andere damit zusammenhängende Tabellen in einen konsistenten Zustand bringt (den man dann im Backend nachbearbeiten kann). Da die Mandanten derzeit im Wesentlichen funktionieren und das nicht zerstört werden soll, muss ich bei widersprüchlichen Daten wohl eher die Daten als vermutlich richtig betrachten, die bei der Anzeige im Frontend auch ausgewertet werden. Daher vermute ich, dass ein preid (falls nicht preid=0) eher zu korrigieren sein wird als ein postid, das damit im Widerspruch steht (richtig??). Meine Idee zum Vorgehen (jeweils bei einzelnen Mandanten!) ist:
1. Alle Kategorien, deren parentid auf Kategorien anderer Mandanten zeigt, werden mit parentid=0 (und passend zu setzenden preid und postid) als neuer Baum "unten" angehängt (auf evtl. inkonsistente Ketten wird dabei geachtet, siehe Aufgabe Nr. 5).
2. Wenn postid einer Kategorie X auf eine Kategorie Y mit gleichem parentid verweist, dann wird ggf. preid[Y]=X gesetzt.
3. Alle preid und postid, die auf Kategorien fremder Mandanten weisen, werden korrigiert (d.h. die betroffene Kategorie wird unter ihrem parent jeweils "unten" angehängt)
4. Wenn es (im jeweiligen Mandanten) keine Kategorie mit parentid=0 && preid=0 gibt, dann wird aus den Kategorien mit parentid=0 eine ausgewählt (vorzugsweise die mit dem Namen "Hauptnavigation") und preid=0 gesetzt.
5. Bei den Kategorien mit parentid=0 (im jeweiligen Mandanten) werden preid und ggf. postid so korrigiert, dass sie eine ordnungsgemäße "Kette" bilden.
6. Analog zu 4 und 5 werden zu jeder Kategorie deren Unterkategorien, falls vorhanden und fehlerhaft, korrigiert.
Fragen dazu:
a) Wäre das ein geeignetes Vorgehen?
b) Was ist zu tun, wenn es in con_cat eine Kategorie, gibt, deren idcat in con_cat_lang nicht vorkommt?
c) Wären zusätzlich Eingriffe in anderen Tabellen notwendig oder sinnvoll?
d) Falls es in diesem Zusammenhang sinnvoll ist, eine Kategorie ganz neu anzulegen (z.B. als Behälter für "lost categories"), in welchen Tabellen muss das geschehen?
Ich wäre sehr dankbar für Rückmeldungen!
Im Übrigen fände ich es gut, wenn es in Contenido selbst einen Mechanismus gäbe, solche Inkonsistenzen zu beheben. Nach den vielen Meldungen von Nutzern darüber, dass "ganze Bäume" verschwinden, scheint hier wirklich ein Problem zu liegen, das ich nicht allein habe.