/**
 * Point d'entrée d'édition d'un objet
 *
 * On ne peut entrer que par un appel en fournissant $id et $objet
 * ou avec un argument d'action sécurisée de type "objet/id"
 *
 * @param int $id
 * @param string $objet
 * @param array $set
 * @return array
 */
function action_editer_objet_dist($id = null, $objet = null, $set = null)
{
    // appel direct depuis une url avec arg = "objet/id"
    if (is_null($id) or is_null($objet)) {
        $securiser_action = charger_fonction('securiser_action', 'inc');
        $arg = $securiser_action();
        list($objet, $id) = array_pad(explode("/", $arg, 2), 2, null);
    }
    // appel incorrect ou depuis une url erronnée interdit
    if (is_null($id) or is_null($objet)) {
        include_spip('inc/minipres');
        echo minipres(_T('info_acces_interdit'));
        die;
    }
    // si id n'est pas un nombre, c'est une creation
    // mais on verifie qu'on a toutes les donnees qu'il faut.
    if (!($id = intval($id))) {
        // on ne sait pas si un parent existe mais on essaye
        $id_parent = _request('id_parent');
        $id = objet_inserer($objet, $id_parent);
    }
    if (!($id = intval($id)) > 0) {
        return array($id, _L('echec enregistrement en base'));
    }
    // Enregistre l'envoi dans la BD
    $err = objet_modifier($objet, $id, $set);
    return array($id, $err);
}
function livraison_installer_modes()
{
    include_spip("action/editer_objet");
    if ($importer_csv = charger_fonction("importer_csv", "inc", true) and $f = find_in_path("base/livraisonmodes.csv")) {
        $modes = $importer_csv($f, true);
        foreach ($modes as $mode) {
            $id = objet_inserer("livraisonmode");
            $set = $mode;
            $set['prix_poids_ht'] = preg_replace(",\\s+,", "\n", $set['prix_poids_ht']);
            $set['prix_volume_ht'] = preg_replace(",\\s+,", "\n", $set['prix_volume_ht']);
            $set['statut'] = 'prop';
            objet_modifier("livraisonmode", $id, $set);
        }
    }
}
/**
 * Migration des albums grappes vers media_collections
 * 
 * Appelée lors de l'installation du plugin
 */
function geol_albums_init()
{
    if ($grappes = sql_allfetsel('*', 'spip_grappes', sql_in('type', array('album_perso', 'album_coop', 'balade')))) {
        include_spip('action/editer_objet');
        include_spip('action/editer_liens');
        foreach ($grappes as $grappe) {
            // récupérer les infos des anciens albums (grappes)
            $set = array('id_admin' => $grappe['id_admin'], 'titre' => $grappe['titre'], 'descriptif' => $grappe['descriptif'], 'date' => $grappe['date']);
            if ($grappe['type'] == 'album_perso') {
                $set['type_collection'] = 'perso';
            } elseif ($grappe['type'] == 'album_coop') {
                $set['type_collection'] = 'coop';
            } elseif ($grappe['type'] == 'balade') {
                $set['type_collection'] = 'balade';
            }
            // créer des collections
            $id_collection = objet_inserer('collection');
            if ($id_collection > 0) {
                objet_modifier('collection', $id_collection, $set);
                objet_instituer('collection', $id_collection, array('statut' => 'publie'));
                // copie des liens de grappes_liens vers collections_liens pour les articles
                $articles = sql_allfetsel('*', 'spip_grappes_liens', "objet = 'article' AND id_grappe = " . $grappe['id_grappe']);
                foreach ($articles as $article) {
                    objet_associer(array('collection' => $id_collection), array($article['objet'] => $article['id_objet']), array('rang' => $article['rang']));
                }
                // associer l'auteur id_admin de la grappe à la collection
                objet_associer(array('auteur' => $grappe['id_admin']), array('collection' => $id_collection));
                // copie des liens de grappes_liens vers auteurs_liens pour les auteurs
                $auteurs = sql_allfetsel('*', 'spip_grappes_liens', "objet = 'auteur' AND id_grappe = " . $grappe['id_grappe']);
                foreach ($auteurs as $auteur) {
                    objet_associer(array($auteur['objet'] => $auteur['id_objet']), array('collection' => $id_collection));
                }
                // maj des liens des forums attachés aux grappes
                $forums = sql_allfetsel('id_forum', 'spip_forum', "objet = 'grappe' AND id_objet = " . $grappe['id_grappe']);
                foreach ($forums as $forum) {
                    sql_updateq('spip_forum', array('objet' => 'collection', 'id_objet' => $id_collection), 'id_forum = ' . $forum['id_forum']);
                }
                // maj des liens des points gis attachés aux grappes
                $points = sql_allfetsel('id_gis', 'spip_gis_liens', "objet = 'grappe' AND id_objet = " . $grappe['id_grappe']);
                foreach ($points as $point) {
                    sql_updateq('spip_gis_liens', array('objet' => 'collection', 'id_objet' => $id_collection), 'id_gis = ' . $point['id_gis']);
                }
            }
        }
    }
}
/**
 * Enregistre un massicotage dans la base de données
 *
 * @param string $objet : le type d'objet
 * @param integer $id_objet : l'identifiant de l'objet
 * @param array parametres : Un tableau de parametres pour le
 *							 massicotage, doit contenir les clés
 *							 'zoom', 'x1', 'x2', 'y1', et 'y2'
 *
 * @return mixed   Rien si tout s'est bien passé, un message d'erreur
 *				   sinon
 */
