Ejemplo n.º 1
0
function formulaires_editer_mot_article_traiter_dist($id_article = 'new', $id_groupe = '', $retour = '')
{
    $message = array('editable' => true, 'message_ok' => '');
    $id_mot_ancien = sql_getfetsel('mot.id_mot', 'spip_mots as mot left join spip_mots_liens as mots_liens ON (mot.id_mot=mots_liens.id_mot)', 'mots_liens.id_objet=' . intval($id_article) . ' AND mots_liens.objet = "article" AND mot.id_groupe=' . intval($id_groupe));
    include_spip('action/editer_liens');
    // si aucun mot selectionne on delie le mot de ce groupe
    if (!($id_mot = _request('id_mot'))) {
        objet_dissocier(array("mot" => $id_mot_ancien), array("article" => $id_article));
    } else {
        if ($id_mot_ancien != $id_mot) {
            // on delie l'ancien mot
            objet_dissocier(array("mot" => $id_mot_ancien), array("article" => $id_article));
            // on lie le nouveau
            objet_associer(array("mot" => $id_mot), array("article" => $id_article));
        }
    }
    // on invalide le cache
    include_spip('inc/invalideur');
    suivre_invalideur("id='id_article/{$id_article}'");
    if ($retour) {
        include_spip('inc/headers');
        $message .= redirige_formulaire($retour);
    }
    return $message;
}
Ejemplo n.º 2
0
/**
 * Action pour lier 2 objets entre eux
 *
 * L'argument attendu est `objet1-id1-objet2-id2` (type d'objet, identifiant)
 * tel que `mot-7-rubrique-3`.
 *
 * @uses objet_associer()
 *
 * @param null|string $arg
 *     Clé des arguments. En absence utilise l'argument
 *     de l'action sécurisée.
 * @return void
 */
function action_ajouter_lien_dist($arg = null)
{
    if (is_null($arg)) {
        $securiser_action = charger_fonction('securiser_action', 'inc');
        $arg = $securiser_action();
    }
    $arg = explode("-", $arg);
    list($objet_source, $ids, $objet_lie, $idl) = $arg;
    include_spip('action/editer_liens');
    objet_associer(array($objet_source => $ids), array($objet_lie => $idl));
}
Ejemplo n.º 3
0
function inc_marquer_doublons_doc_dist($champs, $id, $type, $id_table_objet, $table_objet, $spip_table_objet, $desc = array(), $serveur = '')
{
    $champs_selection = array();
    foreach ($GLOBALS['medias_liste_champs'] as $champs_choisis) {
        if (isset($champs[$champs_choisis])) {
            array_push($champs_selection, $champs_choisis);
        }
    }
    if (count($champs_selection) == 0) {
        return;
    }
    if (!$desc) {
        $trouver_table = charger_fonction('trouver_table', 'base');
        $desc = $trouver_table($table_objet, $serveur);
    }
    $load = "";
    // charger le champ manquant en cas de modif partielle de l	'objet
    // seulement si le champ existe dans la table demande
    $champs_a_traiter = "";
    foreach ($champs_selection as $champs_a_parcourir) {
        if (isset($desc['field'][$champs_a_parcourir])) {
            $load = $champs_a_parcourir;
            $champs_a_traiter .= $champs[$champs_a_parcourir];
        }
    }
    if ($load) {
        $champs[$load] = "";
        $row = sql_fetsel($load, $spip_table_objet, "{$id_table_objet}=" . sql_quote($id));
        if ($row and isset($row[$load])) {
            $champs[$load] = $row[$load];
        }
    }
    include_spip('inc/texte');
    include_spip('base/abstract_sql');
    include_spip('action/editer_liens');
    include_spip('base/objets');
    $modeles = lister_tables_objets_sql('spip_documents');
    $modeles = $modeles['modeles'];
    $GLOBALS['doublons_documents_inclus'] = array();
    $env = array('objet' => $type, 'id_objet' => $id, $id_table_objet => $id);
    traiter_modeles($champs_a_traiter, array('documents' => $modeles), '', '', null, $env);
    // detecter les doublons
    objet_qualifier_liens(array('document' => '*'), array($type => $id), array('vu' => 'non'));
    if (count($GLOBALS['doublons_documents_inclus'])) {
        // on repasse par une requete sur spip_documents pour verifier que les documents existent bien !
        $in_liste = sql_in('id_document', $GLOBALS['doublons_documents_inclus']);
        $res = sql_allfetsel("id_document", "spip_documents", $in_liste);
        $res = array_map('reset', $res);
        // Creer le lien s'il n'existe pas deja
        objet_associer(array('document' => $res), array($type => $id), array('vu' => 'oui'));
        objet_qualifier_liens(array('document' => $res), array($type => $id), array('vu' => 'oui'));
    }
}
/**
 * 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']);
                }
            }
        }
    }
}
/**
 * À chaque insertion d'un nouvel objet editorial
 * auquel on a attaché des documents, restituer l'identifiant
 * du nouvel objet crée sur les liaisons documents/objet,
 * qui ont ponctuellement un identifiant id_objet négatif.
 *
 * @see medias_affiche_gauche()
 * @pipeline post_insertion
 *
 * @param array $flux
 *     Données du pipeline
 * @return array
 *     Données du pipeline
 **/
