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 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; }
function formulaires_editer_balade_traiter_dist($id_collection = 'new', $retour = '') { $message = array(); // récupérer le rang des articles de la balade et le mettre à jour $rangs = _request('rang'); foreach ($rangs as $rang => $id_article) { $rang = $rang + 1; $ok = sql_updateq('spip_collections_liens', array('rang' => intval($rang)), "objet='article' AND id_objet = {$id_article}"); } // éditer le gis associé if ($action_editer = charger_fonction("editer_gis", 'action', true)) { list($id, $err) = $action_editer(_request('id_gis')); } // ne pas polluer l'url de retour avec des paramètres inutiles set_request('id_gis'); set_request('id_objet'); // invalider le cache include_spip('inc/invalideur'); suivre_invalideur("id='gis/{$id}"); // rediriger sur l'url de retour passée en paramètre if ($retour) { include_spip('inc/headers'); $message['redirect'] = redirige_formulaire($retour); } return $message; }
function action_supprimer_rubrique($r) { list(,,$id_rubrique) = $r; sql_delete("spip_rubriques", "id_rubrique=$id_rubrique"); sql_delete("spip_mots_rubriques", "id_rubrique=$id_rubrique"); // Les admin restreints qui n'administraient que cette rubrique // deviennent redacteurs // (il y a sans doute moyen de faire ca avec un having) $q = sql_select("id_auteur", "spip_auteurs_rubriques", "id_rubrique=$id_rubrique"); while ($r = sql_fetch($q)) { $id_auteur = $r['id_auteur']; sql_delete("spip_auteurs_rubriques", "id_rubrique=$id_rubrique AND id_auteur=$id_auteur"); $n = sql_countsel("spip_auteurs_rubriques", "id_auteur=$id_auteur"); if (!$n) sql_updateq("spip_auteurs", array("statut" => '1comite'), "id_auteur=$id_auteur"); } // menu_rubriques devra recalculer effacer_meta("date_calcul_rubriques"); // Une rubrique supprimable n'avait pas le statut "publie" // donc rien de neuf pour la rubrique parente include_spip('inc/rubriques'); calculer_langues_rubriques(); // invalider les caches marques de cette rubrique include_spip('inc/invalideur'); suivre_invalideur("id='id_rubrique/$id_rubrique'"); }
/** * Effacer une rubrique * * http://doc.spip.org/@action_supprimer_dist * * @param null $id_rubrique * @return void */ function action_supprimer_rubrique_dist($id_rubrique = null) { if (is_null($id_rubrique)) { $securiser_action = charger_fonction('securiser_action', 'inc'); $id_rubrique = $securiser_action(); } if (intval($id_rubrique)) { sql_delete("spip_rubriques", "id_rubrique=" . intval($id_rubrique)); // Les admin restreints qui n'administraient que cette rubrique // deviennent redacteurs // (il y a sans doute moyen de faire ca avec un having) $q = sql_select("id_auteur", "spip_auteurs_liens", "objet='rubrique' AND id_objet=" . intval($id_rubrique)); while ($r = sql_fetch($q)) { $id_auteur = $r['id_auteur']; // degrader avant de supprimer la restriction d'admin // section critique sur les droits $n = sql_countsel("spip_auteurs_liens", "objet='rubrique' AND id_objet!=" . intval($id_rubrique) . " AND id_auteur=" . intval($id_auteur)); if (!$n) { include_spip('action/editer_auteur'); auteurs_set($id_auteur, array("statut" => '1comite')); } sql_delete("spip_auteurs_liens", "objet='rubrique' AND id_objet=" . intval($id_rubrique) . " AND id_auteur=" . intval($id_auteur)); } // menu_rubriques devra recalculer effacer_meta("date_calcul_rubriques"); // Une rubrique supprimable n'avait pas le statut "publie" // donc rien de neuf pour la rubrique parente include_spip('inc/rubriques'); calculer_langues_rubriques(); // invalider les caches marques de cette rubrique include_spip('inc/invalideur'); suivre_invalideur("id='rubrique/{$id_rubrique}'"); } }
function formulaires_configurer_forums_participants_traiter_dist() { include_spip('inc/config'); include_spip('inc/meta'); $purger_skel = false; if ($accepter_forum = _request('forums_publics') and $accepter_forum != $GLOBALS['meta']["forums_publics"]) { $purger_skel = true; $accepter_forum = substr($accepter_forum, 0, 3); } // Appliquer les changements de moderation forum // forums_publics_appliquer : futur, saufnon, tous if (in_array($appliquer = _request('forums_publics_appliquer'), array('tous', 'saufnon'))) { $sauf = $appliquer == 'saufnon' ? "accepter_forum != 'non'" : ''; sql_updateq('spip_articles', array('accepter_forum' => $accepter_forum), $sauf); } if ($accepter_forum == 'abo') { ecrire_meta('accepter_visiteurs', 'oui'); } appliquer_modifs_config(); if ($purger_skel) { include_spip('inc/invalideur'); suivre_invalideur("forum/*"); } return array('message_ok' => _T('config_info_enregistree')); }
function action_instituer_langue_rubrique_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); $changer_lang = _request('changer_lang'); list($id_rubrique, $id_parent) = preg_split('/\W/', $arg); if ($changer_lang AND $id_rubrique>0 AND $GLOBALS['meta']['multi_rubriques'] == 'oui' AND ($GLOBALS['meta']['multi_secteurs'] == 'non' OR $id_parent == 0)) { if ($changer_lang != "herit") sql_updateq('spip_rubriques', array('lang'=>$changer_lang, 'langue_choisie'=>'oui'), "id_rubrique=$id_rubrique"); else { if ($id_parent == 0) $langue_parent = $GLOBALS['meta']['langue_site']; else { $langue_parent = sql_getfetsel("lang", "spip_rubriques", "id_rubrique=$id_parent"); } sql_updateq('spip_rubriques', array('lang'=>$langue_parent, 'langue_choisie'=>'non'), "id_rubrique=$id_rubrique"); } include_spip('inc/rubriques'); calculer_langues_rubriques(); // invalider les caches marques de cette rubrique include_spip('inc/invalideur'); suivre_invalideur("id='id_rubrique/$id_rubrique'"); } }
function instituer_un_forum($statut,$row){ $id_forum = $row['id_forum']; $old = $row['statut']; // rien a faire si pas de changement de statut if ($old==$statut) return; // changer le statut de toute l'arborescence dependant de ce message $id_messages = array($id_forum); while ($id_messages) { sql_updateq("spip_forum", array("statut" => $statut), sql_in("id_forum", $id_messages) ." AND statut = '$old'"); $id_messages = array_map('reset',sql_allfetsel("id_forum", "spip_forum", sql_in("id_parent", $id_messages))); } // Notifier de la publication du message, s'il etait 'prop' if ($old=='prop' AND $statut=='publie') { if ($notifications = charger_fonction('notifications', 'inc')) { $notifications('forumvalide', $id_forum); } } // mettre a jour la date du thread // si publie, ou que tout le thread est prive, // mettre la date du thread a 'maintenant' (date de publi du message) // sinon prendre la date_heure du dernier message public // c'est imparfait dans le cas ou les crayons ont ete utilises pour modifier ce message entre temps // car la date_thread aurait cette derniere date alors que pas le message // mais c'est au mieux de ce que l'on peut faire quand on depublie un SPAM ou supprime un message if ($statut=='publie' OR $old=='publie') { if ($statut=='publie' OR !($date_thread = sql_getfetsel("date_heure", "spip_forum", "statut='publie' AND id_thread=".$row['id_thread'], "", "date_heure DESC","0,1"))){ $date_thread = date('Y-m-d H:i:s'); } sql_updateq("spip_forum", array("date_thread" => $date_thread), "id_thread=".$row['id_thread']); } // invalider les pages comportant ce forum include_spip('inc/invalideur'); include_spip('inc/forum'); $index_forum = calcul_index_forum($row['id_article'], $row['id_breve'], $row['id_rubrique'], $row['id_syndic']); suivre_invalideur("id='id_forum/$index_forum'"); // Reindexation du thread (par exemple) pipeline('post_edition', array( 'args' => array( 'table' => 'spip_forum', 'id_objet' => $id_forum, 'action' => 'instituer', ), 'data' => null ) ); }
/** * Traiter * * @param int $id_objet * @param string $objet * @return array */ function formulaires_activer_forums_objet_traiter_dist($id_objet, $objet = 'article') { include_spip('inc/autoriser'); if ($objet == 'article' and autoriser('modererforum', $objet, $id_objet)) { $statut = _request('accepter_forum'); include_spip('base/abstract_sql'); sql_updateq("spip_articles", array("accepter_forum" => $statut), "id_article=" . intval($id_objet)); if ($statut == 'abo') { ecrire_meta('accepter_visiteurs', 'oui'); } include_spip('inc/invalideur'); suivre_invalideur("id='{$objet}/{$id_objet}'"); } return array('message_ok' => _T('config_info_enregistree'), 'editable' => true); }
function action_description_outil_post($index) { global $metas_vars; if(defined('_SPIP19300')) $connect_id_auteur = $GLOBALS['auteur_session']['id_auteur']; else global $connect_id_auteur; cs_log("Debut : action_description_outil_post($index) - On modifie la(les) variable(s) dans la base"); // on recupere dans le POST le nom des variables a modifier et le nom de l'outil correspondant $variables = unserialize(urldecode(corriger_caracteres(_request('variables')))); $outil = corriger_caracteres(_request('outil')); //cs_log($variables, '$variables = '); cs_log($metas_vars, 'metas_vars :'); // besoin des outils pour l'autorisation de modifier les variables include_spip('cout_utils'); include_spip('config_outils'); global $outils, $cs_variables; // on traite chaque variable foreach($variables as $var) if(autoriser('configurer', 'variable', 0, NULL, array('nom'=>$var, 'outil'=>$outils[$outil]))) { // on recupere dans le POST la nouvelle valeur de la variable $final = corriger_caracteres(_request($var)); if (in_array($var, $metas_vars['_nombres'])) $final = intval($final); spip_log("Outil du Couteau Suisse ($outil). Demande de modification sur une variable par l'auteur id=$connect_id_auteur : %$var% = $final"); // et on modifie les metas ! if(!isset($cs_variables[$var]['externe'])) $metas_vars[$var] = $final; if(isset($cs_variables[$var]['action'])) { $action = str_replace('%s', $final, $cs_variables[$var]['action']); spip_log("Outil du Couteau Suisse ($outil). Demande d'action sur cette variable : ".$action); eval($action); } } else spip_log("Outil du Couteau Suisse n°$index. Modification interdite de la variable %$var% par l'auteur id=$connect_id_auteur !!"); //cs_log($metas_vars, " -- metas_vars = "); ecrire_meta('tweaks_variables', serialize($metas_vars)); ecrire_metas(); cs_log(" -- donc, reinitialisation forcee !"); // on reinitialise tout, au cas ou ... include_spip('inc/invalideur'); suivre_invalideur("1"); # tout effacer purger_repertoire(_DIR_SKELS); purger_repertoire(_DIR_CACHE); include_spip('cout_utils'); cs_initialisation(true); cs_log(" FIN : action_description_outil_post(Array($index)) - Reinitialisation forcee terminee."); }
function formulaires_configurer_visiteurs_traiter_dist() { $res = array('editable' => true); // Modification du reglage accepter_inscriptions => vider le cache // (pour repercuter la modif sur le panneau de login) if ($i = _request('accepter_visiteurs') and $i != $GLOBALS['meta']['accepter_visiteurs']) { include_spip('inc/invalideur'); suivre_invalideur("1"); # tout effacer } foreach (array("accepter_visiteurs") as $m) { if (!is_null($v = _request($m))) { ecrire_meta($m, $v == 'oui' ? 'oui' : 'non'); } } $res['message_ok'] = _T('config_info_enregistree'); return $res; }
function action_crayons_dist() { include_spip('action/crayons_store'); $r = crayons_store(); // soit exit, soit un redirect gere par SPIP if (trim($r['$erreur'])) { include_spip('inc/minipres'); echo minipres($r['$erreur']); exit; } // S'il n'y a pas de redirect, on est mal : eviter toutefois la page blanche if (!_request('redirect')) { die('OK'); } // Invalider le cache parce que bon... a priori on est dans une // interface qui va avoir besoin de refresh include_spip('inc/invalideur'); suivre_invalideur('1'); }
function action_editer_signatures_post($r) { $id = $id_article = intval($r[1]); if ($r[2] == 'A') $id = 0; else $id_article = 0; if ($id < 0){ $id = 0 - $id; sql_updateq("spip_signatures", array("statut" => 'poubelle'), "id_signature=$id"); } elseif ($id > 0){ $row = sql_fetsel('*', 'spip_signatures', "id_signature=$id"); if ($row['statut']=='poubelle') sql_updateq("spip_signatures", array("statut" => 'publie'), "id_signature=$id"); else { include_spip('formulaires/signature'); include_spip('inc/texte'); $id_article = $row['id_article']; $url = generer_url_entite_absolue($id_article, 'article','','',true); if (signature_a_confirmer($id_article, $url, $row['nom_email'], $row['ad_email'], $row['nom_site'], $row['url_site'], $row['message'], $row['lang'], $row['statut'])) sql_updateq("spip_signatures", array("date_time" => date('Y-m-d H:i:s')), "id_signature=$id"); $id = 0; } } elseif ($id_article) { action_editer_signatures_relance($id_article); } // Invalider les pages ayant trait aux petitions if (!$id_article AND $id) { $id_article = sql_getfetsel("id_article", "spip_signatures", "id_signature=$id"); if ($id_article) { include_spip('inc/invalideur'); suivre_invalideur("id='varia/pet$id_article'"); } } # cette requete devrait figurer dans l'optimisation sql_delete("spip_signatures", "NOT (statut='publie' OR statut='poubelle') AND date_time<DATE_SUB(NOW(),INTERVAL 10 DAY)"); }
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; }
/** * Fonction d'ajout des versions dans la file d'attente * * @param int $id_document l'id du document original * @param string $objet * @param int $id_objet */ function action_zencoder_notification() { include_spip('inc/config'); include_spip('inc/renseigner_document'); $id_document = _request('id_document'); $api_key = lire_config('zencoder/api_key'); spip_log('notification start', 'zencoder'); // Catch notification $notification = json_decode(trim(file_get_contents('php://input')), true); spip_log($notification, 'zencoder'); // Check output/job state if ($notification['output']['state'] == 'finished') { spip_log('notification job finished', 'zencoder'); $file = $notification['output']['url']; if ($file) { $ajouter_documents = charger_fonction('ajouter_documents', 'action'); $copie_local = charger_fonction('copier_local', 'action'); spip_log('notification job file' . $file, 'zencoder'); set_request('joindre_distant', true); set_request('url', $file); include_spip('inc/joindre_document'); $files = joindre_trouver_fichier_envoye(); $nouveaux_doc = $ajouter_documents('new', $files, 'document', $id_document, 'conversion'); $copie_local($nouveaux_doc[0]); /** * Invalidation du cache */ include_spip('inc/invalideur'); suivre_invalideur("0", true); } } elseif ($notification['output']['state'] == "cancelled") { spip_log('canceled' . print_r($notification), 'zencoder'); } else { spip_log('error' . print_r($notification), 'zencoder'); } return; }
function action_regler_moderation_dist() { include_spip('inc/autoriser'); $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); if (!preg_match(",^\W*(\d+)$,", $arg, $r)) { spip_log("action_regler_moderation_dist $arg pas compris"); return; } $id_article = $r[1]; if (!autoriser('modererforum', 'article', $id_article)) return; $statut = _request('change_accepter_forum'); sql_updateq("spip_articles", array("accepter_forum" => $statut), "id_article=". $id_article); if ($statut == 'abo') { ecrire_meta('accepter_visiteurs', 'oui'); } include_spip('inc/invalideur'); suivre_invalideur("id='id_forum/a$id_article'"); }
function formulaires_upload_traiter_dist($objet, $id_objet, $fond_documents){ $res = array('editable'=>' ', 'message_ok'=>''); $invalider = false; $type = objet_type($objet); $res['message_ok'] = ""; $compteur=0; // titrer des documents ? if (is_array(_request('ref'))) { foreach (_request('ref') as $ref) { $ref = intval($ref); if ($titre = _request("titrer_$ref")) { if (formulaireupload_verifier_doc_liaison($ref,$id_objet,$type)) sql_updateq('spip_documents', array('titre' => $titre) ,'id_document='.$ref); } } } // supprimer des documents ? if (is_array(_request('supprimer'))) { foreach (_request('supprimer') as $supprimer) { if ($supprimer = intval($supprimer)) { include_spip('inc/autoriser'); if (formulaireupload_verifier_doc_liaison($supprimer,$id_objet,$type)) { sql_delete('spip_documents_liens', 'id_document='.$supprimer); $supprimer_document = charger_fonction('supprimer_document','action'); $supprimer_document($supprimer); $invalider = true; $compteur++; spip_log("supprimer document ($type)".$supprimer, 'upload'); } } } $res['message_ok'] .= _T("formupload:msg_doc_deleted",array("compteur"=>$compteur))."<br />"; } // Ajouter un document (cf plugins-dist/medias) include_spip('inc/joindre_document'); $files = joindre_trouver_fichier_envoye(); if (is_array($files)) { $compteur = 0; // gestion des quotas ? $quota = intval(lire_config("formulaireupload/files_quota")); $quota_left = 100; if ($quota>0) { if ($res_nb_objet = sql_select('id_document', 'spip_documents_liens', array("objet = '$type'",'id_objet='.intval($id_objet)))) $nb_objet = sql_count($res_nb_objet); $quota_left = $quota - $nb_objet; if ($quota_left<1 OR $quota_left<count($files)) $res['message_ok'] .= _T("formupload:msg_doc_added_max",array("max"=>$quota))."<br />"; // on reduit les fichiers proposés par le quota restant array_splice($files, $quota_left); } // upload des fichiers if ($quota_left>0) { $ajouter_documents = charger_fonction('ajouter_documents', 'action'); $nouveaux_doc = $ajouter_documents($id_document,$files,$objet,$id_objet,'document'); $compteur = count($nouveaux_doc); } /* A verifier: - securite : verifier les extenxions (si forcing) */ $invalider = true; if ($compteur>0) $res['message_ok'] .= _T("formupload:msg_doc_added",array("compteur"=>$compteur)); } if ($invalider) { include_spip('inc/invalideur'); suivre_invalideur("0",true); spip_log('invalider', 'upload'); } return $res; }
/** * Modifier une rubrique en base * * @param int $id_rubrique * Identifiant de la rubrique modifiée * @param array|null $set * Tableau qu'on peut proposer en lieu et place de _request() * @return bool|string * - false : Aucune modification, aucun champ n'est à modifier * - chaîne vide : Vide si tout s'est bien passé * - chaîne : Texte d'un message d'erreur */ function rubrique_modifier($id_rubrique, $set = null) { include_spip('inc/autoriser'); include_spip('inc/filtres'); include_spip('inc/modifier'); $c = collecter_requests(objet_info('rubrique', 'champs_editables'), array('id_parent', 'confirme_deplace'), $set); if ($err = objet_modifier_champs('rubrique', $id_rubrique, array('data' => $set, 'nonvide' => array('titre' => _T('titre_nouvelle_rubrique') . " " . _T('info_numero_abbreviation') . $id_rubrique)), $c)) { return $err; } $c = collecter_requests(array('id_parent', 'confirme_deplace'), array(), $set); // Deplacer la rubrique if (isset($c['id_parent'])) { $err = rubrique_instituer($id_rubrique, $c); } // invalider les caches marques de cette rubrique include_spip('inc/invalideur'); suivre_invalideur("id='rubrique/{$id_rubrique}'"); // et celui de menu_rubriques effacer_meta("date_calcul_rubriques"); return $err; }
/** * Enregistre les modifications sur une configuration * suite à un crayon sur une meta * * La colonne est toujours 'valeur' pour ces données. * La donnée à enregistrer peut-être une sous partie de configuration. * Si c'est le cas, on gère l'enregistrement via ecrire_config. * * @param string $a * Nom ou clé de la meta (descriptif_site ou demo__truc pour demo/truc) * @param bool|array $c * Liste des champs modifiés * Ici, 'valeur' normalement. * @return void **/ function revision_meta($a, $c = false) { if (isset($c['valeur'])) { // Certaines cles de configuration sont echapées ici (cf #EDIT_CONFIG{demo/truc}) $a = str_replace('__', '/', $a); spip_log("meta '{$a}' = '{$c['valeur']}'", 'crayons'); // eviter de planter les vieux SPIP if (false === strpos($a, '/')) { ecrire_meta($a, $c['valeur']); // SPIP 3 ou Bonux 2 ou CFG } else { include_spip('inc/config'); ecrire_config($a, $c['valeur']); } include_spip('inc/invalideur'); suivre_invalideur('meta'); } }
/** * Supprimer un lien entre un document et un objet * * @param int $id_document * @param string $objet * @param int $id_objet * @param bool $supprime * si true, le document est supprime si plus lie a aucun objet * @param bool $check * si true, on verifie les documents references dans le texte de l'objet * et on les associe si pas deja fait * @return bool */ function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = false, $check = false) { if (!($id_document = intval($id_document))) { return false; } // [TODO] le mettre en paramètre de la fonction ? $serveur = ''; // D'abord on ne supprime pas, on dissocie include_spip('action/editer_liens'); objet_dissocier(array('document' => $id_document), array($objet => $id_objet), array('role' => '*')); // Si c'est une vignette, l'eliminer du document auquel elle appartient // cas tordu peu probable sql_updateq("spip_documents", array('id_vignette' => 0), "id_vignette=" . $id_document); // verifier son statut apres une suppression de lien include_spip('action/editer_document'); document_instituer($id_document); // Invalider les caches include_spip('inc/invalideur'); suivre_invalideur("id='id_document/{$id_document}'"); pipeline('post_edition', array('args' => array('operation' => 'delier_document', 'action' => 'delier_document', 'table' => 'spip_documents', 'id_objet' => $id_document, 'objet' => $objet, 'id' => $id_objet), 'data' => null)); if ($check) { // si demande, on verifie que ses documents vus sont bien lies ! $spip_table_objet = table_objet_sql($objet); $table_objet = table_objet($objet); $id_table_objet = id_table_objet($objet, $serveur); $champs = sql_fetsel('*', $spip_table_objet, addslashes($id_table_objet) . "=" . intval($id_objet)); $marquer_doublons_doc = charger_fonction('marquer_doublons_doc', 'inc'); $marquer_doublons_doc($champs, $id_objet, $objet, $id_table_objet, $table_objet, $spip_table_objet, '', $serveur); } // On supprime ensuite s'il est orphelin // et si demande // ici on ne bloque pas la suppression d'un document rattache a un autre if ($supprime and !sql_countsel('spip_documents_liens', "objet!='document' AND id_document=" . $id_document)) { $supprimer_document = charger_fonction('supprimer_document', 'action'); return $supprimer_document($id_document); } }
/** * Gere le traitement du formulaire. * * Si le chargement ou le controle n'ont pas ete fait, * la fonction s'en occupe. * * @return boolean */ function traiter() { if (!$this->verifier) $this->verifier(); if ($this->erreurs() || !$this->autoriser()) return false; if (!_request('_cfg_ok') && !_request('_cfg_delete')) return false; // les formulaires CVT ont deja leurs securites if (!$this->depuis_cvt) { $securiser_action = charger_fonction('securiser_action', 'inc'); $securiser_action(); } $this->actionner_extensions('pre_traiter'); if ($this->erreurs()) return false; // suppression if (_request('_cfg_delete')) { $this->effacer(); // sinon modification } else { $this->ecrire(); } // pipeline 'cfg_post_edition' ? (quelqu'un utilise ??) $this->messages = pipeline('cfg_post_edition',array('args'=>array('nom_config'=>$this->nom_config()),'data'=>$this->messages)); $this->actionner_extensions('post_traiter'); // annuler le cache de SPIP include_spip('inc/invalideur'); suivre_invalideur('cfg/' . $this->param['nom'] . ($this->param['casier'] ? '/' . $this->param['casier'] : '') . ($this->param['cfg_id'] ? '/' . $this->param['cfg_id'] : '')); }
/** * $c est un array ('id_article' = changement d'article) * il n'est pas autoriser de deplacer une petition * * @param $id_petition * @param $c * @param bool $calcul_rub * @return string */ function petition_instituer($id_petition, $c) { include_spip('inc/autoriser'); include_spip('inc/modifier'); $row = sql_fetsel("id_article", "spip_petitions", "id_petition=" . intval($id_petition)); $statut_ancien = $statut = $row['statut']; #$date_ancienne = $date = $row['date_time']; $champs = array(); $s = isset($c['statut']) ? $c['statut'] : $statut; // cf autorisations dans inc/petition_instituer if ($s != $statut) { $statut = $champs['statut'] = $s; // En cas de publication, fixer la date a "maintenant" // sauf si $c commande autre chose // ou si l'petition est deja date dans le futur // En cas de proposition d'un petition (mais pas depublication), idem /* if ($champs['statut'] == 'publie') { if ($d) $champs['date_time'] = $date = $d; else $champs['date_time'] = $date = date('Y-m-d H:i:s'); }*/ } // Envoyer aux plugins $champs = pipeline('pre_edition', array('args' => array('table' => 'spip_petitions', 'id_objet' => $id_petition, 'action' => 'instituer', 'statut_ancien' => $statut_ancien), 'data' => $champs)); if (!count($champs)) { return; } // Envoyer les modifs. sql_updateq('spip_petitions', $champs, 'id_petition=' . intval($id_petition)); // Invalider les caches include_spip('inc/invalideur'); suivre_invalideur("id='petition/{$id_petition}'"); suivre_invalideur("id='article/" . $row['id_article'] . "'"); // Pipeline pipeline('post_edition', array('args' => array('table' => 'spip_petitions', 'id_objet' => $id_petition, 'action' => 'instituer', 'statut_ancien' => $statut_ancien), 'data' => $champs)); // Notifications if ($notifications = charger_fonction('notifications', 'inc')) { $notifications('instituerpetition', $id_petition, array('statut' => $statut, 'statut_ancien' => $statut_ancien)); } return ''; // pas d'erreur }
function signature_a_confirmer($id_article, $url_page, $nom, $mail, $site, $url, $msg, $lang, &$statut) { include_spip('inc/texte'); include_spip('inc/filtres'); // Si on est deja connecte et que notre mail a ete valide d'une maniere // ou d'une autre, on entre directement la signature dans la base, sans // envoyer d'email. Sinon email de verification if (isset($GLOBALS['visiteur_session']['statut']) and $GLOBALS['visiteur_session']['session_email'] == $GLOBALS['visiteur_session']['email'] and strlen($GLOBALS['visiteur_session']['email']) or isset($GLOBALS['visiteur_session']['email_confirme']) and $GLOBALS['visiteur_session']['session_email'] == $GLOBALS['visiteur_session']['email_confirme'] and strlen($GLOBALS['visiteur_session']['session_email'])) { // Si on est en ajax on demande a reposter sans ajax, car il faut // recharger toute la page pour afficher la signature refuser_traiter_formulaire_ajax(); $statut = 'publie'; // invalider le cache ! include_spip('inc/invalideur'); suivre_invalideur("id='article/{$id_article}'"); // message de reussite return _T('petitions:form_pet_signature_validee'); } // // Cas normal : envoi d'une demande de confirmation // $row = sql_fetsel('titre,lang', 'spip_articles', "id_article=" . intval($id_article)); $lang = lang_select($row['lang']); $titre = textebrut(typo($row['titre'])); if ($lang) { lang_select(); } if (!strlen($statut)) { $statut = signature_test_pass(); } if ($lang != $GLOBALS['meta']['langue_site']) { $url_page = parametre_url($url_page, "lang", $lang, '&'); } $url_page = parametre_url($url_page, 'var_confirm', $statut, '&') . "#sp{$id_article}"; $r = _T('petitions:form_pet_mail_confirmation', array('titre' => $titre, 'nom_email' => $nom, 'nom_site' => $site, 'url_site' => $url, 'url' => $url_page, 'message' => $msg)); $titre = _T('petitions:form_pet_confirmation') . " " . $titre; $envoyer_mail = charger_fonction('envoyer_mail', 'inc'); if ($envoyer_mail($mail, $titre, $r)) { return _T('petitions:form_pet_envoi_mail_confirmation', array('email' => $mail)); } return false; # erreur d'envoi de l'email }
/** * Modifier le groupe parent d'un mot * @param $id_mot * @param $c * @return void */ function mot_instituer($id_mot, $c) { $champs = array(); // regler le groupe if (isset($c['id_groupe']) or isset($c['type'])) { $row = sql_fetsel("titre", "spip_groupes_mots", "id_groupe=" . intval($c['id_groupe'])); if ($row) { $champs['id_groupe'] = $c['id_groupe']; $champs['type'] = $row['titre']; } } // Envoyer aux plugins $champs = pipeline('pre_edition', array('args' => array('table' => 'spip_mots', 'id_objet' => $id_mot, 'action' => 'instituer'), 'data' => $champs)); if (!$champs) { return; } sql_updateq('spip_mots', $champs, "id_mot=" . intval($id_mot)); // // Post-modifications // // Invalider les caches include_spip('inc/invalideur'); suivre_invalideur("id='mot/{$id_mot}'"); // Pipeline pipeline('post_edition', array('args' => array('table' => 'spip_mots', 'id_objet' => $id_mot, 'action' => 'instituer'), 'data' => $champs)); // Notifications if ($notifications = charger_fonction('notifications', 'inc')) { $notifications('instituermot', $id_mot, array('id_groupe' => $champs['id_groupe'])); } return ''; // pas d'erreur }
function revisions_breves ($id_breve, $c=false) { // champs normaux if ($c === false) { $c = array(); foreach (array( 'titre', 'texte', 'lien_titre', 'lien_url', 'id_parent', 'statut' ) as $champ) if (($a = _request($champ)) !== null) $c[$champ] = $a; } // Si la breve est publiee, invalider les caches et demander sa reindexation $t = sql_getfetsel("statut", "spip_breves", "id_breve=$id_breve"); if ($t == 'publie') { $invalideur = "id='id_breve/$id_breve'"; $indexation = true; } include_spip('inc/modifier'); modifier_contenu('breve', $id_breve, array( 'nonvide' => array('titre' => _T('info_sans_titre')), 'invalideur' => $invalideur, 'indexation' => $indexation ), $c); // Changer le statut de la breve ? $row = sql_fetsel("statut, id_rubrique,lang, langue_choisie", "spip_breves", "id_breve=$id_breve"); $id_rubrique = $row['id_rubrique']; $statut_ancien = $statut = $row['statut']; $langue_old = $row['lang']; $langue_choisie_old = $row['langue_choisie']; if (_request('statut', $c) AND _request('statut', $c) != $statut AND autoriser('publierdans', 'rubrique', $id_rubrique)) { $statut = $champs['statut'] = _request('statut', $c); } // Changer de rubrique ? // Verifier que la rubrique demandee est a la racine et differente // de la rubrique actuelle if ($id_parent = intval(_request('id_parent', $c)) AND $id_parent != $id_rubrique AND (NULL !== ($lang=sql_getfetsel('lang', 'spip_rubriques', "id_parent=0 AND id_rubrique=$id_parent")))) { $champs['id_rubrique'] = $id_parent; // - changer sa langue (si heritee) if ($langue_choisie_old != "oui") { if ($lang != $langue_old) $champs['lang'] = $lang; } // si la breve est publiee // et que le demandeur n'est pas admin de la rubrique // repasser la breve en statut 'prop'. if ($statut == 'publie') { if (!autoriser('publierdans','rubrique',$id_parent)) $champs['statut'] = $statut = 'prop'; } } if (!$champs) return; sql_updateq('spip_breves', $champs, "id_breve=$id_breve"); // // Post-modifications // // Invalider les caches include_spip('inc/invalideur'); suivre_invalideur("id='id_breve/$id_breve'"); // Au besoin, changer le statut des rubriques concernees include_spip('inc/rubriques'); calculer_rubriques_if($id_rubrique, $champs, $statut_ancien); // Notifications if ($notifications = charger_fonction('notifications', 'inc')) { $notifications('instituerbreve', $id_breve, array('statut' => $statut, 'statut_ancien' => $statut_ancien) ); } }
/** * $c est un array ('statut', 'id_parent' = changement de rubrique) * statut et rubrique sont lies, car un admin restreint peut deplacer * un objet publie vers une rubrique qu'il n'administre pas * * @param string $objet * @param int $id * @param array $c * @param bool $calcul_rub * @return mixed|string */ function objet_instituer($objet, $id, $c, $calcul_rub = true) { if (include_spip('action/editer_' . $objet) and function_exists($instituer = $objet . "_instituer")) { return $instituer($id, $c, $calcul_rub); } $table_sql = table_objet_sql($objet); $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table_sql); if (!$desc or !isset($desc['field'])) { return _L("Impossible d'instituer {$objet} : non connu en base"); } include_spip('inc/autoriser'); include_spip('inc/rubriques'); include_spip('inc/modifier'); $sel = array(); $sel[] = isset($desc['field']['statut']) ? "statut" : "'' as statut"; $champ_date = ''; if (isset($desc['date']) and $desc['date']) { $champ_date = $desc['date']; } elseif (isset($desc['field']['date'])) { $champ_date = 'date'; } $sel[] = $champ_date ? "{$champ_date} as date" : "'' as date"; $sel[] = isset($desc['field']['id_rubrique']) ? 'id_rubrique' : "0 as id_rubrique"; $row = sql_fetsel($sel, $table_sql, id_table_objet($objet) . '=' . intval($id)); $id_rubrique = $row['id_rubrique']; $statut_ancien = $statut = $row['statut']; $date_ancienne = $date = $row['date']; $champs = array(); $d = ($date and isset($c[$champ_date])) ? $c[$champ_date] : null; $s = (isset($desc['field']['statut']) and isset($c['statut'])) ? $c['statut'] : $statut; // cf autorisations dans inc/instituer_objet if ($s != $statut or $d and $d != $date) { if ($id_rubrique ? autoriser('publierdans', 'rubrique', $id_rubrique) : autoriser('instituer', $objet, $id, null, array('statut' => $s))) { $statut = $champs['statut'] = $s; } else { if ($s != 'publie' and autoriser('modifier', $objet, $id)) { $statut = $champs['statut'] = $s; } else { spip_log("editer_objet {$id} refus " . join(' ', $c)); } } // En cas de publication, fixer la date a "maintenant" // sauf si $c commande autre chose // ou si l'objet est deja date dans le futur // En cas de proposition d'un objet (mais pas depublication), idem if ($champ_date) { if ($champs['statut'] == 'publie' or $champs['statut'] == 'prop' and !in_array($statut_ancien, array('publie', 'prop')) or $d) { if ($d or strtotime($d = $date) > time()) { $champs[$champ_date] = $date = $d; } else { $champs[$champ_date] = $date = date('Y-m-d H:i:s'); } } } } // Verifier que la rubrique demandee existe et est differente // de la rubrique actuelle if ($id_rubrique and $id_parent = $c['id_parent'] and $id_parent != $id_rubrique and sql_fetsel('1', "spip_rubriques", "id_rubrique=" . intval($id_parent))) { $champs['id_rubrique'] = $id_parent; // si l'objet etait publie // et que le demandeur n'est pas admin de la rubrique // repasser l'objet en statut 'propose'. if ($statut == 'publie' and !autoriser('publierdans', 'rubrique', $id_rubrique)) { $champs['statut'] = 'prop'; } } // Envoyer aux plugins $champs = pipeline('pre_edition', array('args' => array('table' => $table_sql, 'id_objet' => $id, 'action' => 'instituer', 'statut_ancien' => $statut_ancien, 'date_ancienne' => $date_ancienne, 'id_parent_ancien' => $id_rubrique), 'data' => $champs)); if (!count($champs)) { return ''; } // Envoyer les modifs. objet_editer_heritage($objet, $id, $id_rubrique, $statut_ancien, $champs, $calcul_rub); // Invalider les caches include_spip('inc/invalideur'); suivre_invalideur("id='{$objet}/{$id}'"); /* if ($date) { $t = strtotime($date); $p = @$GLOBALS['meta']['date_prochain_postdate']; if ($t > time() AND (!$p OR ($t < $p))) { ecrire_meta('date_prochain_postdate', $t); } }*/ // Pipeline pipeline('post_edition', array('args' => array('table' => $table_sql, 'id_objet' => $id, 'action' => 'instituer', 'statut_ancien' => $statut_ancien, 'date_ancienne' => $date_ancienne, 'id_parent_ancien' => $id_rubrique), 'data' => $champs)); // Notifications if ($notifications = charger_fonction('notifications', 'inc')) { $notifications("instituer{$objet}", $id, array('statut' => $statut, 'statut_ancien' => $statut_ancien, 'date' => $date, 'date_ancienne' => $date_ancienne)); } return ''; // pas d'erreur }
function joindre_documents($files, $mode, $type, $id, $id_document, $hash, $redirect, &$actifs, $iframe_redirect) { $ajouter_documents = charger_fonction('ajouter_documents', 'inc'); if (function_exists('gzopen') AND !($mode == 'distant') AND (count($files) == 1) AND (preg_match('/\.zip$/i', $files[0]['name']) OR ($files[0]['type'] == 'application/zip'))) { // on pose le fichier dans le repertoire zip // (nota : copier_document n'ecrase pas un fichier avec lui-meme // ca autorise a boucler) $desc = $files[0]; $zip = copier_document("zip", $desc['name'], $desc['tmp_name'] ); // Est-ce qu'on sait le lire ? include_spip('inc/pclzip'); $archive = $zip ? new PclZip($zip) : ''; if ($archive) { $valables = verifier_compactes($archive); if ($valables) { if (rename($zip, $tmp = _DIR_TMP.basename($zip))) { echo $ajouter_documents($valables, $tmp, $type, $id, $mode, $id_document, $actifs, $hash, $redirect, $iframe_redirect); // a tout de suite en joindre4, joindre5, ou joindre6 exit; } } } } foreach ($files as $arg) { // verifier l'extension du fichier en fonction de son type mime list($extension,$arg['name']) = fixer_extension_document($arg); check_upload_error($arg['error']); $x = $ajouter_documents($arg['tmp_name'], $arg['name'], $type, $id, $mode, $id_document, $actifs); } // un invalideur a la hussarde qui doit marcher au moins pour article, breve, rubrique include_spip('inc/invalideur'); suivre_invalideur("id='id_$type/$id'"); return $x; }
/** * Traitement de l'upload d'un logo * * Il est affecte au site si la balise n'est pas dans une boucle, * sinon a l'objet concerne par la boucle ou indiquee par les parametres d'appel * * @param string $objet Objet SPIP auquel sera lie le document (ex. article) * @param int $id_objet Identifiant de l'objet * @param string $retour Url de redirection apres traitement * @param array $options Tableau d'option (exemple : image_reduire => 50) * @return array Retour des traitements */ function formulaires_editer_logo_traiter_dist($objet, $id_objet, $retour = '', $options = array()) { $res = array('editable' => ' '); // pas dans une boucle ? formulaire pour le logo du site // dans ce cas, il faut chercher un 'siteon0.ext' if (!$objet) { $objet = 'site'; } include_spip("action/editer_logo"); // effectuer la suppression si demandee d'un logo $on = _request('supprimer_logo_on'); if ($on or _request('supprimer_logo_off')) { logo_supprimer($objet, $id_objet, $on ? 'on' : 'off'); $res['message_ok'] = ''; // pas besoin de message : la validation est visuelle set_request('logo_up', ' '); } else { $sources = formulaire_editer_logo_get_sources(); foreach ($sources as $etat => $file) { if ($file and $file['error'] == 0) { if ($err = logo_modifier($objet, $id_objet, $etat, $file)) { $res['message_erreur'] = $err; } else { $res['message_ok'] = ''; } // pas besoin de message : la validation est visuelle set_request('logo_up', ' '); } } } // Invalider les caches de l'objet include_spip('inc/invalideur'); suivre_invalideur("id='{$objet}/{$id_objet}'"); if ($retour) { $res['redirect'] = $retour; } return $res; }
/** * Modifier le statut d'un auteur, ou son login/pass * * @link http://doc.spip.org/@instituer_auteur * @param $id_auteur * @param $c * @param bool $force_webmestre * @return bool|string */ function auteur_instituer($id_auteur, $c, $force_webmestre = false) { if (!($id_auteur = intval($id_auteur))) { return false; } $erreurs = array(); // contiendra les differentes erreurs a traduire par _T() $champs = array(); // les memoriser pour les faire passer dans le pipeline pre_edition if (isset($c['login']) and strlen($c['login'])) { $champs['login'] = $c['login']; } if (isset($c['pass']) and strlen($c['pass'])) { $champs['pass'] = $c['pass']; } $statut = $statut_ancien = sql_getfetsel('statut', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)); if (isset($c['statut']) and autoriser('modifier', 'auteur', $id_auteur, null, array('statut' => $c['statut']))) { $statut = $champs['statut'] = $c['statut']; } // Restreindre avant de declarer l'auteur // (section critique sur les droits) if ($c['id_parent']) { if (is_array($c['restreintes'])) { $c['restreintes'][] = $c['id_parent']; } else { $c['restreintes'] = array($c['id_parent']); } } if (isset($c['webmestre']) and ($force_webmestre or autoriser('modifier', 'auteur', $id_auteur, null, array('webmestre' => '?')))) { $champs['webmestre'] = $c['webmestre'] == 'oui' ? 'oui' : 'non'; } // Envoyer aux plugins $champs = pipeline('pre_edition', array('args' => array('table' => 'spip_auteurs', 'id_objet' => $id_auteur, 'action' => 'instituer', 'statut_ancien' => $statut_ancien), 'data' => $champs)); if (is_array($c['restreintes']) and autoriser('modifier', 'auteur', $id_auteur, NULL, array('restreint' => $c['restreintes']))) { $rubriques = array_map('intval', $c['restreintes']); $rubriques = array_unique($rubriques); $rubriques = array_diff($rubriques, array(0)); auteur_dissocier($id_auteur, array('rubrique' => '*')); auteur_associer($id_auteur, array('rubrique' => $rubriques)); } $flag_ecrire_acces = false; // commencer par traiter les cas particuliers des logins et pass // avant les autres ecritures en base if (isset($champs['login']) or isset($champs['pass'])) { $auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)); include_spip('inc/auth'); if (isset($champs['login']) and strlen($champs['login'])) { if (!auth_modifier_login($auth_methode, $champs['login'], $id_auteur)) { $erreurs[] = 'ecrire:impossible_modifier_login_auteur'; } } if (isset($champs['pass']) and strlen($champs['pass'])) { $champs['login'] = sql_getfetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)); if (!auth_modifier_pass($auth_methode, $champs['login'], $champs['pass'], $id_auteur)) { $erreurs[] = 'ecrire:impossible_modifier_pass_auteur'; } } unset($champs['login']); unset($champs['pass']); $flag_ecrire_acces = true; } if (!count($champs)) { return implode(' ', array_map('_T', $erreurs)); } sql_updateq('spip_auteurs', $champs, 'id_auteur=' . $id_auteur); // .. mettre a jour les fichiers .htpasswd et .htpasswd-admin if ($flag_ecrire_acces or isset($champs['statut'])) { include_spip('inc/acces'); ecrire_acces(); } // Invalider les caches include_spip('inc/invalideur'); suivre_invalideur("id='auteur/{$id_auteur}'"); // Pipeline pipeline('post_edition', array('args' => array('table' => 'spip_auteurs', 'id_objet' => $id_auteur, 'action' => 'instituer', 'statut_ancien' => $statut_ancien), 'data' => $champs)); // Notifications if ($notifications = charger_fonction('notifications', 'inc')) { $notifications('instituerauteur', $id_auteur, array('statut' => $statut, 'statut_ancien' => $statut_ancien)); } return implode(' ', array_map('_T', $erreurs)); }
function signature_instituer($id_signature, $c, $calcul_rub = true) { include_spip('inc/autoriser'); include_spip('inc/modifier'); $row = sql_fetsel("S.statut, S.date_time, P.id_article", "spip_signatures AS S JOIN spip_petitions AS P ON S.id_petition=P.id_petition", "S.id_signature=" . intval($id_signature)); $statut_ancien = $statut = $row['statut']; $date_ancienne = $date = $row['date_time']; $champs = array(); $d = isset($c['date_time']) ? $c['date_time'] : null; $s = isset($c['statut']) ? $c['statut'] : $statut; // cf autorisations dans inc/signature_instituer if ($s != $statut or $d and $d != $date) { $statut = $champs['statut'] = $s; // En cas de publication, fixer la date a "maintenant" // sauf si $c commande autre chose // ou si l'signature est deja date dans le futur // En cas de proposition d'un signature (mais pas depublication), idem if ($champs['statut'] == 'publie') { if ($d) { $champs['date_time'] = $date = $d; } else { $champs['date_time'] = $date = date('Y-m-d H:i:s'); } } elseif ($d) { $champs['date_time'] = $date = $d; } } // Envoyer aux plugins $champs = pipeline('pre_edition', array('args' => array('table' => 'spip_signatures', 'id_objet' => $id_signature, 'action' => 'instituer', 'statut_ancien' => $statut_ancien), 'data' => $champs)); if (!count($champs)) { return; } // Envoyer les modifs. sql_updateq('spip_signatures', $champs, 'id_signature=' . intval($id_signature)); // Invalider les caches include_spip('inc/invalideur'); suivre_invalideur("id='signature/{$id_signature}'"); suivre_invalideur("id='article/" . $row['id_article'] . "'"); // Pipeline pipeline('post_edition', array('args' => array('table' => 'spip_signatures', 'id_objet' => $id_signature, 'action' => 'instituer', 'statut_ancien' => $statut_ancien), 'data' => $champs)); // Notifications if ($notifications = charger_fonction('notifications', 'inc')) { $notifications('instituersignature', $id_signature, array('statut' => $statut, 'statut_ancien' => $statut_ancien, 'date' => $date)); } return ''; // pas d'erreur }