BugFix: Kategorie Online / Offline setzte

Gesperrt
blackalpha
Beiträge: 11
Registriert: Do 26. Mai 2011, 09:57
Kontaktdaten:

BugFix: Kategorie Online / Offline setzte

Beitrag von blackalpha »

Hallo Liebe Forengemeinde,

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;
        }
Für das Script ist der Baum erst zu ende, wenn die parentid kleiner als die idcat_start ist. (Im Beispiel wäre idcat:70 start).
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;
}
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Re: BugFix: Kategorie Online / Offline setzte

Beitrag von Oldperl »

Hatten wir schon :arrow: http://forum.contenido.org/viewtopic.php?f=63&t=30940

Gruß aus Franken

Ortwin
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
blackalpha
Beiträge: 11
Registriert: Do 26. Mai 2011, 09:57
Kontaktdaten:

Re: BugFix: Kategorie Online / Offline setzte

Beitrag von blackalpha »

Ah ok, hatte ich nur für 4.4 gefunden.

Aber der BugFix passt trotzdem :-)
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Re: BugFix: Kategorie Online / Offline setzte

Beitrag von Oldperl »

blackalpha hat geschrieben:Aber der BugFix passt trotzdem :-)
Den level-Kram kann man eigentlich ganz weglassen, wird nicht benötigt. Ich hab das seit Jahren schon so laufen

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;
    while ($db->next_record()) {
        if ($db->f("parentid") < $idcat_start) {        // ending part of tree
            $i = 0;
        }
        if ($db->f("idcat") == $idcat_start) {        // starting part of tree
            $i = 1;
        }
        if ($i == 1) {
            $catstring[] = $db->f("idcat");
        }
    }

    return $catstring;
} 
Gruß aus Franken

Ortwin
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
blackalpha
Beiträge: 11
Registriert: Do 26. Mai 2011, 09:57
Kontaktdaten:

Re: BugFix: Kategorie Online / Offline setzte

Beitrag von blackalpha »

Oldperl hat geschrieben: Den level-Kram kann man eigentlich ganz weglassen, wird nicht benötigt. Ich hab das seit Jahren schon so laufen

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;
    while ($db->next_record()) {
        if ($db->f("parentid") < $idcat_start) {        // ending part of tree
            $i = 0;
        }
        if ($db->f("idcat") == $idcat_start) {        // starting part of tree
            $i = 1;
        }
        if ($i == 1) {
            $catstring[] = $db->f("idcat");
        }
    }

    return $catstring;
} 
Also ich glaube ich steh aufm Schlauch... Ich sehe in deinem code keinen Unterschied zur Originalen aus 4.8.15

Wie dein Code dort ist, macht er doch den selben Fehler mit der parentid < idcat_start...

Oder habe ich was übersehen?
Gesperrt