function medias_post_insertion($flux)
{
    $objet = objet_type($flux['args']['table']);
    $id_objet = $flux['args']['id_objet'];
    include_spip('inc/autoriser');
    if (autoriser('joindredocument', $objet, $id_objet) and $id_auteur = intval($GLOBALS['visiteur_session']['id_auteur'])) {
        # cf. HACK medias_affiche_gauche()
        # rattrapper les documents associes a cet objet nouveau
        # ils ont un id = 0-id_auteur
        # utiliser l'api editer_lien pour les appels aux pipeline edition_lien
        include_spip('action/editer_liens');
        $liens = objet_trouver_liens(array('document' => '*'), array($objet => 0 - $id_auteur));
        foreach ($liens as $lien) {
            objet_associer(array('document' => $lien['document']), array($objet => $id_objet), $lien);
        }
        // un simple delete pour supprimer les liens temporaires
        sql_delete("spip_documents_liens", array("id_objet = " . (0 - $id_auteur), "objet=" . sql_quote($objet)));
    }
    return $flux;
}
Ejemplo n.º 6
0
function formulaires_lier_album_traiter($id_article)
{
    $id_collection = _request('pid_objet');
    include_spip('action/editer_liens');
    if (autoriser('lierobjet', 'collection', $id_collection)) {
        $rang = sql_countsel('spip_collections_liens', 'id_collection=' . intval($id_collection));
        $association = objet_associer(array('collection' => $id_collection), array('article' => $id_article), array('id_auteur' => $GLOBALS['visiteur_session']['id_auteur'] ? $GLOBALS['visiteur_session']['id_auteur'] : 0, 'rang' => $rang + 1));
    }
    if (!$association) {
        return $res['message_erreur'] = _T('collection:erreur_association_collection');
    } else {
        $organiser = charger_fonction('collection_organiser_rangs', 'inc');
        $organiser($id_collection);
        include_spip('inc/invalideur');
        suivre_invalideur('1');
    }
    $message['editable'] = true;
    $message['message_ok'] = '<script type="text/javascript">if (window.jQuery) ajaxReload("albums");</script>';
    return $message;
}
/**
 * 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;
    }
}
/**
 * Trouver les documents utilisés dans le texte d'un objet et enregistrer cette liaison comme vue.
 *
 * La liste des champs susceptibles de contenir des documents ou images est indiquée
 * par la globale `medias_liste_champs` (un tableau).
 *
 * Le contenu de ces champs (du moins ceux qui existent pour l'objet demandé) est récupéré et analysé.
 * La présence d'un modèle de document dans ces contenus, tel que imgXX, docXX ou embXX
 * indique que le document est utilisé et doit être lié à l'objet, avec le champ `vu=oui`
 *
 * S'il y avait des anciens liens avec vu=oui qui n'ont plus lieu d'être, ils passent à non.
 *
 * @note
 *     La fonction pourrait avoir bien moins d'arguments : seuls $champs, $id, $type ou $objet, $desc, $serveur
 *     sont nécessaires. On calcule $desc s'il est absent, et il contient toutes les infos…
 *
 * @param array $champs
 *     Couples [champ => valeur] connus de l'objet
 * @param int $id
 *     Identifiant de l'objet
 * @param string $type
 *     Type d'objet éditorial (ex: article)
 * @param string $id_table_objet
 *     Nom de la clé primaire sur la table sql de l'objet
 * @param string $table_objet
 *     Nom de l'objet éditorial (ex: articles)
 * @param string $spip_table_objet
 *     Nom de la table sql de l'objet
 * @param array $desc
 *     Description de l'objet, si déjà calculé
 * @param string $serveur
 *     Serveur sql utilisé.
 * @return void|null
 **/
