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})";
    }
}
Beispiel #3
0
/**
 * 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];
}
Beispiel #4
0
/**
 * 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', '');
}
Beispiel #5
0
/**
 * 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;
}
Beispiel #6
0
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;
}
Beispiel #7
0
/**
 * 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();
}
Beispiel #8
0
/**
 * 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;
}