function bookmarks_insert($tree, $id_parent, $importer_statut_publie, $importer_tags, $level = 0)
{
    include_spip('action/editer_rubrique');
    include_spip('action/editer_site');
    $nb = 0;
    if (count($tree['content']['links']) or isset($tree['sub'])) {
        $titre = $tree['content']['titre'] ? $tree['content']['titre'] : _T('info_sans_titre');
        $id_rubrique = sql_getfetsel('id_rubrique', 'spip_rubriques', 'id_parent=' . intval($id_parent) . " AND titre=" . sql_quote($titre));
        if (!$id_rubrique and $id_rubrique = rubrique_inserer($id_parent)) {
            rubrique_modifier($id_rubrique, array('titre' => $titre));
        }
        if ($id_rubrique) {
            $statut = 'prop';
            if ($importer_statut_publie and autoriser('publierdans', 'rubrique', $id_rubrique)) {
                $statut = 'publie';
            }
            $now = time();
            foreach ($tree['content']['links'] as $link) {
                if (!($id_syndic = sql_getfetsel('id_syndic', 'spip_syndic', 'id_rubrique=' . intval($id_rubrique) . " AND url_site=" . sql_quote($link['url'])))) {
                    $id_syndic = site_inserer($id_rubrique);
                    $set = array('url_site' => $link['url'], 'nom_site' => $link['titre'], 'date' => date('Y-m-d H:i:s', $link['date'] ? $link['date'] : $now), 'statut' => $statut, 'descriptif' => $link['descriptif']);
                    #echo "creation site $id_syndic ".$set['url_site']." <br />";
                    site_modifier($id_syndic, $set);
                    $nb++;
                } else {
                    #echo "existant site $id_syndic ".$link['url']." <br />";
                    $nb++;
                }
            }
            if ($level < 30) {
                if (isset($tree['sub'])) {
                    foreach ($tree['sub'] as $sub) {
                        $nb += bookmarks_insert($sub, $id_rubrique, $importer_statut_publie, $importer_tags, $level + 1);
                    }
                }
            }
        }
    }
    return $nb;
}
/**
 * Crée une rubrique
 *
 * @deprecated
 *     Utiliser rubrique_inserer()
 * @see rubrique_inserer()
 *
 * @param int $id_parent
 *     Identifiant de la rubrique parente.
 *     0 pour la racine.
 * @return int
 *     Identifiant de la rubrique crée
 **/