function inc_marquer_doublons_doc_dist($champs, $id, $type, $id_table_objet, $table_objet, $spip_table_objet, $desc = array(), $serveur = '')
{
    // On conserve uniquement les champs qui modifient le calcul des doublons de documents
    // S'il n'il en a aucun, les doublons ne sont pas impactés, donc rien à faire d'autre..
    if (!($champs = array_intersect_key($champs, array_flip($GLOBALS['medias_liste_champs'])))) {
        return;
    }
    if (!$desc) {
        $trouver_table = charger_fonction('trouver_table', 'base');
        $desc = $trouver_table($table_objet, $serveur);
    }
    // Il faut récupérer toutes les données qui impactent les liens de documents vus
    // afin de savoir lesquels sont présents dans les textes, et pouvoir actualiser avec
    // les liens actuellement enregistrés.
    $absents = array();
    // Récupérer chaque champ impactant qui existe dans la table de l'objet et qui nous manque
    foreach ($GLOBALS['medias_liste_champs'] as $champ) {
        if (isset($desc['field'][$champ]) and !isset($champs[$champ])) {
            $absents[] = $champ;
        }
    }
    // Retrouver les textes des champs manquants
    if ($absents) {
        $row = sql_fetsel($absents, $spip_table_objet, "{$id_table_objet}=" . sql_quote($id));
        if ($row) {
            $champs = array_merge($row, $champs);
        }
    }
    include_spip('inc/texte');
    include_spip('base/abstract_sql');
    include_spip('action/editer_liens');
    include_spip('base/objets');
    // récupérer la liste des modèles qui considèrent un document comme vu s'ils sont utilisés dans un texte
    $modeles = lister_tables_objets_sql('spip_documents');
    $modeles = $modeles['modeles'];
    // liste d'id_documents trouvés dans les textes
    $GLOBALS['doublons_documents_inclus'] = array();
    // detecter les doublons dans ces textes
    traiter_modeles(implode(" ", $champs), array('documents' => $modeles), '', '', null, array('objet' => $type, 'id_objet' => $id, $id_table_objet => $id));
    $texte_documents_vus = $GLOBALS['doublons_documents_inclus'];
    // on ne modifie les liaisons que si c'est nécessaire
    $bdd_documents_vus = array('oui' => array(), 'non' => array());
    $liaisons = objet_trouver_liens(array('document' => '*'), array($type => $id));
    foreach ($liaisons as $l) {
        $bdd_documents_vus[$l['vu']][] = $l['id_document'];
    }
    // il y a des nouveaux documents vus dans le texte
    $nouveaux = array_diff($texte_documents_vus, $bdd_documents_vus['oui']);
    // il y a des anciens documents vus dans la bdd
    $anciens = array_diff($bdd_documents_vus['oui'], $texte_documents_vus);
    if ($nouveaux) {
        // on vérifie que les documents indiqués vus existent réellement tout de même (en cas d'erreur de saisie)
        $ids = sql_allfetsel("id_document", "spip_documents", sql_in('id_document', $nouveaux));
        $ids = array_map('reset', $ids);
        if ($ids) {
            // Creer le lien s'il n'existe pas déjà
            objet_associer(array('document' => $ids), array($type => $id), array('vu' => 'oui'));
            objet_qualifier_liens(array('document' => $ids), array($type => $id), array('vu' => 'oui'));
        }
    }
    if ($anciens) {
        objet_qualifier_liens(array('document' => $anciens), array($type => $id), array('vu' => 'non'));
    }
}
Ejemplo n.º 9
0
/**
 * Ajoute les liens demandés en prenant éventuellement en compte le rôle
 *
 * Appelle la fonction objet_associer. L'appelle autant de fois qu'il y
 * a de rôles demandés pour cette liaison.
 *
 * @internal
 * @param string $objet_source Objet source de la liaison (qui a la table de liaison)
 * @param array|string $ids Identifiants pour l'objet source
 * @param string $objet_lien Objet à lier
 * @param array|string $idl Identifiants pour l'objet lié
 * @param array $qualifs
 * @return void
 **/
function lien_ajouter_liaisons($objet_source, $ids, $objet_lien, $idl, $qualifs)
{
    // retrouver la colonne de roles s'il y en a a lier
    if (is_array($qualifs) and count($qualifs)) {
        foreach ($qualifs as $qualif) {
            objet_associer(array($objet_source => $ids), array($objet_lien => $idl), $qualif);
        }
    } else {
        objet_associer(array($objet_source => $ids), array($objet_lien => $idl));
    }
}
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));
        }
    }
}
Ejemplo n.º 11
0
/**
 * Associer un mot a des objets listes sous forme
 * array($objet=>$id_objets,...)
 * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
 *
 * on peut passer optionnellement une qualification du (des) lien(s) qui sera
 * alors appliquee dans la foulee.
 * En cas de lot de liens, c'est la meme qualification qui est appliquee a tous
 *
 * Exemples:
 * mot_associer(3, array('auteur'=>2));
 * mot_associer(3, array('auteur'=>2), array('vu'=>'oui)); // ne fonctionnera pas ici car pas de champ 'vu' sur spip_mots_liens
 * 
 * @param int $id_mot
 * @param array $objets
 * @param array $qualif
 * @return string
 */
