function action_supprimer_tous_orphelins() { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); //on recupere le contexte pour ne supprimer les orphelins que de ce dernier list($media, $distant, $statut, $sanstitre) = explode('/', $arg); //critere sur le media if ($media) { $select = "media=" . sql_quote($media); } //critere sur le distant if ($distant) { $where[] = "distant=" . sql_quote($distant); } //critere sur le statut if ($statut) { $where[] = "statut REGEXP " . sql_quote("({$statut})"); } //critere sur le sanstitre if ($sanstitre) { $where[] = "titre=''"; } //on isole les orphelins $select = sql_get_select("DISTINCT id_document", "spip_documents_liens as oooo"); $cond = "spip_documents.id_document NOT IN ({$select})"; $where[] = $cond; $ids_doc_orphelins = sql_select("id_document", "spip_documents", $where); $supprimer_document = charger_fonction('supprimer_document', 'action'); while ($row = sql_fetch($ids_doc_orphelins)) { $supprimer_document($row['id_document']); // pour les orphelins du contexte, on traite avec la fonction existante } }
/** * Utilise par 'critere_adh_recherche_dist' pour organiser la recherche des utilisateurs * en fonction des criteres. * * Pour chaque critere ou groupe de criteres, la selection des auteurs est faite * en fonction des auteurs deja presents dans la selection du critere precedant. * Pour cette raison, c'est i3 qui termine la selection car c'est un plugin * externe a adhclub. * * @return array $sql_adh_auteurs requete de filtrage des auteurs suivant filtrage * si $option=false ou absente => entre parentheses * si $option=true => array seul. */ function adh_recherche($ou, $quoi, $table, $id_saison, $techbase, $encadrant, $niveau, $niv_rel, $option = false) { $adhselect = array(); $adhfrom = array(); $adhwhere = array(); $adhgroupby = array(); $adhorderby = array(); $adhlimit = ""; adhclub_auteurs_ds_saisons($id_saison, $adhselect, $adhfrom, $adhwhere, $adhgroupby, $adhorderby, $adhlimit); if (intval($techbase) or intval($encadrant) or intval($niveau)) { adhclub_auteurs_ds_niveaux($techbase, $encadrant, $niveau, $niv_rel, $adhselect, $adhfrom, $adhwhere, $adhgroupby, $adhorderby, $adhlimit); $adhwhere = array_merge($adhwhere, array("id_auteur = na.id_objet")); } // Parametrage du filtrage du critere (i3) si presents if ($quoi) { $sql_i3_auteurs = i3_recherche($quoi, $ou, $table); $adhwhere = array_merge($adhwhere, array("id_auteur IN " . $sql_i3_auteurs)); } /*$debug1= "DEBUG adhclub JR : adhclub_fonctions adh_recherche - Pt90 - "; adhclub_log("$debug1.", true); $count_auteurs = sql_countsel($adhfrom, $adhwhere, $adhgroupby, $adhlimit); adhclub_log("count_auteurs=$count_auteurs.", true); adhclub_log("$debug1 FIN.", true);*/ $debug1 = "DEBUG adhclub JR : adhclub_fonctions adh_recherche - Pt91 - "; adhclub_log("{$debug1}.", true); $sql_adh_auteurs = sql_get_select($adhselect, $adhfrom, $adhwhere, $adhgroupby, $adhorderby, $adhlimit); adhclub_log("sql_adh_auteurs={$sql_adh_auteurs}.", true); adhclub_log("{$debug1} FIN.", true); /*$debug1= "DEBUG adhclub JR : adhclub_fonctions adh_recherche - Pt92 - "; adhclub_log("$debug1.", true); $liste_adh_auteurs = sql_allfetsel('ca.id_auteur', $adhfrom, $adhwhere, $adhgroupby, $adhorderby, $adhlimit); if(is_array($liste_adh_auteurs)){ foreach($liste_adh_auteurs as $un_adh){ $debug2 = implode(', ',$un_adh); adhclub_log("$debug2.", true); } } adhclub_log("$debug1 FIN.", true);*/ $sql_adh_auteurs = sql_get_select($adhselect, $adhfrom, $adhwhere, $adhgroupby, $adhorderby, $adhlimit); if ($option) { return $sql_adh_auteurs; } else { return "({$sql_adh_auteurs})"; } }
/** * Calculer la condition pour filtrer les status, * * @param string $mstatut * Le champ de la table sur lequel porte la condition * @param string $previsu * Mode previsu : statut ou liste des statuts séparés par une virgule * @param string $publie * Mode publie : statut ou liste des statuts séparés par une virgule * @param string $serveur * Serveur de BDD * @param bool $ignore_previsu * true pour forcer le test même en prévisu * @return array */ function quete_condition_statut($mstatut, $previsu, $publie, $serveur = '', $ignore_previsu = false) { static $cond = array(); $key = func_get_args(); $key = implode("-", $key); if (isset($cond[$key])) { return $cond[$key]; } $liste = $publie; if (defined('_VAR_PREVIEW') and _VAR_PREVIEW and !$ignore_previsu) { $liste = $previsu; } $not = false; if (strncmp($liste, '!', 1) == 0) { $not = true; $liste = substr($liste, 1); } // '' => ne rien afficher, '!'=> ne rien filtrer if (!strlen($liste)) { return $cond[$key] = $not ? "1=1" : "'0=1'"; } $liste = explode(',', $liste); $where = array(); foreach ($liste as $k => $v) { // filtrage /auteur pour limiter les objets d'un statut (prepa en general) // a ceux de l'auteur identifie if (strpos($v, "/") !== false) { $v = explode("/", $v); $filtre = end($v); $v = reset($v); $v = preg_replace(",\\W,", "", $v); if ($filtre == "auteur" and isset($GLOBALS['visiteur_session']['id_auteur']) and intval($GLOBALS['visiteur_session']['id_auteur']) and strpos($mstatut, ".") !== false and $objet = explode(".", $mstatut) and $id_table = reset($objet) and $objet = objet_type($id_table)) { $primary = id_table_objet($objet); $where[] = "({$mstatut}<>" . sql_quote($v) . " OR {$id_table}.{$primary} IN (" . sql_get_select("ssss.id_objet", "spip_auteurs_liens AS ssss", "ssss.objet=" . sql_quote($objet) . " AND ssss.id_auteur=" . intval($GLOBALS['visiteur_session']['id_auteur']), '', '', '', '', $serveur) . "))"; } else { $v = ""; } } // securite $liste[$k] = preg_replace(",\\W,", "", $v); } $liste = array_filter($liste); if (count($liste) == 1) { $where[] = array('=', $mstatut, sql_quote(reset($liste), $serveur)); } else { $where[] = sql_in($mstatut, $liste, $not, $serveur); } while (count($where) > 1) { $and = array('AND', array_pop($where), array_pop($where)); $where[] = $and; } $cond[$key] = reset($where); if ($not) { $cond[$key] = array('NOT', $cond[$key]); } return $cond[$key]; }
/** * Recalcule les secteurs et les profondeurs des rubriques (et articles) * * Cherche les rubriques ayant des id_secteur ou profondeurs ne correspondant pas * avec leur parent, et les met à jour. De même avec les articles et leur id_secteur * On procede en iterant la profondeur de 1 en 1 pour ne pas risquer une boucle infinie sur reference circulaire * * @return void **/ function propager_les_secteurs() { // Profondeur 0 // Toutes les rubriques racines sont de profondeur 0 // et fixer les id_secteur des rubriques racines sql_update('spip_rubriques', array('id_secteur' => 'id_rubrique', 'profondeur' => 0), "id_parent=0"); // Toute rubrique non racine est de profondeur >0 sql_updateq('spip_rubriques', array('profondeur' => 1), "id_parent<>0 AND profondeur=0"); // securite : pas plus d'iteration que de rubriques dans la base $maxiter = sql_countsel("spip_rubriques"); // reparer les rubriques qui n'ont pas l'id_secteur de leur parent // on fait profondeur par profondeur $prof = 0; do { $continuer = false; // 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++; $continuer = true; } } while ($continuer and $maxiter--); // loger si la table des rubriques semble foireuse // et mettre un id_secteur=0 sur ces rubriques pour eviter toute selection par les boucles if (sql_countsel("spip_rubriques", "profondeur>" . intval($prof + 1))) { spip_log("Les rubriques de profondeur>" . ($prof + 1) . " semblent suspectes (branches morte ou reference circulaire dans les parents)", _LOG_CRITIQUE); sql_update("spip_rubriques", array('id_secteur' => 0), "profondeur>" . intval($prof + 1)); } // reparer les articles $r = sql_select("A.id_article AS id, R.id_secteur AS secteur", "spip_articles AS A, spip_rubriques AS R", "A.id_rubrique = R.id_rubrique AND A.id_secteur <> R.id_secteur"); while ($row = sql_fetch($r)) { sql_update("spip_articles", array("id_secteur" => $row['secteur']), "id_article=" . $row['id']); } // avertir les plugins qui peuvent faire leur mises a jour egalement pipeline('trig_propager_les_secteurs', ''); }
/** * critere {orphelins} selectionne les documents sans liens avec un objet editorial * * @param string $idb * @param object $boucles * @param object $crit */ function critere_DOCUMENTS_orphelins_dist($idb, &$boucles, $crit) { $boucle =& $boucles[$idb]; $cond = $crit->cond; $not = $crit->not ? "" : "NOT"; $select = sql_get_select("DISTINCT id_document", "spip_documents_liens as oooo"); $where = "'" . $boucle->id_table . ".id_document {$not} IN ({$select})'"; if ($cond) { $_quoi = '@$Pile[0]["orphelins"]'; $where = "({$_quoi})?{$where}:''"; } $boucle->where[] = $where; }
function traiter_lien_implicite($ref, $texte = '', $pour = 'url', $connect = '') { if (!($match = typer_raccourci($ref))) { return false; } @(list($type, , $id, , $args, , $ancre) = $match); // attention dans le cas des sites le lien doit pointer non pas sur // la page locale du site, mais directement sur le site lui-meme if ($f = charger_fonction("implicite_{$type}", "liens", true)) { $url = $f($texte, $id, $type, $args, $ancre, $connect); } if (!$url) { $url = generer_url_entite($id, $type, $args, $ancre, $connect ? $connect : null); } if (!$url) { return false; } if (is_array($url)) { @(list($type, $id) = $url); $url = generer_url_entite($id, $type, $args, $ancre, $connect ? $connect : null); } if ($pour === 'url') { return $url; } $r = traiter_raccourci_titre($id, $type, $connect); if ($r) { $r['class'] = $type == 'site' ? 'spip_out' : 'spip_in'; } if ($texte = trim($texte)) { $r['titre'] = $texte; } if (!@$r['titre']) { $r['titre'] = _T($type) . " {$id}"; } if ($pour == 'titre') { return $r['titre']; } $r['url'] = $url; // dans le cas d'un lien vers un doc, ajouter le type='mime/type' if ($type == 'document' and $mime = sql_getfetsel('mime_type', 'spip_types_documents', "extension IN (" . sql_get_select("extension", "spip_documents", "id_document=" . sql_quote($id)) . ")", '', '', '', '', $connect)) { $r['mime'] = $mime; } return $r; }
/** * Purger la file de tâche et reprogrammer les tâches périodiques * * @return void */ function queue_purger() { include_spip('base/abstract_sql'); sql_delete('spip_jobs'); sql_delete("spip_jobs_liens", "id_job NOT IN (" . sql_get_select("id_job", "spip_jobs") . ")"); include_spip('inc/genie'); genie_queue_watch_dist(); }
/** * Supprime tous les paquets et plugins locaux. **/ function svp_base_supprimer_paquets_locaux() { sql_delete('spip_paquets', 'id_depot = ' . 0); //_paquets locaux en 0 sql_delete('spip_plugins', sql_in('id_plugin', sql_get_select('DISTINCT(id_plugin)', 'spip_paquets'), 'NOT')); }
function migrer_agenda_where_articles($id_rubrique, $branche = false) { $where = array(); $where[] = 'statut=' . sql_quote('publie'); if ($branche) { include_spip('inc/rubriques'); $where[] = sql_in('id_rubrique', calcul_branche_in($id_rubrique)); } else { $where[] = 'id_rubrique=' . intval($id_rubrique); } // exclure les articles qui ont deja un evenement $where[] = 'id_article NOT IN (' . sql_get_select('id_article', 'spip_evenements') . ')'; return $where; }