4 if (!defined('_ECRIRE_INC_VERSION')) {
9 * Liste tous les traitements configurables (ayant une description)
11 * @return array Un tableau listant des saisies et leurs options
13 function traitements_lister_disponibles() {
14 static $traitements = null;
16 if (is_null($traitements)) {
17 $traitements = array();
18 $liste = find_all_in_path('traiter/', '.+[.]yaml$');
22 foreach ($liste as $fichier => $chemin) {
23 $type_traitement = preg_replace(',[.]yaml$,i', '', $fichier);
24 // On ne garde que les traitements qui ont bien la fonction
25 if (charger_fonction($type_traitement, 'traiter', true)
27 is_array($traitement = traitements_charger_infos($type_traitement))
30 $traitements[$type_traitement] = $traitement;
40 * Charger les informations contenues dans le yaml d'un traitement
42 * @param string $type_saisie Le type de la saisie
43 * @return array Un tableau contenant le YAML décodé
45 function traitements_charger_infos($type_traitement) {
46 include_spip('inc/yaml');
47 $fichier = find_in_path("traiter/$type_traitement.yaml");
48 $traitement = yaml_decode_file($fichier);
50 if (is_array($traitement)) {
51 $traitement +
= array('titre' => '', 'description' => '', 'icone' => '');
52 $traitement['titre'] = $traitement['titre'] ?
_T_ou_typo($traitement['titre']) : $type_traitement;
53 $traitement['description'] = $traitement['description'] ?
_T_ou_typo($traitement['description']) : '';
54 $traitement['icone'] = $traitement['icone'] ?
find_in_path($traitement['icone']) : '';
60 * Liste tous les types d'échanges (export et import) existant pour les formulaires
62 * @return array Retourne un tableau listant les types d'échanges
64 function echanges_formulaire_lister_disponibles() {
65 // On va chercher toutes les fonctions existantes
66 $liste = find_all_in_path('echanger/formulaire/', '.+[.]php$');
67 $types_echange = array('exporter' => array(), 'importer' => array());
69 foreach ($liste as $fichier => $chemin) {
70 $type_echange = preg_replace(',[.]php$,i', '', $fichier);
72 // On ne garde que les échanges qui ont bien la fonction
73 if ($f = charger_fonction('exporter', "echanger/formulaire/$type_echange", true)) {
74 $types_echange['exporter'][$type_echange] = $f;
76 if ($f = charger_fonction('importer', "echanger/formulaire/$type_echange", true)) {
77 $types_echange['importer'][$type_echange] = $f;
81 return $types_echange;
85 * Génère le nom du cookie qui sera utilisé par le plugin lors d'une réponse
86 * par un visiteur non-identifié.
88 * @param int $id_formulaire L'identifiant du formulaire
89 * @return string Retourne le nom du cookie
91 function formidable_generer_nom_cookie($id_formulaire) {
92 return $GLOBALS['cookie_prefix'].'cookie_formidable_'.$id_formulaire;
96 * Vérifie si le visiteur a déjà répondu à un formulaire
98 * @param int $id_formulaire L'identifiant du formulaire
99 * @param string $choix_identification Comment verifier une reponse. Priorite sur 'cookie' ou sur 'id_auteur'
100 * @param string $anonymisation : vaut '' si le formulaire n'est pas anonymisé, sinon c'est la variable d'anonymisation
101 * @return unknown_type Retourne un tableau contenant les id des réponses si elles existent, sinon false
103 function formidable_verifier_reponse_formulaire($id_formulaire, $choix_identification = 'cookie', $anonymisation = '') {
104 global $auteur_session;
105 $id_auteur = $auteur_session ?
intval($auteur_session['id_auteur']) : 0;
106 $nom_cookie = formidable_generer_nom_cookie($id_formulaire);
107 $cookie = isset($_COOKIE[$nom_cookie]) ?
$_COOKIE[$nom_cookie] : false;
109 $anonymiser = ($anonymisation == '') ?
false : true;
111 $anonymiser_variable = $anonymisation;
114 // traitement de l'anonymisation
116 // mod de l'id_auteur
117 $variables_anonymisation =
118 $GLOBALS['formulaires']['variables_anonymisation'][$anonymiser_variable];
119 $id = eval("return $variables_anonymisation;");
120 $id_auteur = formidable_scramble($id, $id_formulaire);
122 // ni cookie ni id, on ne peut rien faire
123 if (!$cookie and !$id_auteur) {
127 // priorite sur le cookie
128 if ($choix_identification == 'cookie' or !$choix_identification) {
130 $where = '(cookie='.sql_quote($cookie).($id_auteur ?
' OR id_auteur='.$id_auteur.')' : ')');
132 $where = 'id_auteur='.$id_auteur;
135 // sinon sur l'id_auteur
137 $where = 'id_auteur='.$id_auteur;
139 $where = '(cookie='.sql_quote($cookie).($id_auteur ?
' OR id_auteur='.$id_auteur.')' : ')');
143 $reponses = sql_allfetsel(
144 'id_formulaires_reponse',
145 'spip_formulaires_reponses',
147 array('=', 'id_formulaire', intval($id_formulaire)),
148 array('=', 'statut', sql_quote('publie')),
155 if (is_array($reponses)) {
156 return array_map('reset', $reponses);
163 * Génère la vue d'analyse de toutes les réponses à une saisie
165 * @param array $saisie Un tableau décrivant une saisie
166 * @param array $env L'environnement, contenant normalement la réponse à la saisie
167 * @return string Retour le HTML des vues
169 function formidable_analyser_saisie($saisie, $valeurs = array(), $reponses_total = 0, $format_brut = false) {
170 // Si le paramètre n'est pas bon ou que c'est un conteneur, on génère du vide
171 if (!is_array($saisie) or (isset($saisie['saisies']) and $saisie['saisies'])) {
175 $contexte = array('reponses_total'=>$reponses_total);
177 // On sélectionne le type de saisie
178 $contexte['type_saisie'] = $saisie['saisie'];
180 // Peut-être des transformations à faire sur les options textuelles
181 $options = $saisie['options'];
182 foreach ($options as $option => $valeur) {
183 $options[$option] = _T_ou_typo($valeur, 'multi');
186 // On ajoute les options propres à la saisie
187 $contexte = array_merge($contexte, $options);
189 // On récupère toutes les valeurs du champ
190 if (isset($valeurs[$contexte['nom']])
191 and $valeurs[$contexte['nom']]
192 and is_array($valeurs[$contexte['nom']])) {
193 $contexte['valeurs'] = $valeurs[$contexte['nom']];
195 $contexte['valeurs'] = array();
198 // On génère la saisie
200 return analyser_saisie($contexte);
202 return recuperer_fond(
203 'saisies-analyses/_base',
210 * Renvoie une ligne de réponse sous la forme d'un tableau
212 * @param array $saisie Un tableau décrivant une saisie
213 * @return array Tableau contenant une ligne
215 function analyser_saisie($saisie) {
216 if (!isset($saisie['type_saisie']) or $saisie['type_saisie'] == '') {
222 switch ($saisie['type_saisie']) {
223 case 'selecteur_rubrique':
224 case 'selecteur_rubrique_article':
225 case 'selecteur_article':
226 $ligne['plein'] = count(array_filter($saisie['valeurs']));
227 $ligne['vide'] = count(array_diff_key($saisie['valeurs'], array_filter($saisie['valeurs'])));
231 case 'selection_multiple':
232 case 'choix_couleur':
235 foreach ($saisie['valeurs'] as $valeur) {
236 if (is_array($valeur)) {
237 foreach ($valeur as $choix) {
238 if (isset($stats["choix-$choix"])) {
239 $stats["choix-$choix"]++
;
241 $stats["choix-$choix"] = 1;
245 if (isset($stats["choix-$valeur"])) {
246 $stats["choix-$valeur"]++
;
248 $stats["choix-$valeur"] = 1;
252 $datas = is_string($saisie['datas'])
253 ?
saisies_chaine2tableau(saisies_aplatir_chaine($saisie['datas']))
255 foreach ($datas as $key => $val) {
256 $nb = (isset($stats["choix-$key"]))
257 ?
$stats["choix-$key"]
262 case 'destinataires':
264 foreach ($saisie['valeurs'] as $valeur) {
265 foreach ($valeur as $choix) {
266 if (isset($stats["choix-$choix"])) {
267 $stats["choix-$choix"]++
;
269 $stats["choix-$choix"] = 1;
273 foreach ($stats as $key => $val) {
274 $key = str_replace('choix-', '', $key);
276 $key = '<valeur vide>';
278 $auteur = sql_getfetsel('nom', 'spip_auteurs', "id_auteur=$key");
279 $ligne[$auteur] = $val;
285 foreach ($saisie['valeurs'] as $valeur) {
289 switch ($saisie['type_saisie']) {
292 if (isset($ligne['oui']) == false) {
295 if (isset($ligne['non']) == false) {
310 $ligne['sans_reponse'] = $vide;
311 $ligne['header'] = $saisie['label'] != ''
313 : $saisie['type_saisie'];
320 * Tente de déserialiser un texte
322 * Si le paramètre est un tableau, retourne le tableau,
323 * Si c'est une chaîne, tente de la désérialiser, sinon
324 * retourne la chaîne.
328 * @param string|array $texte
329 * Le texte (possiblement sérializé) ou un tableau
330 * @return array|string
331 * Tableau, texte désérializé ou texte
333 function filtre_tenter_unserialize_dist($texte) {
334 if (is_array($texte)) {
337 if ($tmp = @unserialize
($texte)) {
345 * Retourne un texte du nombre de réponses
350 * Texte indiquant le nombre de réponses
352 function titre_nb_reponses($nb) {
354 return _T('formidable:reponse_aucune');
357 return _T('formidable:reponse_une');
359 return _T('formidable:reponses_nb', array('nb' => $nb));
363 * Transforme le hash MD5 en une valeur numérique unique
365 * trouvé ici : http://stackoverflow.com/questions/1422725/represent-md5-hash-as-an-integer
366 * @param string $hex_str La valeur alphanumérique à transformer
367 * @return string Valeur numérique
369 function md5_hex_to_dec($hex_str) {
370 $arr = str_split($hex_str, 4);
372 foreach ($arr as $grp) {
373 $dec[] = str_pad(hexdec($grp), 5, '0', STR_PAD_LEFT
);
376 /* on s'assure que $result ne commence pas par un zero */
377 $result = implode('', $dec);
378 for ($cpt = 0; $cpt < strlen($result); $cpt++
) {
379 if ($result[$cpt] != '0') {
383 $result = substr($result, $cpt);
388 * Transforme un login en une valeur numérique de 19 caractères
390 * NOTE: il devient impossible de retrouver la valeur d'origine car le HASH
391 * est coupé à 19cars et est donc incomplet. L'unicité n'est pas garantie mais
392 * les chances pour que deux logins tombent sur le même HASH sont de 1 sur
393 * 10 milliards de milliards
394 * A la fin, on recherche et supprime les éventuels zéros de début
395 * @param string $login Login à transformer
396 * @param string $id_form ID du formulaire concerné
397 * @param string $passwd Chaîne 'secrète' ajoutée au login et id_formulaire pour éviter
398 * les recoupements d'identité entre plusieurs formulaires
399 * @return string Un nombre de 19 chiffres
401 function formidable_scramble($login, $id_form, $passwd = '') {
403 $passwd = $GLOBALS['formulaires']['passwd']['interne'];
405 $login_md5 = md5("$login$passwd$id_form");
406 $login_num = md5_hex_to_dec($login_md5);
407 $login_num = substr($login_num, 0, 19);