/** * Action de mise à jour des descriptions d'un dépot * * @return array * Liste identifiant du dépot, texte d'erreur éventuel **/ function action_editer_depot_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); // Verification des autorisations if (!autoriser('webmestre')) { include_spip('inc/minipres'); echo minipres(); exit; } // Le depot n'est jamais cree par une edition mais via le formulaire ajouter_depot // On est toujours en presence d'une mise a jour pour cette action, l'id_depot // doit donc etre renseigne sinon c'est une erreur if ($id_depot = intval($arg)) { // On teste si l'auteur est connecte. Si non on renvoie sur le formulaire login $id_auteur = $GLOBALS['visiteur_session']['id_auteur']; if (!$id_auteur) { include_spip('inc/headers'); redirige_url_ecrire(); } // On met a jour le depot avec les saisies if (sql_updateq('spip_depots', array('titre' => _request('titre'), 'descriptif' => _request('descriptif'), 'type' => _request('type')), 'id_depot=' . sql_quote($id_depot))) { } // Enregistre l'envoi dans la BD // Dans le cas du depot rien n'est fait actuellement, on garde cette fonction // par souci de coherence avec les autres editions d'objet et pour usage futur $err = depots_set($id_depot); if (!$err) { spip_log("ACTION MODIFIER DEPOT (manuel) : id_depot = " . $id_depot, 'svp_actions.' . _LOG_INFO); } } return array($id_depot, $err); }
function action_factures_export_csv_mensuel_dist() { $securiser_action = charger_fonction("securiser_action", "inc"); $date = $securiser_action(); $t = strtotime($date); $date_debut = date('Y-m-01 00:00:00', $t); $t = strtotime('+1 month', strtotime($date_debut)); $t = strtotime('+5 day', $t); $date_fin = date('Y-m-01 00:00:00', $t); $entetes = array('ID', 'Date', 'No', 'Client', 'HT', 'TTC', 'Paye', 'Date paiement', 'Commande'); $factures = sql_allfetsel("id_facture,date,no_comptable,id_auteur,montant_ht,montant,montant_regle,date_paiement", "spip_factures", "date>=" . sql_quote($date_debut) . " AND date<" . sql_quote($date_fin), '', 'id_facture'); foreach ($factures as $k => $facture) { $factures[$k]['date'] = date('d/m/Y', strtotime($facture['date'])); $factures[$k]['date_paiement'] = date('d/m/Y', strtotime($facture['date_paiement'])); $nom = sql_getfetsel('nom', 'spip_auteurs', 'id_auteur=' . intval($facture['id_auteur'])); $factures[$k]['id_auteur'] = trim($nom . " #" . $facture['id_auteur']); $factures[$k]['commande'] = ''; if ($trans = sql_fetsel("*", "spip_transactions", "id_facture=" . intval($facture['id_facture'])) and $id_commande = intval($trans['id_commande'])) { $reference = sql_getfetsel('reference', 'spip_commandes', 'id_commande=' . intval($id_commande)); $factures[$k]['commande'] = trim($reference . " #" . $trans['id_commande']); } } $factures = array_map('array_values', $factures); $nom = $GLOBALS['meta']['nom_site'] . ' Factures ' . date('Y-m'); $exporter_csv = charger_fonction('exporter_csv', 'inc'); $exporter_csv($nom, $factures, ',', $entetes, true); }
/** * Fonction de désinstallation du plugin. **/ function roles_auteurs_vider_tables($nom_meta_base_version) { // tant qu'il existe des doublons, on supprime une ligne doublonnée // sinon on ne pourra pas modifier la cle primaire ensuite // cet algo est certainement a optimiser while ($doublons = sql_allfetsel( array('id_auteur', 'id_objet', 'objet', 'role'), array('spip_auteurs_liens'), '', 'id_auteur,id_objet,objet', '', '', 'COUNT(*) > 1')) { foreach ($doublons as $d) { $where = array(); foreach ($d as $cle=>$valeur) { $where[] = "$cle=".sql_quote($valeur); } sql_delete('spip_auteurs_liens', $where); } } // supprimer la clé primaire, la colonne rôle, et remettre l'ancienne clé primaire sql_alter("TABLE spip_auteurs_liens DROP PRIMARY KEY"); sql_alter("TABLE spip_auteurs_liens DROP COLUMN role"); sql_alter("TABLE spip_auteurs_liens ADD PRIMARY KEY (id_auteur,id_objet,objet)"); effacer_meta($nom_meta_base_version); }
function action_clevermail_list_subscriber_remove_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); $lsr_id = $arg; if (sql_countsel("spip_cm_lists_subscribers", "lsr_id=" . sql_quote($lsr_id)) == 1) { include_spip('inc/autoriser'); if (autoriser('supprimer', 'cm_list_subscriber', sql_quote($lsr_id))) { $abonnement = sql_fetsel("sub_id, lst_id", "spip_cm_lists_subscribers", "lsr_id=" . sql_quote($lsr_id)); $abonne = sql_getfetsel("sub_email", "spip_cm_subscribers", "sub_id=" . intval($abonnement['sub_id'])); $liste = sql_fetsel("lst_moderator_email, lst_name", "spip_cm_lists", "lst_id=" . intval($abonnement['lst_id'])); sql_delete("spip_cm_lists_subscribers", "lsr_id = " . sql_quote($lsr_id)); sql_delete("spip_cm_posts_queued", "sub_id = " . intval($abonnement['sub_id'])); if (sql_countsel("spip_cm_lists_subscribers", "sub_id=" . intval($abonnement['sub_id'])) == 0) { // No more subscription, subscriber address is removed sql_delete("spip_cm_pending", "sub_id = " . intval($abonnement['sub_id'])); sql_updateq("spip_cm_subscribers", array('sub_email' => md5($abonne) . '@example.com'), "sub_id = " . intval($abonnement['sub_id'])); } $destinataire = $liste['lst_moderator_email']; $sujet = '[' . $liste['lst_name'] . '] Désinscription de ' . addslashes($abonne); $corps = _T('clevermail:mail_info_desinscription_corps', array('nom_site' => $GLOBALS['meta']['nom_site'], 'url_site' => $GLOBALS['meta']['adresse_site'], 'sub_email' => addslashes($abonne), 'lst_name' => $liste['lst_name'])); $expediteur = sql_getfetsel("set_value", "spip_cm_settings", "set_name='CM_MAIL_FROM'"); $envoyer_mail = charger_fonction('envoyer_mail', 'inc'); if ($envoyer_mail($destinataire, $sujet, $corps, $expediteur)) { spip_log('Envoie du mail OK', 'clevermail'); } else { spip_log('Envoie du mail KO', 'clevermail'); } spip_log('Suppression de l\'abonnement de « ' . $abonne . ' » à la liste « ' . $liste['lst_name'] . ' » (id=' . $abonnement['lst_id'] . ')', 'clevermail'); } } }
function action_spiplistes_liste_des_abonnes_dist () { include_spip('inc/autoriser'); include_spip('inc/spiplistes_api'); $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); if(!preg_match(",^(\d+) (\d+) (\S+)$,", $arg, $r)) { spiplistes_log("action_spiplistes_liste_des_abonnes_dist $arg pas compris"); return; } $id_liste = intval($r[1]); $debut = intval($r[2]); $tri = $r[3]; $redirect = rawurldecode(_request('redirect')); $statut_liste = ($id_liste > 0) ? sql_getfetsel('statut', 'spip_listes', "id_liste=".sql_quote($id_liste), '', '', 1) : false ; echo(spiplistes_listes_boite_abonnes ($id_liste, $statut_liste, $tri, $debut, $redirect)); exit(0); } //
function auth_ldap_dist($login, $pass, $serveur = '', $phpauth = false) { #spip_log("ldap $login " . ($pass ? "mdp fourni" : "mdp absent")); // Utilisateur connu ? // si http auth, inutile de reauthentifier: cela // ne marchera pas avec auth http autre que basic. $checkpass = isset($_SERVER["REMOTE_USER"]) ? false : true; if (!($dn = auth_ldap_search($login, $pass, $checkpass, $serveur))) { return array(); } $credentials_ldap = array('ldap_dn' => $dn, 'ldap_password' => $pass); // Si l'utilisateur figure deja dans la base, y recuperer les infos $r = sql_fetsel("*", "spip_auteurs", "login="******" AND source='ldap'", '', '', '', '', $serveur); if ($r) { return array_merge($r, $credentials_ldap); } // sinon importer les infos depuis LDAP, if ($GLOBALS['meta']["ldap_statut_import"] and $desc = auth_ldap_retrouver($dn, array(), $serveur)) { // rajouter le statut indique a l'install $desc['statut'] = $GLOBALS['meta']["ldap_statut_import"]; $desc['login'] = $login; $desc['source'] = 'ldap'; $desc['pass'] = ''; $r = sql_insertq('spip_auteurs', $desc, '', $serveur); } if ($r) { return array_merge($credentials_ldap, sql_fetsel("*", "spip_auteurs", "id_auteur=" . intval($r), '', '', '', '', $serveur)); } // sinon echec spip_log("Creation de l'auteur '{$login}' impossible"); return array(); }
function action_clevermail_list_subscriber_clear_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); if (sql_countsel("spip_cm_lists_subscribers AS list, spip_cm_subscribers AS sub", "list.sub_id = sub.sub_id AND sub.sub_email LIKE '*****@*****.**'")) { $subscribers = sql_select("sub.sub_id", "spip_cm_lists_subscribers AS list, spip_cm_subscribers AS sub", "list.sub_id = sub.sub_id AND sub.sub_email LIKE '*****@*****.**'", "list.sub_id", "", ""); $sub_deleted = ""; while ($subscriber = sql_fetch($subscribers)) { sql_delete("spip_cm_lists_subscribers", "sub_id = " . intval($subscriber['sub_id'])); sql_delete("spip_cm_pending", "sub_id = " . intval($subscriber['sub_id'])); $sub_deleted = $sub_deleted . ' ' . intval($subscriber['sub_id']); } spip_log('Suppression des abonnements ' . $sub_deleted, 'clevermail'); } else { spip_log('Il n\'y a pas d\'abonnement à supprimer', 'clevermail'); } if (sql_countsel("spip_cm_lists_subscribers", "", "lsr_id", "count(lsr_id) > 1") > 1) { $doublons = sql_select("lsr_id", "spip_cm_lists_subscribers", "", "lsr_id", "", "", "count(lsr_id) > 1"); while ($doublon = sql_fetch($doublons)) { $lists = sql_select("lst_id, sub_id", "spip_cm_lists_subscribers", "lsr_id ='" . $doublon['lsr_id'] . "'"); while ($list = sql_fetch($lists)) { sql_updateq("spip_cm_lists_subscribers", array('lsr_id' => md5('subscribe#' . intval($list['lst_id']) . '#' . intval($list['sub_id']) . '#' . time())), "lst_id=" . sql_quote($list['lst_id']) . " AND sub_id=" . sql_quote($list['sub_id'])); } } } //Récupération du timestamp du mois dernier $today = time(); $date_today = date("d:m:Y", $today); $today_exploded = explode(":", $date_today); $mois = (int) $today_exploded[1]; $mois = --$mois; $valid_date = mktime(0, 0, 0, $mois, $today_exploded[0], $today_exploded[2]); sql_delete("spip_cm_pending", "pnd_action_date <" . $valid_date); spip_log('Suppression des abonnements en attente depuis plus d\'un mois', 'clevermail'); }
function action_instituer_forum_sujet_dist() { static $statuts_sujet = array('verrou_on' => 'verrouille', 'verrou_off' => 'verrouille', 'resolu_on' => 'resolu', 'resolu_off' => 'resolu'); $securiser_action = charger_fonction('securiser_action', 'inc'); $args = $securiser_action(); list($objet, $id_forum, $action) = explode('/', $args); if (!$action or !array_key_exists($action, $statuts_sujet)) { return; } if ($id_forum = intval($id_forum)) { $titre = sql_getfetsel('titre', 'spip_forum', 'id_forum=' . sql_quote($id_forum)); $pattern = '_' . $statuts_sujet[$action] . '_'; // On supprime systematique le statut demande. Ainsi si l'action demandee est d'enlever un // statut c'est fait sinon on evite de rajouter le meme statut $titre_modifie = trim(preg_replace(",{$pattern},UimsS", '', $titre)); // Si l'action demandee est de positionner un nouveau statut on le rajoute au titre if ($action == 'verrou_on' or $action == 'resolu_on') { $titre_modifie .= $pattern; } sql_updateq('spip_forum', array('titre' => $titre_modifie), 'id_forum =' . sql_quote($id_forum)); // Invalider les pages comportant ce forum include_spip('inc/invalideur'); suivre_invalideur("id='id_forum/{$id_forum}'"); } }
function action_instituer_article_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); list($id_article, $statut) = preg_split('/\W/', $arg); if (!$statut) $statut = _request('statut_nouv'); // cas POST if (!$statut) return; // impossible mais sait-on jamais $id_article = intval($id_article); // si on passe un statut_old, le controler // http://trac.rezo.net/trac/spip/ticket/1932 if ($old = _request('statut_old') AND $s = sql_fetsel('statut', 'spip_articles', 'id_article='.sql_quote($id_article)) AND $s['statut'] != $old) return; include_spip('action/editer_article'); $c = array('statut' => $statut); // si on a envoye une 'date_posterieure', l'enregistrer if ($d = _request('date_posterieure')) $c['date'] = $d; instituer_article($id_article, $c); }
function exec_editer_mots_args($id_objet, $objet) { $base=""; if (!$id_objet OR !$objet) $droit = false; elseif ($GLOBALS['connect_toutes_rubriques']) // pour eviter SQL $droit = true; elseif ($objet == 'article') $droit = autoriser('modifier','article',$id_objet); elseif ($objet == 'rubrique') $droit = autoriser('publierdans','rubrique',$id_objet); else { if ($objet == 'breve') $droit = sql_select("id_rubrique", "spip_breves", "id_breve=".sql_quote($id_objet)); else $droit = sql_select("id_rubrique", "spip_syndic", "id_syndic=".sql_quote($id_objet)); $droit = autoriser('publierdans','rubrique',$droit['id_rubrique']); } $bases = array('article'=>'articles','breve'=>'breves_voir','rubrique'=>'naviguer','syndic'=>'sites'); if (isset($bases[$objet])) $base = $bases[$objet]; if (!$droit) { include_spip('inc/minipres'); echo minipres(); } else { $ch = _request('cherche_mot'); $id_groupe = _request('select_groupe'); $editer_mots = charger_fonction('editer_mots', 'inc'); ajax_retour($editer_mots($objet, $id_objet, $ch, $id_groupe, 'ajax',false,$base)); } }
function formulaires_editer_json_article_traiter_dist($id_article = 'new', $retour = '') { $message = array('editable' => true, 'message_ok' => ''); $vhplab_json = _request('vhplab_json'); $vhplab_json_num = intval($vhplab_json); if ($vhplab_json_num > 0) { // comprobamos si el articulo ya ha sido relacionado con un id $result = sql_select('*', 'spip_vhplab_json_liens', 'id_objet=' . intval($id_article) . ' AND objet=' . sql_quote("article")); if ($row = sql_fetch($result)) { // si el articulo ya ha sido relacionado con un id actualizamos el enlace sql_updateq('spip_vhplab_json', array('id_json' => $vhplab_json_num), 'id_vhplab_json=' . intval($row['id_vhplab_json'])); $message['message_ok'] = _T('vhplab:json_update_ok'); } else { // si el articulo no ha sido relacionado con ningún id creamos un enlace $id_vhplab = sql_insertq("spip_vhplab_json", array('id_json' => $vhplab_json_num)); sql_insertq('spip_vhplab_json_liens', array('id_vhplab_json' => intval($id_vhplab), 'id_objet' => intval($id_article), 'objet' => 'article')); $message['message_ok'] = _T('vhplab:json_insert_ok'); } } if ($retour) { include_spip('inc/headers'); $message['message_ok'] .= redirige_formulaire($retour); } return $message; }
/** * Renseigner les informations de taille et dimension d'un document * * Récupère les informations de taille (largeur / hauteur / type_image / taille) d'un document * Utilise pour cela les fonctions du répertoire metadatas/* * * Ces fonctions de récupérations peuvent retourner d'autres champs si ces champs sont définis * comme editable dans la déclaration de la table spip_documents * * TODO Renommer cette fonction sans "_image" * * @param string $fichier * Le fichier à examiner * @param string $ext * L'extension du fichier à examiner * @return array|string $infos * Si c'est une chaine, c'est une erreur * Si c'est un tableau, l'ensemble des informations récupérées du fichier */ function renseigner_taille_dimension_image($fichier, $ext) { $infos = array('largeur' => 0, 'hauteur' => 0, 'type_image' => '', 'taille' => 0); // Quelques infos sur le fichier if (!$fichier or !@file_exists($fichier) or !($infos['taille'] = @intval(filesize($fichier)))) { spip_log("Echec copie du fichier {$fichier}"); return _T('medias:erreur_copie_fichier', array('nom' => $fichier)); } // chercher une fonction de description $meta = array(); if ($metadata = charger_fonction($ext, "metadata", true)) { $meta = $metadata($fichier); } else { $media = sql_getfetsel('media_defaut', 'spip_types_documents', 'extension=' . sql_quote($ext)); if ($metadata = charger_fonction($media, "metadata", true)) { $meta = $metadata($fichier); } } $meta = pipeline('renseigner_document', array('args' => array('extension' => $ext, 'fichier' => $fichier), 'data' => $meta)); include_spip('inc/filtres'); # pour objet_info() $editables = objet_info('document', 'champs_editables'); foreach ($meta as $m => $v) { if (isset($infos[$m]) or in_array($m, $editables)) { $infos[$m] = $v; } } return $infos; }
/** * Appeler le presta bancaire si celui-ci dispose d'une methode dans son API pour resilier un abonnement * @param string $abonne_uid * @param string $mode_paiement * @return bool * renvoie false si le presta bancaire indique un echec, true dans tous les autres cas */ function abos_resilier_notify_bank($abonne_uid, $mode_paiement = null) { if (!$mode_paiement) { $mode_paiement = sql_getfetsel("mode", "spip_transactions", "abo_uid=" . sql_quote($abonne_uid, '', 'text'), "", "id_transaction DESC"); } spip_log("abos/resilier_notify_bank abonne_uid={$abonne_uid} mode={$mode_paiement}", "abos_resil"); $ok = true; // notifier au presta bancaire si besoin if ($mode_paiement and $abonne_uid) { include_spip("inc/bank"); if (!($config = bank_config($mode_paiement, true)) or !isset($config['presta']) or !($presta = $config['presta'])) { spip_log("abos/resilier_notify_bank presta inconnu pour mode={$mode_paiement}", "abos_resil" . _LOG_ERREUR); } if ($presta and $presta_resilier = charger_fonction('resilier_abonnement', "presta/{$presta}/call", true)) { $ok = $presta_resilier($abonne_uid); if (!$ok) { spip_log("Resiliation abo " . $abonne_uid . " refuse par le prestataire", 'abos_resil' . _LOG_ERREUR); } } else { spip_log("abos/resilier_notify_bank : pas de methode resilier_abonnement pour le presta {$presta}", "abos_resil" . _LOG_INFO_IMPORTANTE); } if (!$ok) { bank_simple_call_resilier_abonnement($abonne_uid, $mode_paiement); // TODO ajouter un message a l'abonnement pour le feedback user spip_log("Envoi email de desabo " . $abonne_uid . " au webmestre", 'abos_resil' . _LOG_INFO_IMPORTANTE); // neanmoins, si plus d'echeance prevue, on peut finir // (cas d'un abos deja resilie fin de mois qu'on veut forcer a resilier immediatement) // TODO eventuel } } return $ok; }
function action_supprimer_url_dist($arg = null) { if (is_null($arg)) { // Rien a faire ici pour le moment $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); } if (strncmp($arg, "-1-", 3) == 0) { $id_parent = -1; $url = substr($arg, 3); } else { $arg = explode('-', $arg); $id_parent = array_shift($arg); $url = implode('-', $arg); } $where = 'id_parent=' . intval($id_parent) . " AND url=" . sql_quote($url); if ($row = sql_fetsel('*', 'spip_urls', $where)) { if (autoriser('modifierurl', $row['type'], $row['id_objet'])) { sql_delete('spip_urls', $where); } else { spip_log('supprimer sans autorisation l\'URL ' . $id_parent . "://" . $url, "urls." . _LOG_ERREUR); } } else { spip_log('Impossible de supprimer une URL inconnue ' . $id_parent . "://" . $url, "urls." . _LOG_INFO_IMPORTANTE); } }
function action_documenter_post($r) { // - sign indique le portfolio image ou document, dans le cas de // la page exec=articles // - id est l'id_objet (id_article ou id_rubrique etc) // - type est 'article' (ou 'rubrique') // - id_document le doc a supprimer ou a delier de l'objet // SI VIDE, on supprime tous les documents du type SIGN // (bouton "supprimer tous les documents") list(, $sign, $id, $type, ,$id_document) = $r; if ($id_document) { supprimer_lien_document($id_document, $type, $id); } else { $obj = "id_objet=".intval($id)." AND objet=".sql_quote($type); $typdoc = sql_in('docs.extension', array('gif', 'jpg', 'png'), $sign ? '' : 'NOT'); $s = sql_select('docs.id_document AS id_doc', "spip_documents AS docs LEFT JOIN spip_documents_liens AS l ON l.id_document=docs.id_document", "$obj AND docs.mode='document' AND $typdoc"); while ($t = sql_fetch($s)) { supprimer_lien_document($t['id_doc'], $type, $id); } } if ($type == 'rubrique') { include_spip('inc/rubriques'); depublier_branche_rubrique_if($id); } }
/** * Fournir une liste d'"evenements" entre deux dates start et end * au format json * utilise pour l'affichage du calendrier prive et public * * @return void */ function action_quete_calendrier_prive_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); $securiser_action(); $start = _request('start'); $end = _request('end'); $quoi = _request('quoi'); include_spip('inc/quete_calendrier'); $evt = array(); // recuperer la liste des evenements au format ics $start = date('Y-m-d H:i:s', $start); $end = date('Y-m-d H:i:s', $end); $limites = array(sql_quote($start), sql_quote($end)); // on fonction de quoi on récupère : tout (rv + publication) ou l'un ou l'autre. $entier = $duree = array(); if (!$quoi or $quoi == 'rv') { $duree = quete_calendrier_interval_rv(reset($limites), end($limites)); $evt = convert_fullcalendar_quete_calendrier_interval_rv($duree, $evt); } if (!$quoi or $quoi == 'publication') { list($entier, ) = quete_calendrier_interval($limites); $evt = convert_fullcalendar_quete_calendrier_interval($entier, $evt); } // permettre aux plugins d'afficher leurs evenements dans ce calendrier $evt = pipeline('quete_calendrier_prive', array('args' => array('start' => $start, 'end' => $end, 'quoi' => $quoi), 'data' => $evt)); // format json include_spip('inc/json'); echo json_encode($evt); }
/** * il faut avoir un id_transaction et un transaction_hash coherents * pour se premunir d'une tentative d'appel exterieur * * * @return array */ function presta_gratuit_call_response_dist() { // recuperer la reponse en post et la decoder $id_transaction = _request('id_transaction'); $transaction_hash = _request('hash'); if (!($row = sql_fetsel('*', 'spip_transactions', 'id_transaction=' . intval($id_transaction)))) { spip_log("id_transaction {$id_transaction} non trouve", 'gratuit.' . _LOG_ERREUR); return array($id_transaction, false); } if ($transaction_hash != $row['transaction_hash']) { spip_log("id_transaction {$id_transaction}, hash {$transaction_hash} non conforme", 'gratuit.' . _LOG_ERREUR); return array($id_transaction, false); } // verifier que la commande a bien un total nul, sinon ce mode de paiement n'est pas autorise if (intval($row['montant']) > 0 or floatval($row['montant']) > 0.0) { spip_log("id_transaction {$id_transaction}, montant " . $row['montant'] . ">0 interdit pour ce mode de paiement", 'gratuit.' . _LOG_CRITIQUE); return array($id_transaction, false); } // Ouf, le reglement a ete accepte sql_update("spip_transactions", array("mode" => sql_quote('gratuit'), "montant_regle" => 'montant', "date_paiement" => sql_quote(date('Y-m-d H:i:s')), "statut" => sql_quote('ok'), "reglee" => sql_quote('oui')), "id_transaction=" . intval($id_transaction)); spip_log("gratuit_response : id_transaction {$id_transaction}, reglee", 'gratuit'); $regler_transaction = charger_fonction('regler_transaction', 'bank'); $regler_transaction($id_transaction, "", $row); return array($id_transaction, true); }
/** * il faut avoir un id_transaction et un transaction_hash coherents * pour se premunir d'une tentative d'appel exterieur * * * @return array */ function presta_cheque_call_response_dist() { // recuperer la reponse en post et la decoder $id_transaction = _request('id_transaction'); $transaction_hash = _request('hash'); if (!($row = sql_fetsel('*', 'spip_transactions', 'id_transaction=' . intval($id_transaction)))) { spip_log("id_transaction {$id_transaction} non trouve", 'gratuit.' . _LOG_ERREUR); return array($id_transaction, false); } if ($transaction_hash != $row['transaction_hash']) { spip_log("id_transaction {$id_transaction}, hash {$transaction_hash} non conforme", 'gratuit.' . _LOG_ERREUR); return array($id_transaction, false); } // l'autorisation refere l'id_auteur et le nom de celui qui accepte le cheque $autorisation = $GLOBALS['visiteur_session']['id_auteur'] . "/" . $GLOBALS['visiteur_session']['nom']; include_spip("inc/autoriser"); if (!autoriser('encaissercheque', 'transaction', $id_transaction)) { spip_log("id_transaction {$id_transaction}, tentative d'encaisser un cheque par auteur #{$autorisation} pas autorise", 'cheque.' . _LOG_CRITIQUE); return array($id_transaction, false); } // OK, on peut accepter le reglement sql_update("spip_transactions", array("mode" => sql_quote('cheque'), "autorisation_id" => sql_quote($autorisation), "montant_regle" => 'montant', "date_paiement" => sql_quote(date('Y-m-d H:i:s')), "statut" => sql_quote('ok'), "reglee" => sql_quote('oui')), "id_transaction=" . intval($id_transaction)); spip_log("cheque_response : id_transaction {$id_transaction}, reglee", 'cheque'); $regler_transaction = charger_fonction('regler_transaction', 'bank'); $regler_transaction($id_transaction, "", $row); return array($id_transaction, true); }
/** * Supprimer les révisions des objets disparus */ function optimiser_base_revisions() { /** * On commence par récupérer la liste des types d'objet ayant au moins une révision */ $objets_revises = sql_select('objet', 'spip_versions', 'id_version=1', 'objet'); /** * Pour chaque objet, on va contruire un tableau des identifiants disparus * On supprimera ensuite les occurences dans spip_versions et spip_versions_fragments */ while ($objet = sql_fetch($objets_revises)) { $in = array(); $table = table_objet_sql($objet['objet']); $id_table_objet = id_table_objet($objet['objet']); $res = sql_select("A.id_objet AS id_objet, A.objet AS objet", "spip_versions AS A LEFT JOIN {$table} AS R\n\t\t\t\t\t\t\tON R.{$id_table_objet}=A.id_objet AND A.objet=" . sql_quote($objet['objet']), "R.{$id_table_objet} IS NULL AND A.objet=" . sql_quote($objet['objet']) . " AND A.id_objet > 0", "A.id_objet", "A.id_objet"); while ($row = sql_fetch($res)) { $in[$row['id_objet']] = true; } sql_free($res); /** * Si on a un array * On supprime toute occurence des objets disparus dans : * -* spip_versions * -* spip_versions_fragments */ if ($in) { foreach (array('spip_versions', 'spip_versions_fragments') as $table) { sql_delete($table, sql_in('id_objet', array_keys($in)) . " AND objet=" . sql_quote($objet['objet'])); } } } }
public function add($replyTo = 0) { global $mysql, $item, $languageURL, $langArray; if (!isset($_POST['comment']) || trim($_POST['comment']) == '') { return false; } if (!isset($_POST['reply_notification'])) { $_POST['reply_notification'] = 'false'; } else { $_POST['reply_notification'] = 'true'; } $mysql->query("\n\t\t\tINSERT INTO `items_comments` (\n\t\t\t\t`owner_id`,\n\t\t\t\t`item_id`,\n\t\t\t\t`item_name`,\n\t\t\t\t`user_id`,\n\t\t\t\t`comment`,\n\t\t\t\t`datetime`,\n\t\t\t\t`notify`,\n\t\t\t\t`reply_to`\t\t\t\t\n\t\t\t)\n\t\t\tVALUES (\n\t\t\t\t'" . intval($item['user_id']) . "',\n\t\t\t\t'" . intval($item['id']) . "',\n\t\t\t\t'" . sql_quote($item['name']) . "',\n\t\t\t\t'" . intval($_SESSION['user']['user_id']) . "',\n\t\t\t\t'" . sql_quote($_POST['comment']) . "',\n\t\t\t\tNOW(),\n\t\t\t\t'" . sql_quote($_POST['reply_notification']) . "',\n\t\t\t\t'" . intval($replyTo) . "'\n\t\t\t)\n\t\t"); if ($replyTo != 0) { $comment = $this->get($replyTo); if ($comment['notify'] == 'true') { require_once ROOT_PATH . '/apps/users/models/users.class.php'; $usersClass = new users(); $user = $usersClass->get($comment['user_id']); $emailClass = new email(); $emailClass->to($user['email']); $emailClass->fromEmail = 'no-reply@' . DOMAIN; $emailClass->contentType = 'text/html'; $emailClass->subject = "[" . DOMAIN . "] " . $langArray['email_new_reply_subject']; $emailClass->message = langMessageReplace($langArray['email_new_reply_text'], array('THEMENAME' => $item['name'], 'URL' => 'http://' . DOMAIN . '/' . $languageURL . 'items/comments/' . $item['id'])); $emailClass->send(); unset($emailClass); } } else { #评论 $mysql->query("\n\t\t\t\tUPDATE `items`\n\t\t\t\tSET `comments` = `comments` + 1\n\t\t\t\tWHERE `id` = '" . intval($item['id']) . "'\n\t\t\t\tLIMIT 1\n\t\t\t"); } return true; }
/** * Jamais appele directement dans le plugin bank/ * mais par une eventuelle methode abos/resilier d'un plugin externe * * @param string $uid * @param array|string $config * @return bool */ function presta_stripe_call_resilier_abonnement_dist($uid, $config = 'stripe') { include_spip('inc/bank'); $trans = sql_fetsel("mode, pay_id", "spip_transactions", "abo_uid=" . sql_quote($uid) . " AND mode LIKE " . sql_quote($config . '%'), '', 'id_transaction', '0,1'); if (!is_array($config)) { $config = bank_config($trans['mode']); } $mode = $config['presta']; // charger l'API Stripe avec la cle stripe_init_api($config); $erreur = $erreur_code = ''; try { if ($sub = \Stripe\Subscription::retrieve($uid)) { $res = $sub->cancel(); if ($res->status != 'canceled') { $erreur = 'cancel failed' . var_export((array) $res, true); } } else { $erreur = "unknown subscription"; } } catch (Exception $e) { if ($body = $e->getJsonBody()) { $err = $body['error']; list($erreur_code, $erreur) = stripe_error_code($err); } else { $erreur = $e->getMessage(); $erreur_code = 'error'; } } if ($erreur or $erreur_code) { spip_log($s = "call_resilier_abonnement {$uid} : erreur {$erreur_code} - {$erreur}", $mode . _LOG_ERREUR); return false; } return true; }
function action_dereferencer_traduction_rubrique_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); list($type, $id_objet) = explode('/', $arg); if (!$type = objet_type($type) or !$id_objet = intval($id_objet)) { if (!_AJAX) { include_spip('inc/minipres'); minipres('Arguments incompris'); } else { spip_log('Arguments incompris dans action dereferencer_traduction_rubrique'); return false; } } $objet = table_objet($type); $_id_objet = id_table_objet($objet); $table = table_objet_sql($objet); $id_trad_old = sql_getfetsel('id_trad', $table, "$_id_objet = " . sql_quote($id_objet)); if ($id_trad_old) { include_spip('inc/modifier'); modifier_contenu($objet, $id_objet, array('invalideur' => "id='$objet/$id_objet'"), array('id_trad' => 0)); // si la deliaison fait qu'il ne reste plus que la source // dans le groupe de traduction on lui remet l'id_trad a 0 if (1 == $nb_dans_groupe = sql_countsel($table, array('id_trad = ' . sql_quote($id_trad_old)))) { modifier_contenu($objet, $id_trad_old, array('invalideur' => "id='$objet/$id_trad_old'"), array('id_trad' => 0)); } } }
function action_bank_response_dist($cancel = null, $auto = null) { if (isset($GLOBALS['meta']['bank_paiement']) and $prestas = unserialize($GLOBALS['meta']['bank_paiement']) and count($prestas = $prestas['presta'])) { $auto = $auto ? "auto" : ""; $result = false; // intercepter les retours depuis un presta actif if ($p = _request('bankp') and (isset($prestas[$p]) and $prestas[$p] or $p == 'gratuit')) { $call_response = charger_fonction('response', "presta/{$p}/call"); spip_log('call_' . $auto . 'response : ' . $_SERVER['REQUEST_URI'], "{$p}{$auto}"); list($id_transaction, $result) = $call_response(); spip_log('call_' . $auto . 'response : ' . "{$id_transaction}/{$result}", "{$p}{$auto}"); } else { spip_log("Prestataire {$p} inconnu ou inactif", 'bank_response'); } // fall back si le presta n'a rien renvoye de lisible // et qu'on a bien id=id_transaction;hash dans l'url if (!$result and !$id_transaction and $id = _request('id') and $id = explode(';', $id) and count($id) == 2 and $id_transaction = reset($id) and $hash = end($id)) { $id_transaction = sql_getfetsel("id_transaction", "spip_transactions", "id_transaction=" . intval($id_transaction) . " AND transaction_hash=" . sql_quote($hash)); if ($id_transaction) { sql_updateq("spip_transactions", array('message' => 'Transaction annulée', 'statut' => 'echec', 'mode' => $p), 'id_transaction=' . intval($id_transaction) . " AND statut='commande'"); } } if (!$auto) { redirige_apres_retour_transaction($p, 'acte', $cancel ? false : $result, $id_transaction); } die; // mourir silencieusement } else { spip_log('Aucun prestataire de paiement configure', 'bank_response'); } die; }
function formulaires_delete_traiter_dist($id_article = 'new', $retour = '', $ajaxload = 'oui') { include_spip('base/abstract_sql'); include_spip('inc/texte'); include_spip('action/editer_article'); include_spip('inc/autoriser'); $article = _request('article'); $id_auteur = $GLOBALS['visiteur_session']['id_auteur']; include_spip('inc/autoriser'); if (!autoriser('modifier', 'article', $article)) { $id_article = false; $result = sql_select('*', 'spip_auteurs_liens', 'id_objet=' . intval($article) . ' AND objet=' . sql_quote("article")); if ($row = sql_fetch($result)) { if ($row['id_auteur'] == $id_auteur) { $id_article = $article; } } } else { $id_article = $article; } if ($id_article) { // 2 actualizampos los campos del articulo sql_updateq('spip_articles', array('statut' => 'poubelle'), 'id_article=' . intval($id_article)); // message return array("editable" => true, "message_ok" => _T('cgeomap:message_delete') . ':' . $id_article); } else { // message return array("editable" => false, "message_erreur" => _T('cgeomap:not_allowed')); } }
function action_supprimer_tous_orphelins() { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); //on recupere le contexte pour ne supprimer les orphelins que de ce dernier list($media, $distant, $statut, $sanstitre) = explode('/', $arg); //critere sur le media if ($media) { $select = "media=" . sql_quote($media); } //critere sur le distant if ($distant) { $where[] = "distant=" . sql_quote($distant); } //critere sur le statut if ($statut) { $where[] = "statut REGEXP " . sql_quote("({$statut})"); } //critere sur le sanstitre if ($sanstitre) { $where[] = "titre=''"; } //on isole les orphelins $select = sql_get_select("DISTINCT id_document", "spip_documents_liens as oooo"); $cond = "spip_documents.id_document NOT IN ({$select})"; $where[] = $cond; $ids_doc_orphelins = sql_select("id_document", "spip_documents", $where); $supprimer_document = charger_fonction('supprimer_document', 'action'); while ($row = sql_fetch($ids_doc_orphelins)) { $supprimer_document($row['id_document']); // pour les orphelins du contexte, on traite avec la fonction existante } }
/** * Jamais appele directement dans le plugin bank/ * mais par une eventuelle methode abos/resilier d'un plugin externe * * @param string $uid * @param array|string $config * @return bool */ function presta_payzen_call_resilier_abonnement_dist($uid, $config = 'payzen') { include_spip('presta/payzen/lib/ws-v5/classes'); include_spip('presta/systempay/inc/systempay'); include_spip('inc/bank'); $trans = sql_fetsel("mode,pay_id", "spip_transactions", "abo_uid=" . sql_quote($uid) . " AND mode LIKE " . sql_quote($config . '%'), '', 'id_transaction', '0,1'); if (!is_array($config)) { $config = bank_config($trans['mode']); } $mode = $config['presta']; $vads = new PayzenWSv5($config); $response = new cancelSubscriptionResponse(); try { $response = $vads->cancelSubscription($trans['pay_id'], $uid); } catch (Exception $e) { spip_log($s = "call_resilier_abonnement : erreur " . $e->getMessage(), $mode . _LOG_ERREUR); return false; } if ($e = $response->cancelSubscriptionResult->commonResponse->responseCode) { spip_log($s = "call_resilier_abonnement {$uid} : erreur {$e} : " . $response->cancelSubscriptionResult->commonResponse->responseCodeDetail, $mode . _LOG_ERREUR); // 33 : Invalid Subscription => on est donc bien desabonne if ($e == 33) { return true; } else { return false; } } return true; }
function genie_depublier_dist($time) { //va chercher les objets de spip_depublies avec une date_depublie pour aujourd'hui include_spip('base/abstract_sql'); $today = date('Y-m-d H:i:s'); if ($depublications = sql_allfetsel('*', 'spip_depublies', 'DATE_FORMAT(date_depublie, "%Y-%m-%d %H:%i:%s") <= ' . sql_quote($today) . ' AND DATE_FORMAT(date_depublie, "%Y-%m-%d %H:%i:%s") >0') and is_array($depublications)) { foreach ($depublications as $depublication) { $objet = $depublication['objet']; $id_objet = $depublication['id_objet']; $statut_depublication = $depublication['statut']; $date_depublie = $depublication['date_depublie']; spip_log("on veut depublier {$objet} {$id_objet} {$statut_depublication}", 'depublication'); //on cherche la table de l'objet donné $_id_objet = id_table_objet($objet); //id_article $table = table_objet_sql($objet); //articles //si le statut est différent de celui demandé if ($a_depublier = sql_getfetsel($_id_objet, $table, "statut != " . sql_quote($statut_depublication) . " AND {$_id_objet} = " . intval($id_objet))) { //si les conditions sont remplies, on change le statut dans cette table sql_updateq($table, array("statut" => $statut_depublication), "{$_id_objet}= " . intval($id_objet)); //et on supprime l'entrée sql_delete('spip_depublies', 'id_objet=' . intval($id_objet) . ' AND objet=' . sql_quote($objet)); } } } return 1; }
function action_deplacer_objets_dist() { include_spip('inc/autoriser'); if (!autoriser('ecrire')) { return plan_json_erreur(_T("plan:erreur_autorisation_insuffisante") . " " . _T("plan:erreur_deplacement_impossible")); } include_spip('base/objets'); $objet = objet_type(_request('objet')); $table = table_objet_sql($objet); $_id_table = id_table_objet($table); $ids = _request('id_objet'); $id_rubrique_old = _request('id_rubrique_source'); $id_rubrique_new = _request('id_rubrique_destination'); if (!is_array($ids) or !$objet) { return plan_json_erreur(_T("plan:erreur_aucun_identifiant") . " " . _T("plan:erreur_deplacement_impossible")); } if ($id_rubrique_old == $id_rubrique_new) { return plan_json_erreur(_T("plan:erreur_rubriques_parentes_incorrectes") . " " . _T("plan:erreur_deplacement_impossible")); } if ($objet != 'rubrique' and !$id_rubrique_new) { return plan_json_erreur(_T("plan:erreur_rubriques_parentes_incorrectes") . " " . _T("plan:erreur_deplacement_impossible")); } $ids = array_filter($ids); if ($objet == 'rubrique') { $champ = 'id_parent'; } else { $champ = 'id_rubrique'; } // ne modifier que si les emplacements n'ont pas déjà changé ! $ids = sql_allfetsel($_id_table, $table, array(sql_in($_id_table, $ids), $champ . '=' . sql_quote($id_rubrique_old))); $ids = array_map('array_shift', $ids); include_spip('action/editer_objet'); $errors = $success = array(); $modifs = array('id_parent' => $id_rubrique_new); foreach ($ids as $id) { if (autoriser('modifier', $objet, $id)) { if ($err = objet_modifier($objet, $id, $modifs)) { $errors["{$objet}-{$id}"] = $err; } else { $success["{$objet}-{$id}"] = true; } } else { $errors["{$objet}-{$id}"] = _T("plan:erreur_autorisation_insuffisante") . " " . _T("plan:erreur_deplacement_impossible"); } } // dans certains cas… on ne reçoit pas d'erreur… et pourtant ! if (!$errors) { // on verifie qu'il n'y a plus d'objets à l'ancien emplacement $ids = sql_allfetsel($_id_table, $table, array(sql_in($_id_table, $ids), $champ . '=' . sql_quote($id_rubrique_old))); $ids = array_map('array_shift', $ids); if ($ids) { foreach ($ids as $id) { $errors["{$objet}-{$id}"] = _T("plan:erreur_deplacement"); unset($success["{$objet}-{$id}"]); } } } return plan_json_envoi(array('done' => true, 'success' => $success, 'errors' => $errors)); }
function formulaires_clevermail_list_edit_verifier_dist($lst_id = -1) { $erreurs = array(); foreach (array('lst_name', 'lst_moderator_email', 'lst_url_html') as $obligatoire) { if (!_request($obligatoire)) { $erreurs[$obligatoire] = _T('clevermail:ce_champ_est_obligatoire'); } } $nb = sql_countsel("spip_cm_lists", "lst_id != " . intval(_request('lst_id')) . " AND lst_name = " . sql_quote(_request('lst_name'))); if ($nb > 0) { $erreurs['lst_name'] = _T('clevermail:lettre_meme_nom'); } include_spip('inc/filtres'); if (_request('lst_moderator_email') && !email_valide(_request('lst_moderator_email'))) { $erreurs['lst_moderator_email'] = _T('clevermail:cette_adresse_email_n_est_pas_valide'); } if (_request('lst_auto_mode') && _request('lst_auto_mode') != 'none') { if (in_array(_request('lst_auto_mode'), array('day', 'week', 'month'))) { if (_request('lst_auto_hour') && (intval(_request('lst_auto_hour')) < 0 || intval(_request('lst_auto_hour')) > 23)) { $erreurs['lst_auto_hour'] = _T('clevermail:auto_erreur_cette_heure_existe_pas'); } switch (_request('lst_auto_mode')) { case 'day': break; case 'week': if (!_request('lst_auto_week_days') || count(_request('lst_auto_week_days')) == 0) { $erreurs['lst_auto_week_days'] = _T('clevermail:auto_erreur_choisir_un_jour_minimum'); } elseif (min(_request('lst_auto_week_days')) < 0 || max(_request('lst_auto_week_days')) > 6) { $erreurs['lst_auto_week_days'] = _T('clevermail:auto_erreur_ce_jour_semaine_existe_pas'); } break; case 'month': if (_request('lst_auto_month_day') && (intval(_request('lst_auto_month_day')) < 0 || intval(_request('lst_auto_month_day')) > 31)) { $erreurs['lst_auto_month_day'] = _T('clevermail:auto_erreur_ce_jour_mois_existe_pas'); } elseif (intval(_request('lst_auto_month_day')) > 28) { $erreurs['lst_auto_month_day'] = _T('clevermail:auto_erreur_ce_jour_mois_pas_possible'); } break; } } else { $erreurs['lst_auto_mode'] = _T('clevermail:auto_erreur_ce_mode_automatisation_existe_pas'); } } if (_request('lst_auto_subscribers') != '') { include_spip('inc/distant'); if ($adresses = recuperer_page(_request('lst_auto_subscribers'))) { include_spip('inc/clevermail_abonnes'); if (!clevermail_verification_adresses_email($adresses)) { $erreurs['lst_auto_subscribers'] = _T('clevermail:le_format_des_adresses_email_ne_semble_pas_bon'); } } else { $erreurs['lst_auto_subscribers'] = _T('clevermail:fichier_adresses_distant_impossible_telecharger'); } } if (count($erreurs)) { $erreurs['message_erreur'] = _T('clevermail:veuillez_corriger_votre_saisie'); } return $erreurs; }
/** * Generer le contexte pour le formulaire de requete de paiement * il faut avoir un id_transaction et un transaction_hash coherents * pour se premunir d'une tentative d'appel exterieur * * @param int $id_transaction * @param string $transaction_hash * @param $config * configuration du module * @return array */ function presta_cmcic_call_request_dist($id_transaction, $transaction_hash, $config) { if (!($row = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction) . " AND transaction_hash=" . sql_quote($transaction_hash)))) { return array(); } include_spip('inc/filtres'); $contexte = array(); $oTpe = new CMCIC_Tpe($config, strtoupper($GLOBALS['spip_lang'])); if (!$oTpe->isOK) { return false; } $oHmac = new CMCIC_Hmac($oTpe); // Control String for support $CtlHmac = sprintf(_CMCIC_CTLHMAC, $oTpe->sVersion, $oTpe->sNumero, $oHmac->computeHmac(sprintf(_CMCIC_CTLHMACSTR, $oTpe->sVersion, $oTpe->sNumero))); // Currency : ISO 4217 compliant $devise = "EUR"; // Amount : format "xxxxx.yy" (no spaces) $montant = $row['montant']; $contexte['version'] = $oTpe->sVersion; $contexte['TPE'] = $oTpe->sNumero; // transaction date : format d/m/y:h:m:s $contexte['date'] = date("d/m/Y:H:i:s"); $contexte['montant'] = $montant . $devise; // Reference: unique, alphaNum (A-Z a-z 0-9), 12 characters max $contexte['reference'] = substr($transaction_hash, 0, 12); $contexte['lgue'] = $oTpe->sLangue; $contexte['societe'] = $oTpe->sCodeSociete; // on transmet dans le texte libre les données id_transaction & hash // pour les avoir dans le retour URL CGI2 qui est une url à donner à la banque // et qui n'a pas connaissance autrement de notre id_transaction et hash :( // URL CGI2 à donner à la banque : // http(s)://votresite.org/?action=bank_autoresponse&bankp=cmcic $contenu = array('id' => $id_transaction, 'hash' => $transaction_hash, 'lang' => $GLOBALS['spip_lang'], 'contenu' => $row['contenu']); // texte-libre doit etre protege car le formulaire est parfois reinjecte par Cmcic // dans une page de redirection pour les mobiles $contexte['texte-libre'] = urlencode(serialize($contenu)); $contexte['mail'] = bank_porteur_email($row); // Data to certify $PHP1_FIELDS = sprintf(_CMCIC_CGI1_FIELDS, $contexte['TPE'], $contexte['date'], $montant, $devise, $contexte['reference'], $contexte['texte-libre'], $oTpe->sVersion, $oTpe->sLangue, $oTpe->sCodeSociete, $contexte['mail'], "", "", "", "", "", "", "", "", "", ""); // MAC computation $contexte['MAC'] = $oHmac->computeHmac($PHP1_FIELDS); // Urls de retour. // La banque poste d'abord sur l'URL CGI2 (cf cmcic/config.php) qui doit traiter // le paiement positif et en attend une réponse (texte). // Puis, elle présente sur la banque au choix ces urls pour revenir sur le site // - retour OK si le paiement s'est bien déroulé $contexte['url_retour_ok'] = bank_url_api_retour($config, "response", "id={$id_transaction};{$transaction_hash}"); // - retour err si le paiement a été refusé $contexte['url_retour_err'] = bank_url_api_retour($config, "cancel", "id={$id_transaction};{$transaction_hash}"); // - retour (bouton Annuler) si le bonhomme décide d'abandonner le paiement $contexte['url_retour'] = $contexte['url_retour_ok']; $hidden = ""; foreach ($contexte as $k => $v) { $hidden .= "<input type='hidden' name='{$k}' value='" . str_replace("'", "'", $v) . "' />"; } include_spip('inc/filtres_mini'); $contexte = array('hidden' => $hidden, 'action' => cmcic_url_serveur($config), 'backurl' => url_absolue(self()), 'id_transaction' => $id_transaction, 'transaction_hash' => $transaction_hash); return $contexte; }