function mot_associer($id_mot, $objets, $qualif = null)
{
    include_spip('action/editer_liens');
    // si il s'agit d'un groupe avec 'unseul', alors supprimer d'abord les autres
    // mots de ce groupe associe a ces objets
    $id_groupe = sql_getfetsel('id_groupe', 'spip_mots', 'id_mot=' . intval($id_mot));
    if (un_seul_mot_dans_groupe($id_groupe)) {
        $mots_groupe = sql_allfetsel("id_mot", "spip_mots", "id_groupe=" . intval($id_groupe));
        $mots_groupe = array_map('reset', $mots_groupe);
        objet_dissocier(array('mot' => $mots_groupe), $objets);
    }
    return objet_associer(array('mot' => $id_mot), $objets, $qualif);
}
Ejemplo n.º 12
0
function agenda_post_edition_lien($flux)
{
    // Si on est en train de lier ou délier quelque chose a un événement
    if ($flux['args']['objet'] == 'evenement') {
        // On cherche si cet événement a des répétitions
        if ($id_evenement = $flux['args']['id_objet'] and $id_evenement > 0 and $repetitions = sql_allfetsel('id_evenement', 'spip_evenements', 'id_evenement_source = ' . $id_evenement) and is_array($repetitions)) {
            include_spip('action/editer_liens');
            // On a la liste des ids des répétitions
            $repetitions = array_map('reset', $repetitions);
            // Si c'est un ajout de lien, on l'ajoute à toutes les répétitions
            if ($flux['args']['action'] == 'insert') {
                objet_associer(array($flux['args']['objet_source'] => $flux['args']['id_objet_source']), array('evenement' => $repetitions));
            } elseif ($flux['args']['action'] == 'delete') {
                objet_dissocier(array($flux['args']['objet_source'] => $flux['args']['id_objet_source']), array('evenement' => $repetitions));
            }
        }
    }
    return $flux;
}
/**
 * Gerer le renouvellement lors de la notification de paiement d'une echeance par le presta bancaire
 *
 * @param array
 * @return array
 */
function souscription_bank_abos_renouveler($flux)
{
    if (!$flux['data']) {
        $id = $flux['args']['id'];
        if (strncmp($id, "uid:", 4) == 0) {
            $where = "abonne_uid=" . sql_quote(substr($id, 4));
        } else {
            $where = "id_souscription=" . intval($id);
        }
        if ($row = sql_fetsel("*", "spip_souscriptions", $where, '', 'date_souscription DESC')) {
            $options = array('auteur' => $row['courriel'], 'parrain' => 'souscription', 'tracking_id' => $row['id_souscription'], 'id_auteur' => $row['id_auteur']);
            $inserer_transaction = charger_fonction("inserer_transaction", "bank");
            include_spip("action/editer_liens");
            // verifier que c'est bien l'echeance attendue
            // et sinon generer des transactions offline de rattrapage
            if (!intval($row["date_echeance"])) {
                $row["date_echeance"] = $row["date_souscription"];
            }
            $date_echeance = $row['date_echeance'];
            $datem45 = date('Y-m-d H:i:s', strtotime("-45 day"));
            while ($date_echeance < $datem45) {
                $o = $options;
                $o['champs']['date_transaction'] = $date_echeance;
                $o['champs']['mode'] = 'offline';
                $prochaine_echeance = date('Y-m-d H:i:s', strtotime("+1 month", strtotime($date_echeance)));
                if ($id_transaction = $inserer_transaction($row['montant'], $o)) {
                    // regler la transacton offline
                    $regler_transaction = charger_fonction('regler_transaction', 'bank');
                    $regler_transaction($id_transaction);
                    // mettre a jour la souscription
                    $set = array('statut' => 'ok', 'abo_statut' => 'ok', 'montant_cumul' => round(floatval($row['montant_cumul']) + floatval($row['montant']), 2), 'date_echeance' => $prochaine_echeance, 'abo_fin_raison' => '');
                    sql_updateq('spip_souscriptions', $set, "id_souscription=" . intval($row['id_souscription']));
                    $row = sql_fetsel("*", "spip_souscriptions", "id_souscription=" . intval($row['id_souscription']));
                    objet_associer(array("souscription" => $row['id_souscription']), array("transaction" => $id_transaction));
                }
                $date_echeance = $prochaine_echeance;
            }
            // si il y a deja eu une transaction echeance il y a moins de 15j sur cette souscription
            // c'est un double appel, renvoyer l'id_transaction concerne
            $datem15 = date('Y-m-d H:i:s', strtotime("-15 day"));
            if ($id_transaction = sql_getfetsel("id_transaction", "spip_transactions", "statut<>" . sql_quote('commande') . " AND date_transaction>" . sql_quote($datem15) . " AND parrain=" . sql_quote('souscription') . " AND tracking_id=" . intval($row['id_souscription']) . " AND id_auteur=" . intval($row['id_auteur']), "", "date_transaction")) {
                $flux['data'] = $id_transaction;
            } elseif ($id_transaction = $inserer_transaction($row['montant'], $options)) {
                $prochaine_echeance = $row['date_echeance'];
                $datep15 = date('Y-m-d H:i:s', strtotime("+15 day"));
                // recaler la prochaine echeance si trop en avance (double appel anterieur ou erreur de calcul)
                while ($prochaine_echeance > $datep15) {
                    $prochaine_echeance = date('Y-m-d H:i:s', strtotime("-1 month", strtotime($prochaine_echeance)));
                }
                // l'incrementer pour atteindre celle du mois prochain
                while ($prochaine_echeance < $datep15) {
                    $prochaine_echeance = date('Y-m-d H:i:s', strtotime("+1 month", strtotime($prochaine_echeance)));
                }
                // a ce stade on ne sait pas encore si la transaction est reussie ou en echec
                // on ne peut donc pas incrementer le montant cumul, mais seulement mettre a jour les echeances etc
                // si echec => declenchera une resiliation
                // si succes => declenchera un traitement reglement ou l'on mettra a jour le cumul
                $set = array('id_transaction_echeance' => $id_transaction, 'statut' => 'ok', 'abo_statut' => 'ok', 'date_echeance' => $prochaine_echeance, 'abo_fin_raison' => '');
                sql_updateq('spip_souscriptions', $set, "id_souscription=" . intval($row['id_souscription']));
                $row = sql_fetsel("*", "spip_souscriptions", "id_souscription=" . intval($row['id_souscription']));
                objet_associer(array("souscription" => $row['id_souscription']), array("transaction" => $id_transaction));
                $flux['data'] = $id_transaction;
                // verifier si ce n'est pas la derniere transaction, auquel cas on notifie
                if ($row['date_echeance'] > $row['date_fin'] and $row['date_fin'] > $row['date_souscription']) {
                    // Notifications
                    if ($notifications = charger_fonction('notifications', 'inc', true)) {
                        $notifications('informersouscriptionterminee', $row['id_souscription']);
                    }
                }
            }
        }
    }
    return $flux;
}
Ejemplo n.º 14
0
/**
 * Chargement du formulaire d'édition de souscription
 *
 * Déclarer les champs postés et y intégrer les valeurs par défaut
 *
 * @uses formulaires_editer_objet_charger()
 *
 * @param int$id_souscription_campagne
 *     Identifiant de la campagne de souscription
 * @return array
 *     Retours des traitements
 */