function insert_rubrique($id_parent)
{
    return rubrique_inserer($id_parent);
}
function th_configurer_rubriques()
{
    $mots = array('travail_en_cours' => 'Travail des classes', 'consignes' => 'Consignes', 'ressources' => 'Bibliothèque', 'blogs' => 'Blog public', 'evenements' => 'Blog privé', 'images_background' => 'Contenu éditorial', 'agora' => 'Discuter avec');
    foreach ($mots as $mot => $titre) {
        $count = (int) sql_countsel('spip_rubriques as sr
                LEFT JOIN spip_mots_liens as sml
                    ON (sr.id_rubrique = sml.id_objet AND sml.objet = "rubrique")
                LEFT JOIN spip_mots as sm
                    ON (sml.id_mot = sm.id_mot)', array('sm.titre = "' . $mot . '"', 'sr.id_parent = 0'));
        if ($count < 1) {
            include_spip('action/editer_rubrique');
            $id_rubrique = rubrique_inserer(0);
            rubrique_modifier($id_rubrique, array('titre' => $titre));
            $id_mot = (int) sql_getfetsel('id_mot', 'spip_mots', 'titre = "' . $mot . '"');
            include_spip('action/editer_liens');
            $res = objet_associer(array("mots" => $id_mot), array("rubriques" => $id_rubrique));
        }
    }
}
function bookmarks_opml_insert($tree, $id_parent, $importer_statut_publie, $importer_tags)
{
    include_spip('action/editer_rubrique');
    include_spip('action/editer_site');
    $nb = 0;
    if (count($tree)) {
        foreach ($tree as $key => $item) {
            // cas d'un flux
            if (array_key_exists('XMLURL', $item)) {
                $statut = 'prop';
                if ($importer_statut_publie and autoriser('publierdans', 'rubrique', $id_parent)) {
                    $statut = 'publie';
                }
                $now = time();
                if (!($id_syndic = sql_getfetsel('id_syndic', 'spip_syndic', 'id_rubrique=' . intval($id_parent) . " AND url_site=" . sql_quote($item['HTMLURL'])))) {
                    $id_syndic = site_inserer($id_parent);
                    $set = array('url_site' => $item['HTMLURL'], 'nom_site' => $item['TITLE'], 'url_syndic' => $item['XMLURL'], 'syndication' => 'oui', 'resume' => 'non', 'date' => date('Y-m-d H:i:s', $now), 'statut' => $statut);
                    site_modifier($id_syndic, $set);
                    $nb++;
                } else {
                    $nb++;
                }
            } else {
                // cas d'un dossier
                $titre = $key;
                $id_rubrique = sql_getfetsel('id_rubrique', 'spip_rubriques', 'id_parent=' . intval($id_parent) . " AND titre=" . sql_quote($titre));
                if (!$id_rubrique and $id_rubrique = rubrique_inserer($id_parent)) {
                    rubrique_modifier($id_rubrique, array('titre' => $titre));
                }
                if ($id_rubrique) {
                    $nb += bookmarks_opml_insert($item, $id_rubrique, $importer_statut_publie, $importer_tags);
                }
            }
        }
    }
    return $nb;
}
function formulaires_csv2auteurs_importation_traiter_dist()
{
    $maj_utilisateur = _request('maj_utilisateur');
    $abs_redacs = _request('abs_redac');
    $abs_admins = _request('abs_admin');
    $abs_visiteurs = _request('abs_visiteur');
    $abs_poubelle = _request('abs_poubelle');
    $suppression_article_efface = _request('suppression_article_efface');
    $traitement_article_efface = _request('traitement_article_efface');
    $nom_rubrique_archive = _request('nom_rubrique_archive');
    $type_maj = _request('type_maj');
    // recuperation de l'id de la rubrique parent des rubriques admins
    $id_rubrique_parent_admin = _request('rubrique_parent');
    $id_rubrique_parent_admin = explode('|', $id_rubrique_parent_admin[0]);
    $id_rubrique_parent_admin = $id_rubrique_parent_admin[1];
    //récupération de l'id de la rubrique parent archive
    $id_rubrique_parent_archive = _request('rubrique_parent_archive');
    $id_rubrique_parent_archive = explode('|', $id_rubrique_parent_archive[0]);
    $id_rubrique_parent_archive = $id_rubrique_parent_archive[1];
    $retour = array();
    include_spip('action/editer_rubrique');
    if (test_plugin_actif("accesrestreint")) {
        include_spip('action/editer_zone');
    }
    include_spip('action/editer_auteur');
    if ($abs_redacs or $abs_admins or $abs_visiteurs or $abs_poubelle == 'supprimer') {
        include_spip('action/editer_objet');
        include_spip('action/editer_liens');
        include_spip('action/editer_zone');
    }
    // récupération du fichier csv
    include_spip('inc/config');
    $separateur = lire_config("csv2auteurs_separateur");
    $tmp_name = $_FILES['fichier_csv']['tmp_name'];
    $destination = _DIR_TMP . basename($tmp_name);
    $resultat = move_uploaded_file($tmp_name, $destination);
    if (!$resultat) {
        $retour['message_erreur'] = _T('csv2auteurs:transfert');
    } else {
        $retour['message_ok'] = _T('csv2auteurs:bravo');
    }
    // transformation du fichier csv en 4 array :
    // $en_tete = ligne entete
    // pour les 3 tableaux suivant, la cle est soit le login et s'il n'existe pas on prend le mail
    // $tableau_csv_visiteurs
    // $tableau_csv_redacs
    // $tableau_csv_admins
    $tableau_csv_visiteurs = $tableau_csv_redacs = $tableau_csv_admins = array();
    $tableau_csv_rubriques_admins = array();
    $fichiercsv = fopen($destination, "r");
    $i = 0;
    // correspondance statut spip / statut csv
    $Tcorrespondances = array('administrateur' => '0minirezo', 'redacteur' => '1comite', 'visiteur' => '6forum', 'poubelle' => '5poubelle');
    // tableau de tous les admins
    $result = sql_select(array('login'), 'spip_auteurs', array('statut = "0minirezo"'));
    while ($r = sql_fetch($result)) {
        $Tadmin_tous[] = $r['login'];
    }
    // tableau des admins restreints
    $Tadmin_restreint = array();
    $from = array("spip_auteurs AS auteurs", "spip_auteurs_liens AS liens");
    $where = array("auteurs.statut = '0minirezo'", "liens.objet = 'rubrique'", "liens.id_auteur = auteurs.id_auteur", 'login!=""');
    $result = sql_select(array('login'), $from, $where);
    while ($r = sql_fetch($result)) {
        $Tadmin_restreint[] = $r['login'];
    }
    // tableau admins complets
    $Tadmin_complet = array_diff($Tadmin_tous, $Tadmin_restreint);
    // traiter fichier CSV
    $num_statut = $num_login = -1;
    while (($data = fgetcsv($fichiercsv, "{$separateur}")) !== FALSE) {
        // petit hack car fgetcsv ne reconnait pas le ~ comme séparateur !!!
        $data = implode("{$separateur}", $data);
        $data = explode("{$separateur}", $data);
        $nombre_elements = count($data);
        if ($i == 0) {
            for ($j = 0; $j < $nombre_elements; $j++) {
                $en_tete[$j] = strtolower($data[$j]);
                //Récupération de la ligne d'entete
                if ($en_tete[$j] == 'statut') {
                    $num_statut = $j;
                }
                if ($en_tete[$j] == 'login') {
                    $num_login = $j;
                }
            }
            if ($num_statut < 0 or $num_login < 0) {
                $retour['message_erreur'] = _T('csv2auteurs:champ_manquant') . ' login:'******' statut' . $num_statut;
                return $retour;
            }
        } else {
            for ($j = 0; $j < $nombre_elements; $j++) {
                // on ne veut pas les auteurs du CSV ayant login égal à celui d'un admin complet
                if ($data[$num_login] and !in_array($data[$num_login], $Tadmin_complet)) {
                    // creation du tableau contenant l'ensemble des données à importer
                    if ($Tcorrespondances[strtolower($data[$num_statut])] == '6forum') {
                        $tableau_csv_visiteurs[$data[$num_login]][$en_tete[$j]] = $en_tete[$j] == "statut" ? "6forum" : $data[$j];
                    }
                    if ($Tcorrespondances[strtolower($data[$num_statut])] == '1comite') {
                        $tableau_csv_redacs[$data[$num_login]][$en_tete[$j]] = $en_tete[$j] == "statut" ? "1comite" : $data[$j];
                    }
                    if ($Tcorrespondances[strtolower($data[$num_statut])] == '0minirezo') {
                        $tableau_csv_admins[$data[$num_login]][$en_tete[$j]] = $en_tete[$j] == "statut" ? "0minirezo" : $data[$j];
                        if ($en_tete[$j] == 'ss_groupe' and $data[$j]) {
                            $Trub = explode('|', $data[$j]);
                            foreach ($Trub as $rub) {
                                if (!in_array($rub, $tableau_csv_rubriques_admins)) {
                                    $tableau_csv_rubriques_admins[] = $rub;
                                }
                            }
                        }
                    }
                }
            }
        }
        $i++;
    }
    fclose($fichiercsv);
    unlink($destination);
    // tableau CSV total
    $tableau_csv_total = $tableau_csv_visiteurs + $tableau_csv_redacs + $tableau_csv_admins;
    //    echo "<pre>";
    //    print_r($tableau_csv_visiteurs);
    //    echo "admi";
    //    print_r($tableau_csv_admins);
    //    echo "red";
    //    print_r($tableau_csv_redacs);
    //    print_r($tableau_csv_total);die;
    //spip_log("tableau csv total","csvspip");
    //spip_log($tableau_csv_total,"csvspip");
    //récupération des auteurs de la bdd en 4 array
    // on ne prend pas les auteurs sans login
    // $poubelle_bdd = les auteurs à la poubelle
    // $visiteur_bdd = les visiteurs
    // $redacteur_bdd
    // $admin_restreint_bdd
    // la cle de chaque tableau est le login
    $poubelle_bdd = $visiteur_bdd = $redacteur_bdd = $admin_restreint_bdd = array();
    /*    $poubelle_bdd_req        = sql_allfetsel('*', 'spip_auteurs',array('statut="5poubelle"','(login!="")'));
        foreach ($poubelle_bdd_req as $key) {
            $poubelle_bdd[$key['login']]=$key;
        }    
    */
    $visiteur_bdd_req = sql_allfetsel('*', 'spip_auteurs', array('statut="6forum"', '(login!="")'));
    foreach ($visiteur_bdd_req as $key) {
        $visiteur_bdd[$key['login']] = $key;
    }
    $redacteur_bdd_req = sql_allfetsel('*', 'spip_auteurs', array('statut="1comite"', '(login!="")'));
    foreach ($redacteur_bdd_req as $key) {
        $redacteur_bdd[$key['login']] = $key;
    }
    //on récupère seulement les admins restreints !!!
    $from = array("spip_auteurs AS auteurs", "spip_auteurs_liens AS liens");
    $where = array("auteurs.statut = '0minirezo'", "liens.objet = 'rubrique'", "liens.id_auteur = auteurs.id_auteur", '(login!="")');
    $admin_restreint_bdd_req = sql_allfetsel("DISTINCT auteurs.*", $from, $where);
    foreach ($admin_restreint_bdd_req as $key) {
        $admin_restreint_bdd[$key['login']] = $key;
    }
    // tableau BDD total
    $tableau_bdd_total = $poubelle_bdd + $visiteur_bdd + $redacteur_bdd + $admin_restreint_bdd;
    // traitement rubriques admin
    // construction du tableau de correspondance nom_rubrique avec leur id
    // création des rubriques n'existant pas
    $tableau_bdd_rubriques_admins = array();
    $result = sql_select(array('id_rubrique', 'titre'), 'spip_rubriques');
    while ($row = sql_fetch($result)) {
        $tableau_bdd_rubriques_admins[$row['id_rubrique']] = strtolower($row['titre']);
    }
    // traitement zones
    // construction du tableau de correspondance nom_zone avec leur id
    $tableau_bdd_zones_admins = array();
    if (test_plugin_actif("accesrestreint")) {
        $result = sql_select(array('id_zone', 'titre'), 'spip_zones');
        while ($row = sql_fetch($result)) {
            $tableau_bdd_zones_admins[$row['id_zone']] = strtolower($row['titre']);
        }
    }
    spip_log($tableau_bdd_zones_admins, "csvspip");
    // créer les rubriques admins du csv n'existant pas et les indexer
    foreach ($tableau_csv_rubriques_admins as $id_rub => $rub) {
        if (!in_array(strtolower($rub), $tableau_bdd_rubriques_admins)) {
            $set = array('titre' => $rub);
            $id_rub = rubrique_inserer($id_rubrique_parent_admin);
            rubrique_modifier($id_rub, $set);
            $tableau_bdd_rubriques_admins[$id_rub] = strtolower($rub);
        }
    }
    //Récuperer les champs de la table auteurs
    $Tnom_champs_bdd = array();
    $desc = sql_showtable('spip_auteurs', true);
    foreach ($desc['field'] as $cle => $valeur) {
        $Tnom_champs_bdd[] = $cle;
    }
    // PARTIE I : maj ou ajout des auteurs
    $tableau_nouveaux_auteurs = array_diff_key($tableau_csv_total, $tableau_bdd_total);
    // si maj demandée
    if ($maj_utilisateur) {
        // construire le tableau des utilisateurs à mettre à jour, indexé sur le login
        $tableau_maj_auteurs = array_diff_key($tableau_csv_total, $tableau_nouveaux_auteurs);
        // construire le tableau de correspondance login csv => id_auteur bdd
        $tableau_maj_auteurs_id = array();
        $Tlogins = array_keys($tableau_maj_auteurs);
        $chaine_in = implode('","', $Tlogins);
        $chaine_in = '"' . $chaine_in . '"';
        $res = sql_select('id_auteur, login', 'spip_auteurs', array('login IN (' . $chaine_in . ')'));
        while ($row = sql_fetch($res)) {
            $tableau_maj_auteurs_id[$row['login']] = $row['id_auteur'];
        }
        // si remplacer les données zones et rubriques administrées: supprimer les liens existant
        if ($type_maj == 'remplacer' and test_plugin_actif("accesrestreint")) {
            // suppression des liens des rubriques administrées
            objet_dissocier(array("auteur" => array_values($tableau_maj_auteurs_id)), array("rubrique" => "*"));
            // suppression des zones des auteurs
            zone_lier('', "auteur", array_values($tableau_maj_auteurs_id), 'del');
        }
        //spip_log("table zone admin","csvspip");
        //spip_log($tableau_bdd_zones_admins,"csvspip");
        // maj des données des auteurs
        foreach ($tableau_maj_auteurs as $login => $Tauteur) {
            csv2auteurs_ajout_utilisateur($login, $Tauteur, $Tnom_champs_bdd, $Tcorrespondances, $tableau_bdd_rubriques_admins, $tableau_bdd_zones_admins, $tableau_maj_auteurs_id[$login]);
        }
        /*      
        echo '<br><pre>';
        var_dump($tableau_maj_auteurs_id);
        */
    }
    // dans tous les cas ajout des nouveaux
    foreach ($tableau_nouveaux_auteurs as $login => $Tauteur) {
        csv2auteurs_ajout_utilisateur($login, $Tauteur, $Tnom_champs_bdd, $Tcorrespondances, $tableau_bdd_rubriques_admins, $tableau_bdd_zones_admins);
    }
    // PARTIE II : Suppressions des absents (changer le statut des auteurs en 5.poubelle)  avec 3 choix pour la gestion des articles associés
    // 1. ras
    // 2. supprimer les articles
    // 3. transferer les articles dans une rubrique d'archivage
    // Si choix3 : transferer les articles , création de la rubrique d'archive (en tenant compte d'une rubrique parent)
    if ($traitement_article_efface == "transferer_articles") {
        if (!($id_rubrique_archive = sql_fetsel('id_rubrique', 'spip_rubriques', array('titre ="' . $nom_rubrique_archive . '"', "id_parent={$id_rubrique_parent_archive}")))) {
            $objet = 'rubrique';
            $set = array('titre' => $nom_rubrique_archive);
            $id_rubrique_archive = objet_inserer($objet, $id_rubrique_parent_archive);
            objet_modifier($objet, $id_rubrique_archive, $set);
        }
    }
    // si l'option auteurs sans articles = suppression complète
    // alors on supprime aussi tous les auteurs à la poubelle (sans articles)
    if ($abs_poubelle == 'supprimer') {
        // récupérer les auteurs à la poubelle avec articles
        $not_in = sql_allfetsel('auteurs.id_auteur', array('spip_auteurs_liens AS liens', 'spip_auteurs AS auteurs'), array('liens.id_auteur = auteurs.id_auteur', 'liens.objet="article"', 'auteurs.statut="5poubelle"'), array('liens.id_auteur'));
        $Tnot_in = array();
        foreach ($not_in as $index => $Tid_auteur) {
            $Tnot_in[] = $Tid_auteur['id_auteur'];
        }
        $not_in = sql_in('id_auteur', $Tnot_in, 'NOT');
        // récupérer les auteurs à la poubelle sans articles
        $Tabs_poubelle = sql_allfetsel('id_auteur', 'spip_auteurs', array('statut="5poubelle"', $not_in));
        $Ta_suppr = array();
        foreach ($Tabs_poubelle as $index => $Tid_auteur) {
            $Ta_suppr[] = $Tid_auteur['id_auteur'];
        }
        // effacer définitevement ces auteurs
        $in = sql_in('id_auteur', $Ta_suppr);
        sql_delete('spip_auteurs', $in);
    }
    //        $Tid_poubelle = csv2auteurs_diff_absents($poubelle_bdd);
    //        csv2auteurs_supprimer_auteurs($Tid_poubelle, '5poubelle', $traitement_article_efface,$id_rubrique_parent_archive);
    if ($abs_visiteurs) {
        $Tid_visiteurs = csv2auteurs_diff_absents($visiteur_bdd, $tableau_csv_visiteurs);
        csv2auteurs_supprimer_auteurs($Tid_visiteurs, '6forum', $traitement_article_efface, $id_rubrique_parent_archive);
    }
    if ($abs_redacs) {
        $Tid_redacs = csv2auteurs_diff_absents($redacteur_bdd, $tableau_csv_redacs);
        csv2auteurs_supprimer_auteurs($Tid_redacs, '1comite', $traitement_article_efface, $id_rubrique_parent_archive);
    }
    if ($abs_admins) {
        $Tid_admins = csv2auteurs_diff_absents($admin_restreint_bdd, $tableau_csv_admins);
        csv2auteurs_supprimer_auteurs($Tid_admins, '0minirezo', $traitement_article_efface, $id_rubrique_parent_archive);
    }
    // PARTIE III : maj des existants
    // 1. ras
    // 2. supprimer les articles
    // 3. transferer les articles dans une rubrique d'archivage
    /*
    echo '<pre>$visiteur_bdd';
    var_dump($visiteur_bdd);
    echo '<br>$redacteur_bdd:';
    var_dump($redacteur_bdd);
    echo '<br>$admin_restreint';
    var_dump($admin_restreint);
    echo '</pre>';
    die;
    */
    //  $retour['redirect'] = 'index.php?exec=csv2auteurs';
    return $retour;
}