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; }
/** * 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)); }
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; }
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')); } }
/** * 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)); } } }
/** * 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); }
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; }
/** * 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; }
/** * 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; }
/** * 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)); } } } } }
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'); } }
/** * 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; }
/** * 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)); }
/** * 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); }
/** * 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); }