function formulaires_souscription_traiter_dist($id_souscription_campagne)
{
    $lier_trad = 0;
    $config_fonc = '';
    $row = array();
    $hidden = '';
    $retour = '';
    $ret = array();
    $campagne = sql_fetsel("*", "spip_souscription_campagnes", "id_souscription_campagne=" . intval($id_souscription_campagne));
    set_request("id_souscription_campagne", $id_souscription_campagne);
    set_request('type_souscription', $campagne['type_objectif']);
    if (!in_array(_request('envoyer_info'), array('on', 'off'))) {
        set_request('envoyer_info', 'off');
    }
    $where_deja = array('courriel=' . sql_quote(_request('courriel')), 'statut=' . sql_quote('prepa'), "date_souscription>" . sql_quote(date('Y-m-d H:i:s', strtotime("-1 day"))), 'id_souscription_campagne=' . intval($id_souscription_campagne));
    $erreurs = array();
    $montant = formulaires_souscription_trouver_montant($campagne, $erreurs);
    $abo = false;
    if (strncmp($montant, "abo", 3) == 0) {
        $abo = true;
        $montant = substr($montant, 3);
        set_request("abo_statut", "commande");
        $where_deja[] = 'abo_statut=' . sql_quote('commande');
    } else {
        $where_deja[] = 'abo_statut=' . sql_quote('non');
    }
    set_request('montant', $montant);
    $where_deja[] = 'montant=' . sql_quote($montant, '', 'text');
    // si on a une souscription du meme montant, meme email, en commande, qui date de moins de 24h
    // on la reutilise pour pas generer plein de souscription en base en cas de retour arriere/modif saisie/revalidation
    if (!($id_souscription = sql_getfetsel('id_souscription', 'spip_souscriptions', $where_deja))) {
        $id_souscription = 'new';
    }
    $ret = formulaires_editer_objet_traiter('souscription', $id_souscription, '', $lier_trad, $retour, $config_fonc, $row, $hidden);
    if ($ret['id_souscription']) {
        // recuperer l'id_auteur de la souscription, qui a pu etre renseigne en post_edition par un autre plugin
        // ou recupere de la session courante hors espace prive
        $souscription = sql_fetsel("*", "spip_souscriptions", "id_souscription=" . intval($ret['id_souscription']));
        $id_auteur = $souscription['id_auteur'];
        // generer la transaction et l'associer a la souscription
        $inserer_transaction = charger_fonction('inserer_transaction', 'bank');
        $options = array("auteur" => _request('courriel'), "id_auteur" => $id_auteur, "parrain" => "souscription", "tracking_id" => $ret['id_souscription'], "force" => false);
        if ($id_transaction = $inserer_transaction($montant, $options) and $hash = sql_getfetsel('transaction_hash', "spip_transactions", "id_transaction=" . intval($id_transaction))) {
            // associer transaction et souscription
            include_spip("action/editer_liens");
            objet_associer(array("souscription" => $ret['id_souscription']), array("transaction" => $id_transaction));
            sql_updateq("spip_souscriptions", array('id_transaction_echeance' => $id_transaction), "id_souscription=" . intval($ret['id_souscription']));
            // si pas d'auteur ni en base ni en session, passer nom et prenom en session pour un eventuel usage dans le paiement (SEPA)
            if (!$id_auteur and (!isset($GLOBALS['visiteur_session']['id_auteur']) or !$GLOBALS['visiteur_session']['id_auteur'])) {
                include_spip('inc/session');
                if ($souscription['nom']) {
                    session_set("session_nom", $souscription['nom']);
                }
                if ($souscription['prenom']) {
                    session_set("session_prenom", $souscription['prenom']);
                }
            }
            $target = $abo ? "payer-abonnement" : "payer-acte";
            spip_log(sprintf("La souscription [%s], associee a la transaction [%s] a bien ete cree.", $ret['id_souscription'], $id_transaction), "souscription");
            if (lire_config("souscription/processus_paiement", "redirige") === "redirige") {
                $ret['redirect'] = generer_url_public($target, "id_transaction={$id_transaction}&transaction_hash={$hash}", false, false);
            } else {
                $ret['message_ok'] = _T('souscription:message_regler_votre_' . $campagne['type_objectif']);
                $GLOBALS['formulaires_souscription_paiement'] = recuperer_fond("content/{$target}", array('id_transaction' => $id_transaction, 'transaction_hash' => $hash, 'class' => 'souscription_paiement'));
            }
        } else {
            spip_log(sprintf("Erreur lors de la creation de la transaction liee a la souscription [%s].", $ret['id_souscription']), "souscription");
            $ret['message_erreur'] = _T('souscription:erreur_echec_creation_transaction');
        }
    }
    // si API newsletter est dispo ET que case inscription est cochee, inscrire a la newsletter
    if (_request("envoyer_info") === "on" and $subscribe = charger_fonction("subscribe", "newsletter", true)) {
        $email = _request("courriel");
        $nom = array(_request("prenom"), _request("nom"));
        $nom = array_filter($nom);
        $nom = implode(" ", $nom);
        $subscribe($email, array('nom' => $nom));
    }
    return $ret;
}
Ejemplo n.º 15
0
/**
 * Dupliquer tous les liens entrant ou sortants d'un objet
 * vers un autre (meme type d'objet, mais id different)
 * si $types est fourni, seuls les liens depuis/vers les types listes seront copies
 * si $exclure_types est fourni, les liens depuis/vers les types listes seront ignores
 *
 * @api
 * @param string $objet
 * @param int $id_source
 * @param int $id_cible
 * @param array $types
 * @param array $exclure_types
 * @return int
 *     Nombre de liens copiés
 */
