Macht man das Ganze in korrekter Reihenfolge, klappt es auch. Mein Vorschlag wäre deshalb folgender Code:
Code: Alles auswählen
function strDeleteCategory ($idcat) {
global $db;
global $lang;
global $client;
global $cfg;
global $area_tree;
// Flag to rebuild the category table
global $remakeCatTable;
global $remakeStrTable;
$remakeCatTable = true;
$remakeStrTable = true;
# Look for existing subcategories and leave with "0201" if there are any:
$sql = "SELECT * FROM ".$cfg["tab"]["cat"]." WHERE parentid='$idcat'";
$db->query($sql);
if ($db->next_record()) return "0201";
# Look for existing articles and leave with "0202" if there are any:
$sql = "SELECT * FROM ".$cfg["tab"]["cat_art"]." WHERE idcat='$idcat'";
$db->query($sql);
if ($db->next_record()) return "0202";
# Get preid and postid for categorie:
$sql = "SELECT * FROM ".$cfg["tab"]["cat"]." WHERE idcat='$idcat'";
$db->query($sql);
$db->next_record();
$tmp_preid = $db->f("preid");
$tmp_postid = $db->f("postid");
////// update pre cat set new postid
if ($tmp_preid != 0) {
$sql = "UPDATE ".$cfg["tab"]["cat"]." SET postid='$tmp_postid' WHERE idcat='$tmp_preid'";
$db->query($sql);
}
////// update post cat set new preid
if ($tmp_postid != 0) {
$sql = "UPDATE ".$cfg["tab"]["cat"]." SET preid='$tmp_preid' WHERE idcat='$tmp_postid'";
$db->query($sql);
}
////// delete entry in 'cat'-table
$sql = "DELETE FROM ".$cfg["tab"]["cat"]." WHERE idcat='$idcat' ";
$db->query($sql);
# Collect the idtplcfg's for categorie:
$sql = "SELECT idtplcfg FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='$idcat'";
$db->query($sql);
while ($db->next_record()) $tmp_idtplcfg[] = $db->f("idtplcfg");
# Delete all corresponding entries in tpl_conf and container_conf:
foreach ($tmp_idtplcfg as $tmp_idtplcfg) {
$sql = "DELETE FROM ".$cfg["tab"]["tpl_conf"]." WHERE idtplcfg='$tmp_idtplcfg'";
$db->query($sql);
$sql = "DELETE FROM ".$cfg["tab"]["container_conf"]." WHERE idtplcfg = '$tmp_idtplcfg'";
$db->query($sql);
}
////// delete entry in 'cat_lang'-table
$sql = "DELETE FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='$idcat'";
$db->query($sql);
// delete rights for element
cInclude ("includes", "functions.rights.php");
deleteRightsForElement("str", $idcat);
}
Ich habe mir außerdem noch erlaubt, die zusätzliche if-else-Verschachtelung der return-Anweisungen zu entfernen (macht den Code lesbarer).
Bitte sagt mir, ob ihr damit was anfangen könnt, oder ob ich wirklich nur genau die Code-Schnipsel ändern soll, die einen Fehler erzeugen, selbst wenn der dadurch entstehende Code dann sehr unleserlich ist.
Bei conDeleteart() passiert übrigens genau das selbe, zusätzlich werden nur die Einträge der aktuellen Sprache gelöscht (wenn es richtig herum programmiert wäre). Poste ich gleich auch noch ...