function massicot_enregistrer($objet, $id_objet, $parametres)
{
    include_spip('action/editer_objet');
    include_spip('action/editer_liens');
    /* Tester l'existence des parametres nécessaires */
    if (!isset($parametres['zoom'])) {
        return _T('massicot:erreur_parametre_manquant', array('parametre' => 'zoom'));
    } elseif (!isset($parametres['x1'])) {
        return _T('massicot:erreur_parametre_manquant', array('parametre' => 'x1'));
    } elseif (!isset($parametres['x2'])) {
        return _T('massicot:erreur_parametre_manquant', array('parametre' => 'x2'));
    } elseif (!isset($parametres['y1'])) {
        return _T('massicot:erreur_parametre_manquant', array('parametre' => 'y1'));
    } elseif (!isset($parametres['y2'])) {
        return _T('massicot:erreur_parametre_manquant', array('parametre' => 'y2'));
    }
    /* le rôle est traité à part */
    if (isset($parametres['role'])) {
        $role = $parametres['role'];
        unset($parametres['role']);
    } else {
        $role = '';
    }
    $chemin_image = massicot_chemin_image($objet, $id_objet);
    list($width, $height) = getimagesize($chemin_image);
    $id_massicotage = sql_getfetsel('id_massicotage', 'spip_massicotages_liens', array('objet=' . sql_quote($objet), 'id_objet=' . intval($id_objet), 'role=' . sql_quote($role)));
    if (!$id_massicotage) {
        $id_massicotage = objet_inserer('massicotage');
        objet_associer(array('massicotage' => $id_massicotage), array($objet => $id_objet), array('role' => $role));
        /* Le logo du site est un cas spécial. SPIP le traite comme le « site »
         * avec l'id 0, alors on fait pareil. */
        if ($id_objet == 0) {
            // peut être le string '0'
            sql_insertq('spip_massicotages_liens', array('id_massicotage' => $id_massicotage, 'id_objet' => 0, 'objet' => 'site', 'role' => $role));
        }
    }
    if ($err = objet_modifier('massicotage', $id_massicotage, array('traitements' => serialize($parametres)))) {
        return $err;
    }
}
Esempio n. 5
0
/**
 * Point d'entree d'edition d'un objet
 * on ne peut entrer que par un appel en fournissant $id et $objet
 * mais pas pas une url
 *
 * @param int $id
 * @param string $objet
 * @param array $set
 * @return array
 */
function action_editer_objet_dist($id = null, $objet = null, $set = null)
{
    // appel direct depuis une url interdit
    if (is_null($id) or is_null($objet)) {
        include_spip('inc/minipres');
        echo minipres(_T('info_acces_interdit'));
        die;
    }
    // si id n'est pas un nombre, c'est une creation
    // mais on verifie qu'on a toutes les donnees qu'il faut.
    if (!($id = intval($id))) {
        // on ne sait pas si un parent existe mais on essaye
        $id_parent = _request('id_parent');
        $id = objet_inserer($objet, $id_parent);
    }
    if (!($id = intval($id)) > 0) {
        return array($id, _L('echec enregistrement en base'));
    }
    // Enregistre l'envoi dans la BD
    $err = objet_modifier($objet, $id, $set);
    return array($id, $err);
}
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;
}