function objet_dupliquer_liens($objet, $id_source, $id_cible, $types = null, $exclure_types = null)
{
    include_spip('base/objets');
    $tables = lister_tables_objets_sql();
    $n = 0;
    foreach ($tables as $table_sql => $infos) {
        if ((is_null($types) or in_array($infos['type'], $types)) and (is_null($exclure_types) or !in_array($infos['type'], $exclure_types))) {
            if (objet_associable($infos['type'])) {
                $liens = $infos['type'] == $objet ? objet_trouver_liens(array($objet => $id_source), '*') : objet_trouver_liens(array($infos['type'] => '*'), array($objet => $id_source));
                foreach ($liens as $lien) {
                    $n++;
                    if ($infos['type'] == $objet) {
                        objet_associer(array($objet => $id_cible), array($lien['objet'] => $lien[$lien['objet']]), $lien);
                    } else {
                        objet_associer(array($infos['type'] => $lien[$infos['type']]), array($objet => $id_cible), $lien);
                    }
                }
            }
        }
    }
    return $n;
}
Ejemplo n.º 16
0
/**
 * Mettre à jour les liens objets/zones.
 * 
 * @param int|array|string $zones
 *     Identifiant ou liste d'identifiants zones à affecter.
 *     Si zones vaut '', associe toutes les zones a(aux) objets(s).
 * @param string $type
 *     Type d'objet (rubrique, auteur).
 * @param int|array $ids
 *     Identifiant ou liste d'identifiants de l'objet
 * @param string $operation
 *     Action à effectuer parmi `add`, `set` ou `del` pour ajouter, affecter uniquement,
 *     ou supprimer les objets listés dans ids.
 */
