- $r = sql_select("A.id_rubrique AS id, R.id_secteur AS secteur, R.profondeur+1 as profondeur", "spip_rubriques AS A, spip_rubriques AS R", "A.id_parent = R.id_rubrique AND (A.id_secteur <> R.id_secteur OR A.profondeur <> R.profondeur+1)");
- while ($row = sql_fetch($r)) {
- sql_update("spip_rubriques", array("id_secteur" => $row['secteur'],'profondeur' => $row['profondeur']), "id_rubrique=".$row['id']);
+
+ // Par recursivite : si toutes les rubriques de profondeur $prof sont bonnes
+ // on fixe le profondeur $prof+1
+
+ // Toutes les rubriques dont le parent est de profondeur $prof ont une profondeur $prof+1
+ // on teste A.profondeur > $prof+1 car :
+ // - toutes les rubriques de profondeur 0 à $prof sont bonnes
+ // - si A.profondeur = $prof+1 c'est bon
+ // - cela nous protege de la boucle infinie en cas de reference circulaire dans les rubriques
+ $maxiter2 = $maxiter;
+ while ($maxiter2--
+ AND $rows = sql_allfetsel(
+ "A.id_rubrique AS id, R.id_secteur AS id_secteur, R.profondeur+1 as profondeur",
+ "spip_rubriques AS A JOIN spip_rubriques AS R ON A.id_parent = R.id_rubrique",
+ "R.profondeur=".intval($prof)." AND (A.id_secteur <> R.id_secteur OR A.profondeur > R.profondeur+1)",
+ "","R.id_secteur","0,100")){
+
+ $id_secteur = null;
+ $ids = array();
+ while ($row = array_shift($rows)) {
+ if ($row['id_secteur']!==$id_secteur){
+ if (count($ids))
+ sql_updateq("spip_rubriques", array("id_secteur" => $id_secteur,'profondeur' => $prof+1), sql_in('id_rubrique',$ids));
+ $id_secteur = $row['id_secteur'];
+ $ids = array();
+ }
+ $ids[] = $row['id'];
+ }
+ if (count($ids))
+ sql_updateq("spip_rubriques", array("id_secteur" => $id_secteur,'profondeur' => $prof+1), sql_in('id_rubrique',$ids));
+ }
+
+
+ // Toutes les rubriques de profondeur $prof+1 qui n'ont pas un parent de profondeur $prof sont decalees
+ $maxiter2 = $maxiter;
+ while ($maxiter2--
+ AND $rows = sql_allfetsel(
+ "id_rubrique as id",
+ "spip_rubriques",
+ "profondeur=".intval($prof+1)." AND id_parent NOT IN (".sql_get_select("zzz.id_rubrique","spip_rubriques AS zzz","zzz.profondeur=".intval($prof)).")",'','','0,100')){
+ $rows = array_map('reset',$rows);
+ sql_updateq("spip_rubriques", array('profondeur' => $prof+2), sql_in("id_rubrique",$rows));
+ }
+
+ // ici on a fini de valider $prof+1, toutes les rubriques de prondeur 0 a $prof+1 sont OK
+ // si pas de rubrique a profondeur $prof+1 pas la peine de continuer
+ // si il reste des rubriques non vues, c'est une branche morte ou reference circulaire (base foireuse)
+ // on arrete les frais
+ if (sql_countsel("spip_rubriques","profondeur=".intval($prof+1))){
+ $prof++;