function affiche_boutons_admin($contenu) { include_spip('inc/filtres'); // Inserer le css d'admin $css = "<link rel='stylesheet' href='".url_absolue(find_in_path('spip_admin.css')) . "' type='text/css' />\n"; if ($f = find_in_path('spip_admin_perso.css')) $css .= "<link rel='stylesheet' href='" . url_absolue($f) . "' type='text/css' />\n"; ($pos = stripos($contenu, '</head>')) || ($pos = stripos($contenu, '<body>')) || ($pos = 0); $contenu = substr_replace($contenu, $css, $pos, 0); // Inserer la balise #FORMULAIRE_ADMIN, en float $boutons_admin = inclure_balise_dynamique( balise_FORMULAIRE_ADMIN_dyn('spip-admin-float'), false); ($pos = strripos($contenu, '</body>')) || ($pos = strripos($contenu, '</html>')) || ($pos = strlen($contenu)); $contenu = substr_replace($contenu, $boutons_admin, $pos, 0); return $contenu; }
function traiter_formulaires_dynamiques($get=false){ static $post = array(); static $done = false; if ($get) return $post; if ($done) return false; $done = true; if (!($form = _request('formulaire_action') AND $args = _request('formulaire_action_args'))) return false; // le hit peut continuer normalement include_spip('inc/filtres'); if (($args = decoder_contexte_ajax($args,$form))===false) { spip_log("signature ajax form incorrecte : $form"); return false; // continuons le hit comme si de rien etait } else { include_spip('inc/lang'); // sauvegarder la lang en cours $old_lang = $GLOBALS['spip_lang']; // changer la langue avec celle qui a cours dans le formulaire // on la depile de $args car c'est un argument implicite masque changer_langue(array_shift($args)); $verifier = charger_fonction("verifier","formulaires/$form/",true); $post["erreurs_$form"] = pipeline( 'formulaire_verifier', array( 'args'=>array('form'=>$form,'args'=>$args), 'data'=>$verifier?call_user_func_array($verifier,$args):array()) ); if ((count($post["erreurs_$form"])==0)){ $rev = ""; $retour = ""; if ($traiter = charger_fonction("traiter","formulaires/$form/",true)) $rev = call_user_func_array($traiter,$args); $rev = pipeline( 'formulaire_traiter', array( 'args'=>array('form'=>$form,'args'=>$args), 'data'=>$rev) ); // le retour de traiter peut avoir 3 formats // - simple message texte // - tableau a deux entrees ($editable,$message) // - tableau explicite ('editable'=>$editable,'message_ok'=>$message,'redirect'=>$redirect,'id_xx'=>$id_xx) // le dernier format est celui conseille car il permet le pipelinage, en particulier // en y passant l'id de l'objet cree/modifie // si message_erreur est present, on considere que le traitement a echoue // cas du message texte simple if (!is_array($rev)){ $post["message_ok_$form"] = $rev; } // cas du tableau deux valeurs simple (ancien format, deconseille) elseif (count($rev)==2 AND !array_key_exists('message_ok',$rev) AND !array_key_exists('message_erreur',$rev) AND !array_key_exists('redirect',$rev)) { $post["editable_$form"] = reset($rev); $post["message_ok_$form"] = end($rev); } // cas du tableau explicite (conseille) else { // verifier si traiter n'a pas echoue avec une erreur : if (isset($rev['message_erreur'])) { $post["erreurs_$form"]["message_erreur"] = $rev['message_erreur']; } else { // sinon faire ce qu'il faut : if (isset($rev['message_ok'])) $post["message_ok_$form"] = $rev['message_ok']; if (isset($rev['editable'])) $post["editable_$form"] = $rev['editable']; // si une redirection est demandee, appeler redirigae_formulaire qui choisira // le bon mode de redirection (302 et on ne revient pas ici, ou javascript et on continue) if (isset($rev['redirect']) AND $rev['redirect']){ include_spip('inc/headers'); list($masque,$message) = redirige_formulaire($rev['redirect'], '','ajaxform'); $post["message_ok_$form"] .= $message; $retour .= $masque; } } } } // si le formulaire a ete soumis en ajax, on le renvoie direct ! if (_request('var_ajax')){ if (find_in_path('formulaire_.php','balise/',true)) { include_spip('inc/actions'); include_spip('public/assembler'); array_unshift($args,$form); $retour .= inclure_balise_dynamique(call_user_func_array('balise_formulaire__dyn',$args),false); // on ajoute un br en display none en tete du retour ajax pour regler un bug dans IE6/7 // sans cela le formulaire n'est pas actif apres le hit ajax $retour = "<br class='bugajaxie' style='display:none;'/>".$retour; ajax_retour($retour,false); return true; // on a fini le hit } } // restaurer la lang en cours changer_langue($old_lang); } return false; // le hit peut continuer normalement }
/** * Preparer la previsu d'un message de forum * * http://code.spip.net/@inclure_previsu * * @param string $texte * @param string $titre * @param string $url_site * @param string $nom_site * @param array $ajouter_mot * @param array $doc * @param string $objet * @param int $id_objet * @param int $id_forum * @return string */ function inclure_previsu($texte, $titre, $url_site, $nom_site, $ajouter_mot, $doc, $objet, $id_objet, $id_forum) { global $table_des_traitements; $bouton = _T('forum:forum_message_definitif'); include_spip('public/assembler'); include_spip('public/composer'); // appliquer les traitements de #TEXTE a la previsu // comme on voit c'est complique... y a peut-etre plus simple ? // recuperer les filtres eventuels de 'mes_fonctions.php' sur les balises include_spip('public/parametrer'); $tmptexte = ""; $evaltexte = isset($table_des_traitements['TEXTE']['forums']) ? $table_des_traitements['TEXTE']['forums'] : $table_des_traitements['TEXTE'][0]; $evaltexte = '$tmptexte = ' . str_replace('%s', '$texte', $evaltexte) . ';'; // evaluer... // [fixme] // $connect et $Pile ne sont pas definis ici :/ // mais font souvent partie des variables appelees par les traitements $connect = ""; $Pile = array(0 => array()); eval($evaltexte); // supprimer les <form> de la previsualisation // (sinon on ne peut pas faire <cadre>...</cadre> dans les forums) return preg_replace("@<(/?)form\\b@ism", '<\\1div', inclure_balise_dynamique(array('formulaires/inc-forum_previsu', 0, array('titre' => safehtml(typo($titre)), 'texte' => $tmptexte, 'notes' => safehtml(calculer_notes()), 'url_site' => vider_url($url_site), 'nom_site' => safehtml(typo($nom_site)), 'ajouter_mot' => is_array($ajouter_mot) ? $ajouter_mot : array($ajouter_mot), 'ajouter_document' => $doc, 'bouton' => $bouton, 'objet' => $objet, 'id_objet' => $id_objet, 'id_forum' => $id_forum)), false)); }
function debusquer_entete($titre, $corps) { global $debug_objets; include_spip('balise/formulaire_admin'); include_spip('public/assembler'); // pour inclure_balise_dynamique include_spip('inc/texte'); // pour corriger_typo return _DOCTYPE_ECRIRE . html_lang_attributes() . "<head>\n<title>" . ('SPIP ' . $GLOBALS['spip_version_affichee'] . ' ' . _T('admin_debug') . ' ' . $titre . ' (' . supprimer_tags(corriger_typo($GLOBALS['meta']['nom_site']))) . ")</title>\n" . "<meta http-equiv='Content-Type' content='text/html" . (($c = $GLOBALS['meta']['charset']) ? "; charset={$c}" : '') . "' />\n" . http_script('', 'jquery.js') . "<link rel='stylesheet' href='" . url_absolue(find_in_path('spip_admin.css')) . "' type='text/css' />" . "</head>\n" . "<body style='margin:0 10px;'>\n" . "<div id='spip-debug-header'>" . $corps . inclure_balise_dynamique(balise_FORMULAIRE_ADMIN_dyn('spip-admin-float', $debug_objets), false) . '</div></body></html>'; }
function inclure_forum_prive_previsu($texte, $titre, $url_site, $nom_site, $ajouter_mot, $doc = "") { $bouton = _T('forum:forum_message_definitif'); include_spip('public/assembler'); include_spip('public/composer'); // supprimer les <form> de la previsualisation // (sinon on ne peut pas faire <cadre>...</cadre> dans les forums) return preg_replace("@<(/?)form\\b@ism", '<\\1div', inclure_balise_dynamique(array('formulaires/inc-forum_prive_previsu', 0, array('titre' => safehtml(typo($titre)), 'texte' => safehtml(propre($texte)), 'notes' => safehtml(calculer_notes()), 'url_site' => vider_url($url_site), 'nom_site' => safehtml(typo($nom_site)), 'ajouter_mot' => is_array($ajouter_mot) ? $ajouter_mot : array($ajouter_mot), 'ajouter_document' => $doc, 'bouton' => $bouton)), false)); }
function inclure_previsu($texte,$titre, $url_site, $nom_site, $ajouter_mot, $doc, $id_rubrique, $id_forum, $id_article, $id_breve, $id_syndic) { global $table_des_traitements; $bouton = _T('forum_message_definitif'); include_spip('public/assembler'); include_spip('public/composer'); // appliquer les traitements de #TEXTE a la previsu // comme on voit c'est complique... y a peut-etre plus simple ? // recuperer les filtres eventuels de 'mes_fonctions.php' sur les balises include_spip('public/parametrer'); $evaltexte = isset($table_des_traitements['TEXTE']['forums']) ? $table_des_traitements['TEXTE']['forums'] : $table_des_traitements['TEXTE'][0]; $evaltexte = '$tmptexte = '.str_replace('%s', '$texte', $evaltexte).';'; // evaluer... eval($evaltexte); // supprimer les <form> de la previsualisation // (sinon on ne peut pas faire <cadre>...</cadre> dans les forums) return preg_replace("@<(/?)form\b@ism", '<\1div', inclure_balise_dynamique(array('formulaires/inc-forum_previsu', 0, array( 'titre' => safehtml(typo($titre)), 'texte' => $tmptexte, 'notes' => safehtml(calculer_notes()), 'url_site' => vider_url($url_site), 'nom_site' => safehtml(typo($nom_site)), 'ajouter_mot' => (is_array($ajouter_mot) ? $ajouter_mot : array($ajouter_mot)), 'ajouter_document' => $doc, 'erreur' => $erreur, 'bouton' => $bouton, 'id_rubrique' => $id_rubrique, 'id_forum' => $id_forum, 'id_article' => $id_article, 'id_breve' => $id_breve, 'id_syndic' => $id_syndic ) ), false)); }
function traiter_formulaires_dynamiques($get = false) { static $post = array(); static $done = false; if ($get) { return $post; } if ($done) { return false; } $done = true; if (!($form = _request('formulaire_action') and $args = _request('formulaire_action_args'))) { return false; } // le hit peut continuer normalement include_spip('inc/filtres'); if (($args = decoder_contexte_ajax($args, $form)) === false) { spip_log("signature ajax form incorrecte : {$form}"); return false; // continuons le hit comme si de rien etait } else { include_spip('inc/lang'); // sauvegarder la lang en cours $old_lang = $GLOBALS['spip_lang']; // changer la langue avec celle qui a cours dans le formulaire // on la depile de $args car c'est un argument implicite masque changer_langue(array_shift($args)); // inclure mes_fonctions et autres filtres avant verifier/traiter include_spip('public/parametrer'); // ainsi que l'API SQL bien utile dans verifier/traiter include_spip('base/abstract_sql'); $verifier = charger_fonction("verifier", "formulaires/{$form}/", true); $post["erreurs_{$form}"] = pipeline('formulaire_verifier', array('args' => array('form' => $form, 'args' => $args), 'data' => $verifier ? call_user_func_array($verifier, $args) : array())); // accessibilite : si des erreurs mais pas de message general l'ajouter if (count($post["erreurs_{$form}"]) and !isset($post["erreurs_{$form}"]['message_erreur'])) { $post["erreurs_{$form}"]['message_erreur'] = singulier_ou_pluriel(count($post["erreurs_{$form}"]), 'avis_1_erreur_saisie', 'avis_nb_erreurs_saisie'); } // si on ne demandait qu'une verif json if (_request('formulaire_action_verifier_json')) { include_spip('inc/json'); include_spip('inc/actions'); ajax_retour(json_encode($post["erreurs_{$form}"]), 'text/plain'); return true; // on a fini le hit } $retour = ""; if (count($post["erreurs_{$form}"]) == 0) { $rev = ""; if ($traiter = charger_fonction("traiter", "formulaires/{$form}/", true)) { $rev = call_user_func_array($traiter, $args); } $rev = pipeline('formulaire_traiter', array('args' => array('form' => $form, 'args' => $args), 'data' => $rev)); // le retour de traiter est // un tableau explicite ('editable'=>$editable,'message_ok'=>$message,'redirect'=>$redirect,'id_xx'=>$id_xx) // il permet le pipelinage, en particulier // en y passant l'id de l'objet cree/modifie // si message_erreur est present, on considere que le traitement a echoue $post["message_ok_{$form}"] = ''; // on peut avoir message_ok et message_erreur if (isset($rev['message_ok'])) { $post["message_ok_{$form}"] = $rev['message_ok']; } // verifier si traiter n'a pas echoue avec une erreur : if (isset($rev['message_erreur'])) { $post["erreurs_{$form}"]["message_erreur"] = $rev['message_erreur']; // si il y a une erreur on ne redirige pas } else { // sinon faire ce qu'il faut : if (isset($rev['editable'])) { $post["editable_{$form}"] = $rev['editable']; } // si une redirection est demandee, appeler redirigae_formulaire qui choisira // le bon mode de redirection (302 et on ne revient pas ici, ou javascript et on continue) if (isset($rev['redirect']) and $rev['redirect']) { include_spip('inc/headers'); list($masque, $message) = redirige_formulaire($rev['redirect'], '', 'ajaxform'); $post["message_ok_{$form}"] .= $message; $retour .= $masque; } } } // si le formulaire a ete soumis en ajax, on le renvoie direct ! if (_request('var_ajax')) { if (find_in_path('formulaire_.php', 'balise/', true)) { include_spip('inc/actions'); include_spip('public/assembler'); array_unshift($args, $form); $retour .= inclure_balise_dynamique(call_user_func_array('balise_formulaire__dyn', $args), false); // on ajoute un br en display none en tete du retour ajax pour regler un bug dans IE6/7 // sans cela le formulaire n'est pas actif apres le hit ajax // la classe ajax-form-is-ok sert a s'assurer que le retour ajax s'est bien passe $retour = "<br class='bugajaxie ajax-form-is-ok' style='display:none;'/>" . $retour; ajax_retour($retour, false); return true; // on a fini le hit } } // restaurer la lang en cours changer_langue($old_lang); } return false; // le hit peut continuer normalement }
function inserer_balise_dynamique($contexte_exec, $contexte_compil) { if (!is_array($contexte_exec)) { echo $contexte_exec; } else { inclure_balise_dynamique($contexte_exec, true, $contexte_compil); } }
function balise_FORMULAIRE_CONTACT_dyn($id_machin) { /* c’est ici qu’on met le traitement des données (insertion en base etc). Elle reçoit les valeures retournées par la fonction _stat et doit retourner soit : * un message d’erreur * un tableau représentant un squelette SPIP : 1. le nom du fond (e.g. "formulaires/formulaire_forum") 2. le délais 3. un tableau des paramètres à passer à ce squelette (ensuite accessible par #ENV) On peut acceder ici aux variables postées par le formulaire en utilisation la fonction _request('name'); et faire des traitements en fonction de celles ci pour faire l’insertion en base, envoyer un mail etc... */ global $_FILES, $_HTTP_POST_FILES; // ces variables sont indispensables pour récuperer les documents joints // Récupération de id de la rubrique en cours $rubrique = intval(_request('id_rubrique')); // on recuperer l'id de l'auteur anonymous $connect_id_auteur = intval(_request('id_auteur')); // si il n'est pas dans la base => plugins openpublishing mal installé if (!$connect_id_auteur) { echo "Attention votre URL ne comporte pas d'id_auteur !"; die("Veuillez modifier l'appelle à cette page pour y inclure cet identifiant auteur"); } // récupération des variables du formulaire HTML // données actions $previsualiser = _request('previsualiser'); $valider = _request('valider'); $media = _request('media'); $abandonner = _request('abandonner'); // on quitte et renvoie vers le sommaire if ($abandonner) { $retour = '<div align="center"> <h3>Vous avez abandonné la création d\'un article. <br /> <br /> Aucne information na été enregistrée.</h3> </div>'; $message = '<META HTTP-EQUIV="refresh" content="3; url=spip.php?page=rubrique&id_rubrique=' . $rubrique . '">'; $message = $message . $retour; return $message; } // on recupere l'id article (sinon on créer un nouveau article à chaque prévisualisation ou ajout de document ... $article = intval(stripslashes(_request('article'))); // données pour formulaire document $formulaire_documents = stripslashes(_request('formulaire_documents')); $doc = stripslashes(_request('doc')); $type_doc = stripslashes(_request('type')); // donnée article $surtitre = stripslashes(_request('surtitre')); $titre = stripslashes(_request('titre')); $soustitre = stripslashes(_request('soustitre')); $descriptif = stripslashes(_request('descriptif')); $nom_site = stripslashes(_request('nom_site')); $url_site = stripslashes(_request('url_site')); $chapo = stripslashes(_request('chapo')); $texte = stripslashes(_request('texte')); $ps = stripslashes(_request('ps')); // déclarations de variables supplémentaires (pour la fonction ajout_document) $documents_actifs = array(); // autres variables $lang = _request('var_lang'); $nom = 'changer_lang'; lang_dselect(); $langues = liste_options_langues($nom, $lang); // remise à zero $formulaire_previsu = ''; $bouton = ''; $mess_error = ''; $erreur_document = 0; // filtrage des zones de texte si elles sont emplies if ($titre) { $titre = entites_html($titre); } // on demande un nouvel identifiant if ($previsualiser || $media || $valider) { if (!$article) { $article = op_request_new_id($connect_id_auteur); } } // l'auteur demande la publication de son article if ($valider) { // statut de l'article : proposé $statut = 'prop'; /****** préparation de la mise en base de donnée ********/ // on recupere le secteur et la langue associée $s = spip_query("SELECT id_secteur, lang FROM spip_rubriques WHERE id_rubrique = '{$rubrique}' "); if ($r = spip_fetch_array($s)) { $id_secteur = $r["id_secteur"]; $lang = $r["lang"]; // L'article existe déjà, on fait donc un UPDATE, et non un INSERT $retour = spip_query('UPDATE spip_articles SET titre = ' . spip_abstract_quote($titre) . ', id_rubrique = ' . spip_abstract_quote($rubrique) . ', texte = ' . spip_abstract_quote($texte) . ', statut = ' . spip_abstract_quote($statut) . ', lang = ' . spip_abstract_quote($lang) . ', id_secteur = ' . spip_abstract_quote($id_secteur) . ', ps =' . spip_abstract_quote($ps) . ', nom_site =' . spip_abstract_quote($nom_site) . ', url_site =' . spip_abstract_quote($url_site) . ', surtitre =' . spip_abstract_quote($surtitre) . ', soustitre =' . spip_abstract_quote($soustitre) . ', chapo =' . spip_abstract_quote($chapo) . ', descriptif =' . spip_abstract_quote($descriptif) . ', date = NOW()' . ', date_redac = NOW()' . ', date_modif = NOW()' . ' WHERE id_article = ' . spip_abstract_quote($article)); if ($retour == 1) { // tout c'est bien passé $retour = ''; } else { $retour = "Erreur lors de l'insertion de votre article dans la base de donnée, veuillez contactez les responsables du site"; } } $retour = '<div align="center"> <h3>Votre article a bien été enregistré. <br /> <br /> Il sera publié après validation.</h3> </div>'; $message = '<META HTTP-EQUIV="refresh" content="3; url=spip.php?page=rubrique&id_rubrique=' . $rubrique . '">'; $message = $message . $retour; return $message; } else { // statut de l'article : en préparation $statut = "prepa"; // si l'auteur demande la prévisualisation if ($previsualiser) { // quelques petites vérifications if (strlen($titre) < 3) { $erreur .= _T('forum_attention_trois_caracteres'); } if (!$erreur) { $bouton = _T('Proposer'); } // on rempli le formulaire de prévisualisation $formulaire_previsu = inclure_balise_dynamique(array('formulaires/FORMULAIRE_CONTACT_previsu', 0, array('date_redac' => $date_redac, 'titre' => interdire_scripts(typo($titre)), 'texte' => propre($texte), 'ps' => propre($ps), 'nom_site' => propre($nom_site), 'url_site' => propre($url_site), 'surtitre' => propre($surtitre), 'soustitre' => propre($soustitre), 'chapo' => propre($chapo), 'descriptif' => propre($descriptif), 'erreur' => $erreur)), false); // aucune idée de ce que c'est, mais ça à l'air important $formulaire_previsu = preg_replace("@<(/?)f(orm[>[:space:]])@ism", "<\\1no-f\\2", $formulaire_previsu); } // si l'auteur ajoute un documents if ($media) { // compatibilité php < 4.1 if (!$_FILES) { $_FILES = $GLOBALS['HTTP_POST_FILES']; } // récupération des variables $fichier = $_FILES['doc']['name']; $size = $_FILES['doc']['size']; $tmp = $_FILES['doc']['tmp_name']; $type = $_FILES['doc']['type']; $error = $_FILES['doc']['error']; // vérification si upload OK if (!is_uploaded_file($tmp)) { echo $error; $mess_error = "Erreur d'upload ! le fichier temporaire est introuvable. <br /> Il ce peut que vous tentiez d'uploader un fichier trop volumineux. <br /> La taille maximale autorisée est de 5 Mo"; $erreur_document = 1; } else { inc_ajouter_documents_dist($tmp, $fichier, "article", $article, $type_doc, $id_document, &$documents_actifs); } } // cas d'un nouvel article ou re-affichage du formulaire // Gestion des documents $bouton = "Ajouter un nouveau document"; $formulaire_documents = inclure_balise_dynamique(array('formulaires/formulaire_documents', 0, array('id_article' => $article, 'bouton' => $bouton)), false); // Liste des documents associés à l'article op_liste_vignette($article); // le bouton valider $bouton = _T('Proposer'); // et on remplit le formulaire avec tout ça return array('formulaires/formulaire_contact', 0, array('formulaire_documents' => $formulaire_documents, 'formulaire_previsu' => $formulaire_previsu, 'formulaire_agenda' => $formulaire_agenda, 'bouton' => $bouton, 'article' => $article, 'rubrique' => $rubrique, 'surtitre' => $surtitre, 'soustitre' => $soustitre, 'descriptif' => $descriptif, 'nom_site' => $nom_site, 'url_site' => $url_site, 'chapo' => $chapo, 'ps' => $ps, 'mess_error' => $mess_error, 'url' => $url, 'titre' => interdire_scripts(typo($titre)), 'texte' => $texte)); } }
function inserer_balise_dynamique($contexte_exec, $contexte_compil) { if (!is_array($contexte_exec)) echo $contexte_exec; // message d'erreur etc else { inclure_balise_dynamique($contexte_exec, true, $contexte_compil); } }