function zone_lier($zones, $type, $ids, $operation = 'add')
{
    include_spip('inc/autoriser');
    include_spip('action/editer_liens');
    if (!$zones) {
        $zones = "*";
    }
    if (!$ids) {
        $ids = array();
    } elseif (!is_array($ids)) {
        $ids = array($ids);
    }
    if ($operation == 'del') {
        // on supprime les ids listes
        objet_dissocier(array('zone' => $zones), array($type => $ids));
    } else {
        // si c'est une affectation exhaustive, supprimer les existants qui ne sont pas dans ids
        // si c'est un ajout, ne rien effacer
        if ($operation == 'set') {
            objet_dissocier(array('zone' => $zones), array($type => array("NOT", $ids)));
            // bugfix temporaire : objet_associer ne gere pas id=0
            if (!in_array(0, $ids) and $type == "rubrique") {
                sql_delete("spip_zones_liens", "id_zone=" . intval($zones) . " AND id_objet=0 AND objet=" . sql_quote($type));
            }
        }
        foreach ($ids as $id) {
            if (autoriser('affecterzones', $type, $id, null, array('id_zone' => $zones))) {
                // bugfix temporaire : objet_associer ne gere pas id=0
                if ($id == 0 and $type == "rubrique") {
                    sql_insertq("spip_zones_liens", array('id_zone' => $zones, "id_objet" => $id, "objet" => $type));
                } else {
                    objet_associer(array('zone' => $zones), array($type => $id));
                }
            }
        }
    }
}
Ejemplo n.º 17
0
function csv2auteurs_ajout_utilisateur($login, $Tauteur_csv, $Tnom_champs_bdd, $Tcorrespondances, $tableau_bdd_rubriques_admins, $tableau_bdd_zones_admins, $id_auteur = 0)
{
    $set = $Tzones = $Trubadmin = array();
    foreach ($Tauteur_csv as $champ => $valeur) {
        if ($champ == "ss_groupe") {
            $T = explode('|', $valeur);
            foreach ($T as $rub) {
                $Trubadmin[] = array_search(strtolower($rub), $tableau_bdd_rubriques_admins);
            }
        }
        if ($champ == "zone") {
            $T = explode('|', $valeur);
            foreach ($T as $zone) {
                $Tzones[] = array_search(trim(rtrim(strtolower($zone))), $tableau_bdd_zones_admins);
            }
            //spip_log("tzone de id_auteur $id_auteur","csvspip");
            //spip_log($Tzones,"csvspip");
        }
        if (in_array($champ, $Tnom_champs_bdd)) {
            $set[$champ] = ($champ == "statut" and array_key_exists($valeur, $Tcorrespondances)) ? $Tcorrespondances[$valeur] : $valeur;
        }
    }
    //inserer l'auteur si il n'y a pas d'id_auteur transmis
    if (!$id_auteur) {
        $id_auteur = auteur_inserer();
    }
    // remplir les champs ou les maj
    auteur_modifier($id_auteur, $set);
    //liaison des rubriques
    if (count($Trubadmin) and $set["statut"] == "0minirezo") {
        objet_associer(array("auteur" => $id_auteur), array("rubrique" => $Trubadmin));
    }
    //liaison des zones
    if (count($Tzones) and test_plugin_actif("accesrestreint") and test_plugin_actif("accesrestreint")) {
        zone_lier($Tzones, 'auteur', $id_auteur, 'add');
    }
}
Ejemplo n.º 18
0
/**
 * Traiter le post des informations d'édition de liens
 * 
 * Les formulaires postent dans trois variables ajouter_lien et supprimer_lien
 * et remplacer_lien
 *
 * Les deux premieres peuvent etre de trois formes differentes :
 * ajouter_lien[]="objet1-id1-objet2-id2"
 * ajouter_lien[objet1-id1-objet2-id2]="nimportequoi"
 * ajouter_lien['clenonnumerique']="objet1-id1-objet2-id2"
 * Dans ce dernier cas, la valeur ne sera prise en compte
 * que si _request('clenonnumerique') est vrai (submit associe a l'input)
 *
 * remplacer_lien doit etre de la forme
 * remplacer_lien[objet1-id1-objet2-id2]="objet3-id3-objet2-id2"
 * ou objet1-id1 est celui qu'on enleve et objet3-id3 celui qu'on ajoute
 *
 * @param string $a
 * @param string|int $b
 * @param int|string $c
 * @param bool $editable
 * @return array
 */
