Ein Kunde von uns hatte das merkwürdige Problem, dass wenn er eine Kategorie Online/Offline setzt mehrere, bzw auch zu wenig Kategorien aktualisiert wurden.
Bsp:
1.ebene
---- 2.ebene1
--------- 3.ebene1
--------- 3.ebene2
---- 2.ebene2
---- 2.ebene3
---- 2.ebene4
Wurde 2.ebene1 offline gesetzt, wurden alle 2.ebenen offline gesetzt, was ja nicht sein darf.
Und es wurden nur bis 3.ebene1 offline gesetzt, wobei ja der ganze Baum offline gesetzt werden sollte.
Die selbe Problematik habe ich im forum unter V4.4 gefunden, dort wurde aber keine Lösung gefunden.
Ich habe das ganze gedebuggt und den Fehler finden können.
in contenido/includes/functions.str.php gibt es die Funktion strDeeperCategoriesArray($idcat_start).
Diese gibt einen Array mit allen idcat's im Baum zurück.
Nun das konkrekte Beispiel, wie es nicht häufig im realen Einsatz kommt:
1.ebene (idcat:1)
---- 2.ebene1 (idcat:20)
--------- 3.ebene1 (idcat:60)
--------- 3.ebene2 (idcat:70)
---- 2.ebene2 (idcat:30)
---- 2.ebene3 (idcat:40)
---- 2.ebene4 (idcat:50)
Schiebe ich nun idcat:70 über idcat:20 und packe idcat:20 in idcat:70 (Also auf links quasi

1.ebene (idcat:1)
---- 2.ebene1 (idcat:70)
--------- 3.ebene2 (idcat:20)
------------- 4.ebene1 (idcat:60)
---- 2.ebene2 (idcat:30)
---- 2.ebene3 (idcat:40)
---- 2.ebene4 (idcat:50)
Wenn ich jetzt idcat:70 offline setzte, wird ALLES offline gesetzt.
Schuld ist ein IF in der function.
Code: Alles auswählen
if ($db->f("parentid") < $idcat_start) { // ending part of tree
$i = 0;
}
Somit sind alle IDs kleiner als 70 und alles wird offline gesetzt.
Lösung: Das ganze muss natürlich über das level und nicht die idcat gelöst werden.
Umgeschriebene Funktion:
Code: Alles auswählen
function strDeeperCategoriesArray($idcat_start) {
global $db;
global $client;
global $cfg;
$sql = "SELECT * FROM ".$cfg["tab"]["cat_tree"]." AS A, ".$cfg["tab"]["cat"]." AS B WHERE A.idcat=B.idcat AND idclient='".Contenido_Security::toInteger($client)."' ORDER BY idtree";
$db->query($sql);
$i = 0;
$level = false;
while ($db->next_record()) {
/*
BugFix - blackalpha | 12.09.2012
if ($db->f("parentid") < $idcat_start) { // ending part of tree
$i = 0;
}
*/
if ($db->f("level") <= $level && is_numeric($level)) { // ending part of tree
$i = 0;
}
if ($db->f("idcat") == $idcat_start) { // starting part of tree
$i = 1;
$level = $db->f("level");
}
if ($i == 1) {
$catstring[] = $db->f("idcat");
}
}
return $catstring;
}