function formulaires_editer_liens_traiter_dist($a, $b, $c, $editable = true)
{
    $res = array('editable' => $editable ? true : false);
    list($table_source, $objet, $id_objet, $objet_lien) = determine_source_lien_objet($a, $b, $c);
    if (!$table_source or !$objet or !$objet_lien) {
        return $res;
    }
    if (_request('tout_voir')) {
        set_request('recherche', '');
    }
    if (autoriser('modifier', $objet, $id_objet)) {
        // annuler les suppressions du coup d'avant !
        if (_request('annuler_oups') and $oups = _request('_oups') and $oups = unserialize($oups)) {
            $objet_source = objet_type($table_source);
            include_spip('action/editer_liens');
            foreach ($oups as $oup) {
                if ($objet_lien == $objet_source) {
                    objet_associer(array($objet_source => $oup[$objet_source]), array($objet => $oup[$objet]), $oup);
                } else {
                    objet_associer(array($objet => $oup[$objet]), array($objet_source => $oup[$objet_source]), $oup);
                }
            }
            # oups ne persiste que pour la derniere action, si suppression
            set_request('_oups');
        }
        $supprimer = _request('supprimer_lien');
        $ajouter = _request('ajouter_lien');
        // il est possible de preciser dans une seule variable un remplacement :
        // remplacer_lien[old][new]
        if ($remplacer = _request('remplacer_lien')) {
            foreach ($remplacer as $k => $v) {
                if ($old = lien_verifier_action($k, '')) {
                    foreach (is_array($v) ? $v : array($v) as $kn => $vn) {
                        if ($new = lien_verifier_action($kn, $vn)) {
                            $supprimer[$old] = 'x';
                            $ajouter[$new] = '+';
                        }
                    }
                }
            }
        }
        if ($supprimer) {
            include_spip('action/editer_liens');
            $oups = array();
            foreach ($supprimer as $k => $v) {
                if ($lien = lien_verifier_action($k, $v)) {
                    $lien = explode("-", $lien);
                    list($objet_source, $ids, $objet_lie, $idl) = $lien;
                    if ($objet_lien == $objet_source) {
                        $oups = array_merge($oups, objet_trouver_liens(array($objet_source => $ids), array($objet_lie => $idl)));
                        objet_dissocier(array($objet_source => $ids), array($objet_lie => $idl));
                    } else {
                        $oups = array_merge($oups, objet_trouver_liens(array($objet_lie => $idl), array($objet_source => $ids)));
                        objet_dissocier(array($objet_lie => $idl), array($objet_source => $ids));
                    }
                }
            }
            set_request('_oups', $oups ? serialize($oups) : null);
        }
        if ($ajouter) {
            $ajout_ok = false;
            include_spip('action/editer_liens');
            foreach ($ajouter as $k => $v) {
                if ($lien = lien_verifier_action($k, $v)) {
                    $ajout_ok = true;
                    list($objet1, $ids, $objet2, $idl) = explode("-", $lien);
                    if ($objet_lien == $objet1) {
                        objet_associer(array($objet1 => $ids), array($objet2 => $idl));
                    } else {
                        objet_associer(array($objet2 => $idl), array($objet1 => $ids));
                    }
                    set_request('id_lien_ajoute', $ids);
                }
            }
            # oups ne persiste que pour la derniere action, si suppression
            # une suppression suivie d'un ajout dans le meme hit est un remplacement
            # non annulable !
            if ($ajout_ok) {
                set_request('_oups');
            }
        }
    }
    return $res;
}
Ejemplo n.º 19
0
/**
 * Marquer un message dans l'etat indique par $vu
 *
 * @param int $id_auteur
 * @param array $liste
 * @param string $vu
 * @return void
 */
function messagerie_marquer_message($id_auteur, $liste, $vu)
{
    include_spip('action/editer_liens');
    if (!is_array($liste)) {
        $liste = array($liste);
    }
    // completer les liens qui n'existent pas encore
    // ex : pour marquer lue une annonce, on ajoute le lien d'abord (n'existe pas)
    // puis on le marque 'oui'
    $liens = objet_trouver_liens(array('auteur' => $id_auteur), array('message' => $liste));
    $l = array();
    foreach ($liens as $lien) {
        $l[] = $lien['message'];
    }
    objet_associer(array('auteur' => $id_auteur), array('message' => array_diff($liste, $l)), array('vu' => $vu));
    // puis les marquer tous lus
    objet_qualifier_liens(array('auteur' => $id_auteur), array('message' => $liste), array('vu' => $vu));
    include_spip('inc/invalideur');
    suivre_invalideur("message/" . implode(',', $liste));
}
Ejemplo n.º 20
0
/**
 * Associer un auteur a des objets listes sous forme
 * array($objet=>$id_objets,...)
 * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type.
 *
 * On peut passer optionnellement une qualification du (des) lien(s) qui sera
 * alors appliquee dans la foulee.
 * En cas de lot de liens, c'est la meme qualification qui est appliquee a tous
 *
 * @param int $id_auteur
 * @param array $objets
 * @param array $qualif
 * @return string
 */
function auteur_associer($id_auteur, $objets, $qualif = null)
{
    include_spip('action/editer_liens');
    return objet_associer(array('auteur' => $id_auteur), $objets, $qualif);
}
Ejemplo n.º 21
0
/**
 * Revision des parents d'un document
 * chaque parent est liste au format objet|id_objet
 *
 * @param int $id_document
 * @param array $parents
 * @param bool $ajout
 */
function medias_revision_document_parents($id_document, $parents = null, $ajout = false)
{
    if (!is_array($parents)) {
        return;
    }
    $insertions = array();
    $objets_parents = array();
    // array('article'=>array(12,23))
    // au format objet|id_objet
    foreach ($parents as $p) {
        $p = explode('|', $p);
        if (preg_match('/^[a-z0-9_]+$/i', $objet = $p[0]) and $p[1] = intval($p[1])) {
            // securite
            $objets_parents[$p[0]][] = $p[1];
        }
    }
    include_spip('action/editer_liens');
    // les liens actuels
    $liens = objet_trouver_liens(array('document' => $id_document), '*');
    $deja_parents = array();
    // si ce n'est pas un ajout, il faut supprimer les liens actuels qui ne sont pas dans $objets_parents
    if (!$ajout) {
        foreach ($liens as $k => $lien) {
            if (!isset($objets_parents[$lien['objet']]) or !in_array($lien['id_objet'], $objets_parents[$lien['objet']])) {
                objet_dissocier(array('document' => $id_document), array($lien['objet'] => $lien['id_objet']));
                unset($liens[$k]);
            } else {
                $deja_parents[$lien['objet']][] = $lien['id_objet'];
            }
        }
    }
    objet_associer(array('document' => $id_document), $objets_parents);
}