source: spip-zone/_plugins_/Association/Associaspip/association_options.php @ 65117

Last change on this file since 65117 was 65117, checked in by gildas.cotomale@…, 9 years ago

corrections dans r64917 et autres

File size: 41.4 KB
Line 
1<?php
2/***************************************************************************\
3 *  Associaspip, extension de SPIP pour gestion d'associations             *
4 *                                                                         *
5 *  Copyright (c) 2007 Bernard Blazin & Fran�ois de Montlivault            *
6 *  Copyright (c) 2010 Emmanuel Saint-James                                *
7 *                                                                         *
8 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
9 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
10\***************************************************************************/
11
12if (!defined('_ECRIRE_INC_VERSION'))
13        return;
14
15// Le premier element indique un ancien membre
16$GLOBALS['association_liste_des_statuts'] =
17  array('sorti','prospect','ok','echu','relance');
18
19$GLOBALS['association_styles_des_statuts'] = array(
20        'echu' => 'impair',
21        'ok' => 'valide',
22        'prospect' => 'prospect',
23        'relance' => 'pair',
24        'sorti' => 'sortie'
25);
26
27define('_DIR_PLUGIN_ASSOCIATION_ICONES', _DIR_PLUGIN_ASSOCIATION.'img_pack/');
28
29// boutons d'action (si page de script indiquee) dans les listing
30function association_bouton($texte, $image, $script='', $args='', $img_attributes='')
31{
32        $res = ($script ? '<a href="'.generer_url_ecrire($script, $args).'">' : '' );
33        $res .= '<img src="'._DIR_PLUGIN_ASSOCIATION_ICONES.$image.'" alt="';
34        $res .= ($texte ? _T('asso:'.$texte).'" title="'._T('asso:'.$texte) : ' ' );
35        $res .= '" '.$img_attributes.' />';
36        $res .= ($script?'</a>':'');
37        return $res;
38}
39
40// cas des boutons de vue non modifiable ou apercu dans les listing
41function association_bouton_afficher($objet, $args='', $tag='td')
42{
43        $res = ($tag?"<$tag class='action'>":'');
44        $res .= association_bouton('bouton_voir', 'voir-12.png', "voir_$objet", is_numeric($args)?"id=$args":$args, 'width="12" height="12" alt="&#x2380;"');
45        $res .= ($tag?"</$tag>":'');
46        return $res;
47}
48
49// cas des boutons d'edition (modification) dans les listing
50function association_bouton_modifier($objet, $args='', $tag='td')
51{
52        $res = ($tag?"<$tag class='action'>":'');
53        $res .= association_bouton('bouton_modifier', 'edit-12.gif', "edit_$objet", is_numeric($args)?"id=$args":$args, 'width="12" height="12" alt="&#x2380;"');
54        $res .= ($tag?"</$tag>":'');
55        return $res;
56}
57
58// cas des boutons d'effacement (suppression) dans les listing
59// ToDo: voir s'il est possible d'utiliser plutot la fonction bouton_action($libelle, $url, $class="", $confirm="", $title="") definie dans /ecrire/inc/filtres.php
60function association_bouton_supprimer($objet, $args='', $tag='td')
61{
62        $res = ($tag?"<$tag class='action'>":'');
63        $res .= association_bouton('bouton_supprimer', 'suppr-12.gif', "suppr_$objet", is_numeric($args)?"id=$args":$args, 'width="12" height="12" alt="&#x2327;"'); // 8 pluriel contre 3 singulier
64        $res .= ($tag?"</$tag>":'');
65        return $res;
66}
67
68function request_statut_interne()
69{
70        $statut_interne = _request('statut_interne');
71        if (in_array($statut_interne, $GLOBALS['association_liste_des_statuts'] ))
72                return 'statut_interne='. sql_quote($statut_interne);
73        elseif ($statut_interne=='tous')
74                return "statut_interne LIKE '%'";
75        else {
76                set_request('statut_interne', 'defaut');
77                $a = $GLOBALS['association_liste_des_statuts'];
78                array_shift($a);
79                return sql_in('statut_interne', $a);
80        }
81}
82
83// demande de confirmation dans
84function bloc_confirmer_suppression($type,$id,$retour='')
85{
86        $res = '<p><strong>'. _T('asso:vous_aller_effacer', array('quoi'=>'<i>'._T('asso:objet_num',array('objet'=>$type,'num'=>$id)).'</i>') ) .'</strong></p>';
87        $res .= '<p class="boutons"><input type="submit" value="'._T('asso:bouton_confirmer').'" /></p>';
88        echo redirige_action_post("supprimer_{$type}s", $id, ($retour?$retour:$type.'s'), '', $res);
89
90}
91
92// recupere dans une chaine un champ d'une table spip_asso_XXs pour un enregistrement identifie par son id_XX
93// un dernier drapeau mis a FALSE permet de traiter le cas des tables _plan|destination|destination_op qui n'ont pas de "s" final...
94/* conversion d'anciennes fonctions :
95 * exercice_intitule($exo) <=> sql_asso1champ('exercice', $exo, 'intitule')
96 * exercice_date_debut($exercice) <=> sql_asso1champ('exercice', $exercice, 'debut')
97 * exercice_date_fin($exercice) <=> sql_asso1champ('exercice', $exercice, 'fin')
98 */
99function sql_asso1champ($table, $id, $champ, $pluriel=TRUE)
100{
101        return sql_getfetsel($champ, "spip_asso_$table".($pluriel?'s':''), "id_$table=".intval($id));
102}
103
104// recupere dans un tableau associatif un enregistrement d'une table spip_asso_XX identifie par son id_XX
105// un dernier drapeau mis a FALSE permet de traiter le cas des tables _plan|destination|destination_op qui n'ont pas de "s" final...
106function sql_asso1ligne($table, $id, $pluriel=TRUE)
107{
108        return sql_fetsel('*', "spip_asso_$table".($pluriel?'s':''), "id_$table=".intval($id));
109}
110
111// Affichage micro-formate d'un nom complet (de membre) suivant la configuration du plugin (i.e. champs geres ou non)
112function association_calculer_nom_membre($civilite, $prenom, $nom, $html_tag='')
113{
114        $res = '';
115        if ($html_tag) {
116                $res = '<'.$html_tag.' class="'. (($civilite || $prenonm)?'n':'fn') .'">';
117        }
118        if ($GLOBALS['association_metas']['civilite']=='on' && $civilite) {
119                $res .= ($html_tag?'<span class="honorific-prefix">':'') .$civilite. ($html_tag?'</span>':'') .' ';
120        }
121        if ($GLOBALS['association_metas']['prenom']=='on' && $prenom) {
122                $res .= ($html_tag?'<span class="given-name">':'') .$prenom. ($html_tag?'</span>':'') .' ';
123        }
124        if ($nom) {
125                $res .= ($html_tag?'<span class="family-name">':'') .$nom. ($html_tag?'</span>':'') .' ';
126        }
127        if ($html_tag) {
128                $res .= '</'.$html_tag.'>';
129        }
130        return $res;
131}
132
133// Affichage (dans un listing) du nom avec le lien vers la page correspondante
134// En fait c'est pour les modules dons/ventes/activites/prets ou l'acteur (donateur/acheteur/inscrit/emprunteur)
135// peut etre un membre/auteur (son id_acteur est alors renseigne) mais pas forcement son nom (qui peut etre different)
136// ou peut etre une personne exterieure a l'association (on a juste le nom obligatoire alors)
137function association_calculer_lien_nomid($nom, $id, $type='membre', $html_tag='')
138{
139        $res = '';
140        if ($html_tag) {
141                $res = '<'.$html_tag.' class="fn">';
142        }
143        if ($id) {
144                $res .= '[';
145        }
146        $res .= $nom;
147        if ($id) {
148                $res .= "->$type$id]";
149        }
150        if ($html_tag) {
151                $res .= '</'.$html_tag.'>';
152        }
153        return propre($res);
154}
155
156// Affichage de date localisee et micro-formatee
157function association_datefr($iso_date, $css_class='', $htm_abbr='abbr')
158{
159        $res = ($css_class?"<$htm_abbr class='$css_class' title='$iso_date'>":'');
160        $res .= affdate_base($iso_date, 'entier'); // on fait appel a la fonction centrale des filtres SPIP... comme ca c'est traduit et formate dans les langues supportees ! si on prefere les mois en chiffres et non en lettre, y a qu'a changer les chaines de langue date_mois_XX
161        $res .= ($css_class?"</$htm_abbr>":'');
162        return $res;
163}
164
165function association_recupere_date($valeur)
166{
167        if ($valeur!='') {
168                $valeur = preg_replace('/\D/', '-', $valeur, 2); // la limitation a 2 separateurs permet de ne transformer que la partie "date" s'il s'agit d'un "datetime" par exemple.
169        }
170        return $valeur;
171}
172
173function association_verifier_date($date, $nullable=FALSE)
174{
175        if ( $nullable && ($date=='0000-00-00' || !$date) )
176                return FALSE;
177        if (!preg_match('/^\d{4}\D\d{2}\D\d{2}$/', $date)) // annee sur 4 chiffres ; mois sur 2 chiffres ; jour sur 2 chiffres ; separateur est caractere non numerique quelconque...
178#       if (!preg_match('/^\d{4}\D(\d|1[0-2])\D([1-9]|0[1-9]|[12]\d|3[01])$/', $date)) // annee sur 4 chiffres ; mois sur 1 ou 2 chiffres entre 1 et 12 ; jour sur 1 ou 2 chiffres eentre 1 et 31 ; separateur est n'importe quel caractere ne representant pas un chiffre arabe de la notation decimale standard...
179                return _T('asso:erreur_format_date', array('date'=>$date) ); // ...c'est un petit plus non documente (la documentation et le message d'erreur stipulent AAAA-MM-JJ : mois et jours toujours sur deux chiffres avec donc zero avant si inferieur a 10, separateur est tiret)
180        list($annee, $mois, $jour) = preg_split('/\D/', $date);
181        if (!checkdate($mois, $jour, $annee)) // la date doit etre valide : pas de 30 fevrier ou de 31 novembre par exemple.
182                return _T('asso:erreur_valeur_date', array('date'=>$date) );
183//      return FALSE;
184}
185
186// Affichage de duree localisee et micro-formatee
187// Nota: les cas de minutes/secondes doivent etre specifie comme des heures au format ISO...
188function association_dureefr($nombre, $unite='', $htm_abbr='abbr')
189{
190        $frmt_h = '';
191        $frmt_m = 'P';
192        switch(strtoupper($unite)) { // http://ufxtract.com/testsuite/documentation/iso-duration.htm
193                case 'Y' : // year
194                case 'A' : // annee
195                        $nombre = intval($nombre);
196                        $frmt_m .= $nombre.'Y';
197                        $valeur = association_nbrefr($nombre,0);
198                        $unite = ($nombre<=1) ? _T('local:an') : _T('local:ans');
199                        break;
200                case 'M' : // month/mois
201                        $nombre = intval($nombre);
202                        $frmt_m .= $nombre.'M';
203                        $valeur = association_nbrefr($nombre,0);
204                        $unite = ($nombre<=1) ? _T('spip:date_un_mois') : _T('spip:date_mois');
205                        break;
206                case 'W' : // week
207                case 'S' : // semaine
208                        $nombre = intval($nombre);
209                        $frmt_m .= $nombre.'W';
210                        $valeur = association_nbrefr($nombre,0);
211                        $unite = ($nombre<=1) ? _T('spip:date_une_semaine') : _T('spip:date_semaines');
212                        break;
213                case 'D' : // day
214                case 'J' : // jour
215                        $nombre = intval($nombre);
216                        $frmt_m .= $nombre.'D';
217                        $valeur = association_nbrefr($nombre,0);
218                        $unite = ($nombre<=1) ? _T('local:jour') : _T('spip:date_jours');
219                        break;
220                case 'H' : // hour/heure
221                        $frmt_m .= 'T'.str_replace('00M', '',  str_replace(':','H',$nombre.':00').'M' );
222                        $valeur = association_nbrefr($nombre,0);
223                        if (intval($nombre)>1)
224                                $unite = _T('spip:date_heures');
225                        elseif (is_numeric($nombre))
226                                $unite = _T('spip:date_une_heure');
227                        elseif (strstr($nombre,'0:00'))
228                                $unite = _T('spip:date_une_minute');
229                        else {
230                                $nombre = explode(':',$nombre);
231                                $frmt_h = _T('spip:date_fmt_heures_minutes', array('h'=>$nombre[0],'m'=>$nombre[1]));
232                        }
233                        break;
234                case 'T' : // (full) ISO Time : no check...
235                        $frmt_m .= 'T'.str_replace( array('HM','HS','MS','00H','00M'), array('H','H','M'), preg_replace('m:m','M',preg_replace('h:h','H',$nombre,1),1).'S' );
236                        $nombre = explode(':',$nombre,2);
237                        if ($nombre[0]>24) { // http://dev.mysql.com/doc/refman/4.1/en/time.html
238                                $nombre['-1'] = intval($nombre[0]/24);
239                                $nombre[0] = $nombre[0]%24;
240                        }
241                        switch($nombre['-1']) { // nombre de jours
242                                case 0:
243                                case '':
244                                        $frmt_h = '';
245                                        break;
246                                case 1:
247                                        $frmt_h = _T('duree_temps', array('nombre'=>1,'unite'=>_T('local:jour')));
248                                        break;
249                                default:
250                                        $frmt_h =  _T('duree_temps', array('nombre'=>association_nbrefr($nommbre['-1'],0),'unite'=>_T('spip:date_jours')));
251                                        break;
252                        }
253                        if ($nombre[0])
254                                $frmt_h .= ', ';
255                        switch($nombre[0]) { // nombre d'heures
256                                case 0:
257                                        $frmt_h .= '';
258                                        break;
259                                case 1:
260                                        $frmt_h .= _T('duree_temps', array('nombre'=>1,'unite'=>_T('spip:date_une_heure')));
261                                        break;
262                                default:
263                                        $frmt_h .= _T('duree_temps', array('nombre'=>association_nbrefr($nombre[0],0),'unite'=>_T('spip:date_heures')));
264                                        break;
265                        }
266                        if ($nombre[1])
267                                $frmt_h .= ', ';
268                        switch($nombre[1]) { // nombre de minutes
269                                case 0:
270                                        $frmt_h .= '';
271                                        break;
272                                case 1:
273                                        $frmt_h .= _T('duree_temps', array('nombre'=>1,'unite'=>_T('spip:date_une_minute')));
274                                        break;
275                                default:
276                                        $frmt_h .= _T('duree_temps', array('nombre'=>association_nbrefr($nombre[1],0),'unite'=>_T('spip:date_minutes')));
277                                        break;
278                        }
279                        if ($nombre[2])
280                                $frmt_h .= ', ';
281                        switch($nombre[2]) { // nombre de secondes
282                                case 0:
283                                        $frmt_h .= '';
284                                        break;
285                                case 1:
286                                        $frmt_h .= _T('duree_temps', array('nombre'=>1,'unite'=>_T('spip:date_une_seconde')));
287                                        break;
288                                default:
289                                        $frmt_h .= _T('duree_temps', array('nombre'=>association_nbrefr($nombre[2],0),'unite'=>_T('spip:date_secondes')));
290                                        break;
291                        }
292                        $frmt_h .= '. ';
293                        break;
294                case 'I' : // (full) ISO DateTime or Date : no check !!!
295                default :
296                        $frmt_m .= $nombre;
297                        $nombre = explode('T',$nombre,2);
298                        $ladate = explode(':',$nombre[0]);
299                        switch($ladate[0]) { // nombre d'annee
300                                case 0:
301                                case '':
302                                        $frmt_h = '';
303                                        break;
304                                case 1:
305                                        $frmt_h = _T('duree_temps', array('nombre'=>1,'unite'=>_T('local:an')));
306                                        break;
307                                default:
308                                        $frmt_h =  _T('duree_temps', array('nombre'=>association_nbrefr($ladate[0],0),'unite'=>_T('local:ans')));
309                                        break;
310                        }
311                        if ($ladate[1])
312                                $frmt_h .= ', ';
313                        switch($ladate[1]) { // nombre de mois
314                                case 0:
315                                        $frmt_h .= '';
316                                        break;
317                                case 1:
318                                        $frmt_h .= _T('duree_temps', array('nombre'=>1,'unite'=>_T('spip:date_un_mois')));
319                                        break;
320                                default:
321                                        $frmt_h .= _T('duree_temps', array('nombre'=>association_nbrefr($ladate[1],0),'unite'=>_T('spip:date_mois')));
322                                        break;
323                        }
324                        if ($ladate[2])
325                                $frmt_h .= ', ';
326                        switch($ladate[2]) { // nombre de jours
327                                case 0:
328                                        $frmt_h .= '';
329                                        break;
330                                case 1:
331                                        $frmt_h .= _T('duree_temps', array('nombre'=>1,'unite'=>_T('local:jour')));
332                                        break;
333                                default:
334                                        $frmt_h .= _T('duree_temps', array('nombre'=>association_nbrefr($ladate[2],0),'unite'=>_T('spip:date_jours')));
335                                        break;
336                        }
337                        if (count($lheure))
338                                $frmt_h .= ', ';
339                        $lheure = explode(':',$nombre[1]);
340                        switch($lheure[0]) { // nombre d'heures
341                                case 0:
342                                        $frmt_h .= '';
343                                        break;
344                                case 1:
345                                        $frmt_h .= _T('duree_temps', array('nombre'=>1,'unite'=>_T('spip:date_une_heure')));
346                                        break;
347                                default:
348                                        $frmt_h .=  _T('duree_temps', array('nombre'=>association_nbrefr($lheure[0],0),'unite'=>_T('spip:date_heures')));
349                                        break;
350                        }
351                        if ($lheure[1])
352                                $frmt_h .= ', ';
353                        switch($lheure[1]) { // nombre d'heures
354                                case 0:
355                                        $frmt_h .= '';
356                                        break;
357                                case 1:
358                                        $frmt_h .= _T('duree_temps', array('nombre'=>1,'unite'=>_T('spip:date_une_minute')));
359                                        break;
360                                default:
361                                        $frmt_h .=  _T('duree_temps', array('nombre'=>association_nbrefr($lheure[1],0),'unite'=>_T('spip:date_minutes')));
362                                        break;
363                        }
364                        if ($lheure[2])
365                                $frmt_h .= ', ';
366                        switch($lheure[2]) { // nombre d'heures
367                                case 0:
368                                        $frmt_h = '';
369                                        break;
370                                case 1:
371                                        $frmt_h = _T('duree_temps', array('nombre'=>1,'unite'=>_T('spip:date_une_seconde')));
372                                        break;
373                                default:
374                                        $frmt_h =  _T('duree_temps', array('nombre'=>association_nbrefr($lheure[2],0),'unite'=>_T('spip:date_secondes')));
375                                        break;
376                        }
377                        $frmt_h .= '. ';
378                        break;
379        }
380        if (!$frmt_h)
381                $frmt_h = _T('asso:duree_temps', array('nombre'=>$valeur, 'unite'=>$unite) );
382        return "<$htm_abbr class='duration' title='$frmt_m'>$frmt_h</$htm_abbr>";
383}
384
385// micro-Formatage des montants avec devise
386// on n'utilise pas la fontcion PHP money_format() --qui ne fonctionne pas sous Windows-- car on veut micro-formater avec une devise fixee par la configuration (en fait les chaines de langue) du plugin
387function association_prixfr($montant, $unite_code='', $unite_nom='', $htm_span='span', $htm_abbr='abbr')
388{
389        $res = "<$htm_span class='money price'>"; // pour la reference est "price" <http://microformats.org/wiki/hproduct> (reconnu par les moteurs de recherche), mais "money" <http://microformats.org/wiki/currency-brainstorming> est d'usage courant aussi
390        $montant = "<$htm_abbr class='amount' title='$montant'>". association_nbrefr($montant) ."</$htm_abbr>";
391        $devise = "<$htm_abbr class='currency' title='". _T('asso:devise_code_iso') .'\'>'. _T('asso:devise_symbole') ."</$htm_abbr>";
392        $res .= _T('asso:devise_montant', array('montant'=>$montant, 'devise'=>$devise) );
393        $res .= ($unite_code?" <$htm_abbr class='unit' title='".($unite_nom?$unite_nom:$unite_code)."'>$unite_code</$htm_abbr>":'');
394        return "$res</$htm_span>";
395}
396
397// Formatage des nombres selon la langue de l'interface
398function association_nbrefr($montant, $decimales=2, $l10n='')
399{
400        /** recuperer le code des parametres regionnaux a utiliser
401         * dans un premier temps, on essaye d'utiliser la langue puisque SPIP gere bien cela et offre la possibilite d'en faire plus avec  http://programmer.spip.org/Forcer-la-langue-selon-le-visiteur
402         * comme ce n'est pas suffisant (le code de localisation est de la forme langue-pays ou langue_PAYS en utilisant les codes ISO), et recuperer le pays n'est pas simple sans faire appel a l'IP-geolocalisation http://stackoverflow.com/questions/2156231/how-do-you-detect-a-website-visitors-country-specifically-us-or-not
403         * ni SPIP ni PHP n'offrant de moyen "simple" d'arriver a nos fin bah...
404         **/
405        if (!$l10n) { // pas de localae specifiee
406                $l10n = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
407                if (!$l10n) { // pas specifie par le navigateur non plus ?
408                        $l10n = array('french', 'fr_FR', 'fr_FR@euro', 'fr_FR.iso88591', 'fr_FR.iso885915@euro', 'fr_FR.utf8', 'fr_FR.utf8@euro'); // alors on s'impose...
409                } else { // si specifie, on va transformer en tableau http://www.thefutureoftheweb.com/blog/use-accept-language-header
410                        preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $l10n, $lang_parse);
411                        if (count($lang_parse[1])) { // creer la liste locale=>preference
412                                $langues = array_combine($lang_parse[1], $lang_parse[4]);
413                                foreach ($langues as $langue => $taux) { // pour les taux de preferences non specifies, mettre a 100%
414                                        if ($taux==='')
415                                                $langues[$langue] = 1;
416                                }
417                                arsort($langues, SORT_NUMERIC); // ordonne par taux de preferences
418                                $l10n = array_keys($langues); // on recupere la liste des langues triees
419                        }
420
421                }
422        }
423        /** formater selon la langue choisie/recuperee
424         * @: http://stackoverflow.com/a/437642
425         **/
426        setlocale(LC_NUMERIC, $l10n);
427        $locale = localeconv();
428    return number_format(floatval($montant), $decimales, $locale['decimal_point'], $locale['thousands_sep']);
429}
430
431/* prend en parametre le nom de l'argument a chercher dans _request et retourne un float */
432function association_recupere_montant($valeur)
433{
434        if ($valeur!='') {
435                $valeur = str_replace(' ', '', $valeur); /* suppprime les espaces separateurs de milliers */
436                $valeur = str_replace(',', '.', $valeur); /* convertit les , en . */
437                $valeur = floatval($valeur);
438        } else
439                $valeur = 0.0;
440        return $valeur;
441}
442
443/* s'assurer que la valeur saisie est un float positif */
444function association_verifier_montant($valeur)
445{
446        if (association_recupere_montant($valeur)<0)
447                return _T('asso:erreur_montant');
448//      else
449//              return FALSE;
450}
451
452/* s'assurer que l'entier saisie correspond bien a un id_auteur de la table spip_asso_membres (par defaut) ou spip_auteurs (si on elargi a tous les autteurs --ceci permet d'editer des membres effaces tant qu'ils sont references par SPIP) */
453function association_verifier_membre($id_auteur, $touslesauteurs=false)
454{
455        if ($id_auteur) {
456                $id_auteur = intval($id_auteur);
457                if (sql_countsel('spip_'.($touslesauteurs?'auteurs':'asso_membres'), "id_auteur=$id_auteur")==0) {
458                        return _T('asso:erreur_id_adherent');
459                }
460        } else
461                return FALSE;
462}
463
464// Affichage du message indiquant la date
465function association_date_du_jour($heure=false)
466{
467        $ladate = affdate_jourcourt(date('d/m/Y'));
468        $hr = ($heure?date('H'):'');
469        $mn = ($heure?date('i'):'');
470        $res = '<p class="'. ($heure?'datetime':'date');
471        $res .= '" title="'. date('Y-m-d') . ($heure?"T$hr:$mn":'');
472        $lheure = ($heure? _T('spip:date_fmt_heures_minutes', array('h'=>$hr,'m'=>$mn)) :'');
473        $res .= '">'.( $heure ? _T('asso:date_du_jour_heure', array('date'=>$ladate)) : _T('asso:date_du_jour',array('date'=>$ladate,'time'=>$lheure)) ).'</p>';
474        return $res;
475}
476
477function association_header_prive($flux)
478{
479        $c = direction_css(find_in_path('association.css'));
480        return "$flux\n<link rel='stylesheet' type='text/css' href='$c' />";
481}
482
483// Filtre pour "afficher" ou "cacher" un bloc div
484// Utilise dans le formulaire cvt "editer_asso_comptes.html"
485function affichage_div($type_operation,$list_operation)
486{
487        if(strpos($list_operation, '-')) {
488                $operations = explode('-', $list_operation);
489                $res = 'cachediv';
490                for($i=0;$i<count($operations);$i++) {
491                        $operation = $GLOBALS['association_metas']['classe_'.$operations[$i]];
492                        if($type_operation===$operation) {
493                                $res = '';
494                                break;
495                        }
496                }
497        } else {
498                $res = ($type_operation===$GLOBALS['association_metas']['classe_'.$list_operation])?'':'cachediv';
499        }
500        return $res;
501}
502
503/* selecteur d'exercice comptable */
504function association_selectionner_exercice($exercice='', $exec='', $plus='') {
505    $res = '<select name ="exercice" onchange="form.submit()">';
506#    $res .= '<option value="0" ';
507#    if (!$exercice) {
508#               $res .= ' selected="selected"';
509#    }
510#    $res .= '>'. _L("choisir l'exercice ?") .'</option>';
511    $sql = sql_select('id_exercice, intitule', 'spip_asso_exercices','', 'intitule DESC');
512    while ($val = sql_fetch($sql)) {
513                $res .= '<option value="'.$val['id_exercice'].'" ';
514                if ($exercice==$val['id_exercice']) {
515                        $res .= ' selected="selected"';
516                }
517                $res .= '>'.$val['intitule'].'</option>';
518    }
519    $res .= '</select>'.$plus;
520    return $exec ? generer_form_ecrire($exec, $res.'<noscript><input type="submit" value="'._T('asso:bouton_lister').'" /></noscript>') : $res;
521}
522
523/* selecteur d'exercice comptable */
524function association_selectionner_destination($destination='', $exec='', $plus='') {
525//    $res = '<select name ="destination[]" multiple="multiple" onchange="form.submit()">';
526    $res = '<select name ="destination" onchange="form.submit()">';
527    $res .= '<option value="0" ';
528//    if ( !(array_search(0, $destinations)===FALSE) ) {
529    if (!$destination) {
530                $res .= ' selected="selected"';
531    }
532//    $res .= '>'. _T('asso:toutes_destinations') .'</option><option disabled="disabled">--------</option>';
533    $res .= '>'. _T('asso:toutes_destinations') .'</option>';
534    $intitule_destinations = array();
535    $sql = sql_select('id_destination, intitule', 'spip_asso_destination','', 'intitule DESC');
536    while ($val = sql_fetch($sql)) {
537                $res .= '<option value="'.$val['id_destination'].'" ';
538//              if (!(array_search($val['id_destination'], $destinations)===FALSE)) {
539                if ($destination==$val['id_destination']) {
540                        $res .= ' selected="selected"';
541                }
542                $res .= '>'.$val['intitule'].'</option>';
543//              $intitule_destinations[$val['id_destination']] = $val['intitule'];
544    }
545    $res .= '</select>'.$plus;
546    if ($GLOBALS['association_metas']['destinations']){
547                return $exec ? generer_form_ecrire($exec, $res.'<noscript><input type="submit" value="'._T('asso:bouton_lister').'" /></noscript>') : $res;
548        } else {
549                return FALSE;
550        }
551}
552
553/* selecteur de grouoe de membres*/
554function association_selectionner_groupe($id_groupe='', $exec='', $plus='') {
555    $qGroupes = sql_select('nom, id_groupe', 'spip_asso_groupes', 'id_groupe>=100', '', 'nom');  // on ne prend en consideration que les groupe d'id >= 100, les autres sont reserves a la gestion des autorisations
556    if ( $qGroupes && sql_count($qGroupes) ) { // ne proposer que s'il y a des groupes definis
557                $res = '<select name="groupe" onchange="form.submit()">';
558                $res .= '<option value="">'._T('asso:tous_les_groupes').'</option>';
559                while ($groupe = sql_fetch($qGroupes)) {
560                        $res .= '<option value="'.$groupe['id_groupe'].'"';
561                        if ($id_groupe==$groupe['id_groupe'])
562                                $res .= ' selected="selected"';
563                        $res .= '>'.$groupe['nom'].'</option>';
564                }
565                $res .= '</select>'.$plus;
566                return $exec ? generer_form_ecrire($exec, $res.'<noscript><input type="submit" value="'._T('asso:bouton_lister').'" /></noscript>') : $res;
567        } else {
568                return FALSE;
569        }
570}
571
572/* selecteur de statut de membres*/
573function association_selectionner_statut($statut_interne='', $exec='', $plus='') {
574    $res = '<select name="statut_interne" onchange="form.submit()">';
575    $res .= '<option value="%"'. (($statut_interne=='defaut' || $statut_interne=='%')?' selected="selected"':'') .'>'._T('asso:entete_tous').'</option>';
576    foreach ($GLOBALS['association_liste_des_statuts'] as $statut) {
577                $res .= '<option value="'.$statut.'"';
578                if ($statut_interne==$statut)
579                        $res .= ' selected="selected"';
580                $res .= '> '._T('asso:adherent_entete_statut_'.$statut).'</option>';
581        }
582        $res .= '</select>'.$plus;
583    return $exec ? generer_form_ecrire($exec, $res.'<noscript><input type="submit" value="'._T('asso:bouton_lister').'" /></noscript>') : $res;
584}
585
586/* selecteur de statut de membres*/
587function association_selectionner_id($id='', $exec='', $plus='') {
588    $res = '<input type="text" name="id" onfocus=\'this.value=""\' size="5"  value="'. ($id?$id:_T('asso:entete_id')) .'" />'.$plus;
589    return $exec ? generer_form_ecrire($exec, $res.'<noscript><input type="submit" value="'._T('asso:bouton_lister').'" /></noscript>') : $res;
590}
591
592/* selecteur d'annee parmi celles disponibles dans une table */
593function association_selectionner_annee($annee='', $dtable, $dchamp, $exec='', $plus='') {
594    if ($exec) {
595                $res = '<form method="post" action="'. generer_url_ecrire($exec) .'"><div>';
596                $res .= '<input type="hidden" name="exec" value="'.$exec.'" />';
597    } else {
598                $res = '';
599    }
600    $pager = '';
601    $res .= '<select name ="annee" onchange="form.submit()">';
602    $an_max = sql_getfetsel("MAX(DATE_FORMAT(date_$dchamp, '%Y')) AS an_max", "spip_$dtable", '');
603    $an_min = sql_getfetsel("MIN(DATE_FORMAT(date_$dchamp, '%Y')) AS an_min", "spip_$dtable", '');
604    if ($annee>$an_max || $annee<$an_min) { // a l'initialisation, l'annee courante est mise si rien n'est indique... or si l'annee n'est pas disponible dans la liste deroulante on est mal positionne et le changement de valeur n'est pas top
605                $res .= '<option value="'.$annee.'" selected="selected">'.$annee.'</option>';
606
607        }
608    $sql = sql_select("DATE_FORMAT(date_$dchamp, '%Y') AS annee", "spip_$dtable",'', 'annee DESC', 'annee');
609    while ($val = sql_fetch($sql)) {
610                $res .= '<option value="'.$val['annee'].'"';
611                if ($annee==$val['annee']) {
612                        $res .= ' selected="selected"';
613                        $pager .= "\n<strong>$val[annee]</strong>";
614                } else {
615                        $pager .= ' <a href="'. generer_url_ecrire($exec, '&annee='.$val['annee']) .'">'.$val['annee']."</a>\n";
616                }
617                $res .= '>'.$val['annee'].'</option>';
618    }
619    $res .= '</select>'.$plus;
620    if ($exec) {
621                $res .= '<noscript><input type="submit" value="'._T('asso:bouton_lister').'" /></noscript>';
622                $res .= '</div></form>';
623    }
624    return $res;
625}
626
627function encadre($texte,$avant='[',$apres=']')
628{
629    return ($texte=='')?'':$avant.$texte.$apres;
630}
631
632// Raccourcis
633// Les tables ayant 2 prefixes ("spip_asso_")
634// le raccourci "don" implique de declarer le raccourci "asso_don" etc.
635
636function generer_url_asso_don($id, $param='', $ancre='') {
637        return  generer_url_ecrire('edit_don', 'id='.intval($id));
638}
639function generer_url_don($id, $param='', $ancre='') {
640        return  array('asso_don', $id);
641}
642
643function generer_url_asso_membre($id, $param='', $ancre='') {
644        return  generer_url_ecrire('voir_adherent', 'id='.intval($id));
645}
646function generer_url_membre($id, $param='', $ancre='') {
647        return  array('asso_membre', $id);
648}
649
650function generer_url_asso_vente($id, $param='', $ancre='') {
651        return  generer_url_ecrire('edit_vente', 'id='.intval($id));
652}
653function generer_url_vente($id, $param='', $ancre='') {
654        return  array('asso_vente', $id);
655}
656
657function generer_url_asso_ressource($id, $param='', $ancre='') {
658        return  generer_url_ecrire('edit_ressource', 'id='.intval($id));
659}
660function generer_url_ressource($id, $param='', $ancre='') {
661        return  array('asso_ressource', $id);
662}
663
664function generer_url_asso_activite($id, $param='', $ancre='') {
665        return  generer_url_ecrire('voir_activite', 'id='.intval($id));
666}
667function generer_url_activite($id, $param='', $ancre='') {
668        return  array('asso_activite', $id);
669}
670
671function instituer_adherent_ici($auteur=array()){
672        $instituer_adherent = charger_fonction('instituer_adherent', 'inc');
673        return $instituer_adherent($auteur);
674}
675function instituer_statut_interne_ici($auteur=array()){
676        $instituer_statut_interne = charger_fonction('instituer_statut_interne', 'inc');
677        return $instituer_statut_interne($auteur);
678}
679
680// recupeer la liste des colonne=>libelle d'un objet etendu
681function recuperer_iextras($ObjetEtendu)
682{
683        $ChampsExtrasGeres = @unserialize(str_replace('O:10:"ChampExtra"', 'a', $GLOBALS['meta']['iextras'])); // "iextras (interface)" stocke la liste des champs geres dans un meta. Ce meta est un tableau d'objets (un par champ extra) manipules par "cextras (core)". Il n'est helas pas evident d'utiliser ces methodes car l'API n'est pas assez documente... Mais en transformant l'objet-PHP an tableau-PHP on a ce dont on a besoin...
684        if ( !is_array($ChampsExtrasGeres) )
685                return array(); // fin : Champs Extras 2 non installe ou pas d'objet etendu.
686        $champsExtrasVoulus = array();
687        foreach ($ChampsExtrasGeres as $ChampExtra) {
688                if ($ChampExtra['table']==$ObjetEtendu) // c'est un champ extra de la 'table' ou du '_type' d'objet qui nous interesse
689                        $champsExtrasVoulus[$ChampExtra['champ']] = $ChampExtra['label'];
690        }
691        return $champsExtrasVoulus;
692}
693
694// bloc infos integral (colonne gauche)
695// Rem: une certaine similitude avec http://programmer.spip.org/boite_infos :)
696function bloc_infos($TitreObjet, $NumObjet, $DesLignes=array(), $PrefixeLangue='asso', $ObjetEtendu='')
697{
698        $res = debut_boite_info(true);
699        $res .= totauxinfos_intro($TitreObjet, $TitreObjet, $NumObjet, $DesLignes, $PrefixeLangu, $ObjetEtendu);
700        $res .= association_date_du_jour();
701        $res .= fin_boite_info(true);
702        return $res;
703}
704
705// Rappels sur l'objet dans le bloc infos
706// C'est un resume ou une petite presentation de l'objet en cours d'edition/lecture : ces informations permettent de situer le contexte de la page et n'apparaissent pas dans le bloc central !
707function totauxinfos_intro($titre, $type='', $id=0, $DesLignes=array(), $PrefixeLangue='asso', $ObjetEtendu='')
708{
709        $res = '';
710        if ($type) {
711                $res .= '<div style="text-align: center" class="verdana1 spip_x-small">'. _T('asso:titre_num', array('titre'=>_T("local:$type"), 'num'=>$id) ) .'</div>'; // presentation propre a Associaspip qui complete par un autre titre (voir ci-apres). Dans un SPIP traditionnel on aurait plutot : $res .= '<div style="font-weight: bold; text-align: center" class="verdana1 spip_xx-small">'. _T("$PrefixeLangue:$type") .'<br /><span class="spip_xx-large">'.$id.'</span></div>';
712        }
713        $res .= '<div style="text-align: center" class="verdana1 spip_medium">'.$titre.'</div>';
714        if ( count($DesLignes) OR $ObjetEtendu )
715                $res .= '<dl class="verdana1 spip_xx-small">';
716        foreach ($DesLignes as $dt=>$dd) {
717                $res .= '<dt>'. _T("$PrefixeLangue:$dt") .'</dt><dd>'. propre($dd) .'</dd>'; // propre() encadre dans P... Cette presentation est propre a Associaspip. Habituellement on a : $res .= "<div class='$dt'><strong>". _T("$PrefixeLangue:$dt") ."</strong> $dd</div>";
718        }
719        if ($ObjetEtendu) {
720/* Le code suivant fonctionne, mais :
721-* il manque le formatage correct des donnees, surtout pour les listes (cas par exemple des : auteurs, mots cles, documents, enums definis dans l'interface).
722-* seuls les champs extras crees manuellement (par l'interface donc) sont pris en compte, pas ceux rajoutes via pipeline par d'autres plugins.
723                $champsExtras = recuperer_iextras($ObjetEtendu);
724                if ( count($champsExtras) ) {
725                        $donneesExtras = sql_fetsel(array_keys($champsExtras), "spip_${ObjetEtendu}s", 'id_'.($type?$type:$ObjetEtendu).'='.intval($id) ); // on recupere les donnees... (il faut que le nom de la table soit le pluriel en "-s" de l'objet et que l'identifiant soit l'objet prefixe de "id_" :-S)
726                        foreach ($champsExtras as $col_name => $col_label) {
727                                $res .= '<dt>'. $col_label .'</dt><dd>'. propre($donneesExtras[$col_name]) .'</dd>'; // propre() encadre dans P... Cette presentation est propre a Associaspip. L'appel au pipeline "afficher_contenu_objet" remplace tout le "foreach" avec plutot : $res .= "<div class='$col_name'><strong>$col_label</strong> $donneesExtras[$col_name]</div>";
728                        }
729                }
730du coup, on readapte : */
731                $res .= '<dt>+</dt><dd>'. pipeline('afficher_contenu_objet', array('args'=>array('type'=>$ObjetEtendu, 'id_objet'=>$id, 'contexte'=>array()), 'data'=>'',) ) .'</dd>';
732        }
733        if ( count($DesLignes) OR $ObjetEtendu )
734                $res .= '</dl>';
735        return $res;
736}
737
738// Tableau presentant les chiffres de synthese de la statistique descriptive dans le bloc infos
739// On prend en entree : la table du plugin sur laquelle va porter les statistique, un tableau de item de langue decrivant la ligne et liste des champs sur lesquels calcuer les statistiques, le critere de selection SQL des lignes (sinon toutes)
740// On renvoie pour chaque ligne : la moyenne arithmetique <http://fr.wikipedia.org/wiki/Moyenne#Moyenne_arithm.C3.A9tique> et  l'ecart-type <http://fr.wikipedia.org/wiki/Dispersion_statistique#.C3.89cart_type> ainsi que les extrema <http://fr.wikipedia.org/wiki/Crit%C3%A8res_de_position#Valeur_maximum_et_valeur_minimum> si on le desire (par defaut non car tableau debordant dans ce petit cadre)
741function totauxinfos_stats($legende='',$sql_table_asso,$sql_champs,$sql_criteres='1=1',$decimales_significatives=1,$avec_extrema=false)
742{
743        if (!is_array($sql_champs) || !$sql_table_asso)
744                return FALSE;
745        $res = '<table width="100%" class="asso_infos">';
746        $res .= '<caption>'. _T('asso:totaux_moyens', array('de_par'=>_T("local:$legende"))) .'</caption><thead>';
747        $res .= '<tr class="row_first"> <th>&nbsp;</th>';
748        $res .= '<th title="'. _T('entete_stats_moy') .'">x&#772</th>'; // X <span style="font-size:75%;">X</span>&#772 <span style="text-decoration:overline;">X</span> X<span style="position:relative; bottom:1.0ex; letter-spacing:-1.2ex; right:1.0ex">&ndash;</span> x<span style="position:relative; bottom:1.0ex; letter-spacing:-1.2ex; right:1.0ex">&macr;</span>
749        $res .= '<th title="'. _T('entete_stats_mea') .'">&sigma;</th>'; // σ &sigma; &#963; &#x3C3;
750        if ($avec_extrema) {
751                $res .= '<th title="'. _T('entete_stats_min') .'">[&lt;</th>';
752                $res .= '<th title="'. _T('entete_stats_max') .'">&gt;]</th>';
753        }
754        $res .= '</tr>';
755        $res .= '</thead><tbody>';
756        $compteur = 0;
757        foreach ($sql_champs as $libelle=>$champs) {
758                $stats = sql_fetsel("AVG($champs) AS valMoy, STDDEV($champs) AS ekrTyp, MIN($champs) AS valMin, MAX($champs) AS valMax ", "spip_asso_$sql_table_asso", $sql_criteres);
759                $res .= '<tr class="'. ($compteur%2?'row_odd':'row_even') .'">';
760                $res .= '<td class"text">'. _T('asso:'.(is_numeric($libelle)?$champs:$libelle)) .'</td>';
761                $res .= '<td class="'.($decimales_significatives?'decimal':'integer').'">'. association_nbrefr($stats['valMoy'],$decimales_significatives) .'</td>';
762                $res .= '<td class="'.($decimales_significatives?'decimal':'integer').'">'. association_nbrefr($stats['ekrTyp'],$decimales_significatives) .'</td>';
763                if ($avec_extrema) {
764                        $res .= '<td class="'.($decimales_significatives?'decimal':'integer').'">'. association_nbrefr($stats['valMin'],$decimales_significatives) .'</td>';
765                        $res .= '<td class="'.($decimales_significatives?'decimal':'integer').'">'. association_nbrefr($stats['valMax'],$decimales_significatives) .'</td>';
766                }
767                $res .= '</tr>';
768                $compteur++;
769        }
770        $res .= '</tbody></table>';
771        return $res;
772}
773
774// Tableau des decomptes statistiques dans le bloc infos
775// On prend en entree deux tableaux de taille egale (non controlee) --respectivement pour les intitules/libelles et les effectifs/occurences-- qui sont indexes par la classe CSS associee (parce-qu'elle doit etre unique pour chaque ligne)
776function totauxinfos_effectifs($legende='',$table_textes,$table_nombres,$decimales_significatives=0)
777{
778        if (!is_array($table_textes) || !is_array($table_nombres) )
779                return FALSE;
780        $nombre = $nombre_total = 0;
781        $res = '<table width="100%" class="asso_infos">';
782        $res .= '<caption>'. _T('asso:totaux_nombres', array('de_par'=>_T("local:$legende"))) .'</caption><tbody>';
783        foreach ($table_textes as $classe_css=>$libelle) {
784                $res .= '<tr class="'.$classe_css.'">';
785                $res .= '<td class"text">'._T('asso:'.$libelle).'</td>';
786                $res .= '<td class="' .($decimales_significatives?'decimal':'integer') .'">'. association_nbrefr($table_nombres[$classe_css],$decimales_significatives) .'</td>';
787                $nombre_total += $table_nombres[$classe_css];
788                $res .= '</tr>';
789        }
790        $res .= '</tbody>';
791        if (count($table_nombres)>1) {
792                $res .= '<tfoot>';
793                $res .= '<tr><th class="text">'._T('asso:liste_nombre_total').'</th>';
794                $res .= '<th class="' .($decimales_significatives?'decimal':'integer') .'">'. association_nbrefr($nombre_total,$decimales_significatives) .'</th></tr>';
795                $res .= '</tfoot>';
796        }
797        return $res.'</table>';
798}
799
800// Tableau des totaux comptables dans le bloc infos
801// On prend en entree : le complement de titre du tableau puis les sommes cumulees des recettes et des depenses. (tous ces parametres sont facultatifs, mais attention qu'un tableau est quand meme genere dans tous les cas)
802function totauxinfos_montants($legende='',$somme_recettes=0,$somme_depenses=0)
803{
804        $res = '<table width="100%" class="asso_infos">';
805        $res .= '<caption>'. _T('asso:totaux_montants', array('de_par'=>_T("local:$legende"))) .'</caption><tbody>';
806        if ($somme_recettes) {
807                $res .= '<tr class="impair">'
808                . '<th class="entree">'. _T('asso:bilan_recettes') .'</th>'
809                . '<td class="decimal">' .association_prixfr($somme_recettes). ' </td>'
810                . '</tr>';
811        }
812        if ($somme_depenses) {
813                $res .= '<tr class="pair">'
814                . '<th class="sortie">'. _T('asso:bilan_depenses') .'</th>'
815                . '<td class="decimal">'.association_prixfr($somme_depenses) .'</td>'
816                . '</tr>';
817        }
818        if ($somme_recettes && $somme_depenses) {
819                $solde = $somme_recettes-$somme_depenses;
820                $res .= '<tr class="'.($solde>0?'impair':'pair').'">'
821                . '<th class="solde">'. _T('asso:bilan_solde') .'</th>'
822                . '<td class="decimal">'.association_prixfr($solde).'</td>'
823                . '</tr>';
824        }
825        return $res.'</tbody></table>';
826}
827
828// bloc affichant le formulaire pour genere le PDF de la/le liste/tableau
829function bloc_listepdf($objet, $params=array(), $prefixeLibelle='', $champsExclus=array(), $coords=true)
830{
831        $res = '';
832        if (test_plugin_actif('FPDF')) { // liste
833                $res .= debut_cadre_enfonce('',true);
834                $res .= '<h3>'. _T('plugins_vue_liste') .'</h3>';
835                $res .= '<div class="formulaire_spip formulaire_asso_liste_'.$objet.'s">';
836                $champsExtras = recuperer_iextras("asso_$objet");
837                $frm = '<ul><li class="edit_champs">';
838                $desc_table = charger_fonction('trouver_table', 'base'); // http://doc.spip.org/@description_table deprecier donc preferer http://programmer.spip.net/trouver_table,620
839                $champsPresents = $desc_table("spip_asso_${objet}s");
840                foreach ($champsPresents['field'] as $k => $v) { // donner le menu des choix
841                        if ( !in_array($k, $champsExclus) ) { // affichable/selectionnable (champ ayant un libelle declare et connu)
842                                $lang_clef = $prefixeLibelle.$k;
843                                $lang_texte = _T('asso:'.$lang_clef);
844                                if ( $lang_clef!=str_replace(' ', '_', $lang_texte) ) { // champ natif du plugin
845                                        $frm .= "<div class='choix'><input type='checkbox' name='champs[$k]' id='liste_${objet}s_$k' /><label for='liste_${objet}s_$k'>$lang_texte</label></div>";
846                                } elseif( array_key_exists($k,$champsExtras) ) { // champs rajoute via cextra
847                                        $frm .= "<div class='choix'><input type='checkbox' name='champs[$k]' id='liste_${objet}s_$k' /><label for='liste_${objet}s_$k'>$champsExtras[$k]</label></div>";
848                                }
849                        }
850                }
851                if ($coords) {
852                        $frm .= '<div class="choix"><input type="checkbox" name="champs[email]" id="liste_'.$objet.'s_email" /><label for="liste_'.$objet.'_s_email">'. _T('asso:adherent_libelle_email') .'</label></div>'; // on ajoute aussi l'adresse electronique principale (table spip_auteurs ou spip_emails)
853                        if (test_plugin_actif('COORDONNEES')) {
854                                $frm .= '<div class="choix"><input type="checkbox" name="champs[adresse]" id="liste_'.$objet.'_s_adresse" /><label for="liste_'.$objet.'_s_adresse">'. _T('coordonnees:adresses') .'</label></div>'; // on ajoute aussi l'adresse postale (table spip_adresses)
855                                $frm .= '<div class="choix"><input type="checkbox" name="champs[telephone]" id="liste_'.$objet.'_s_telephone" /><label for="liste_'.$objet.'_s_telephone">'. _T('coordonnees:numeros') .'</label></div>'; // on ajoute aussi le numero de telephone (table spip_numeros)
856                        }
857                }
858                foreach ($params as $k => $v) { // on fait suivre les autres parametres dont la liste des auteurs a afficher
859                        $frm .= '<input type="hidden" name="'.$k.'" value="'. htmlspecialchars($v, ENT_QUOTES, $GLOBALS['meta']['charset']) .'" />'; // http://stackoverflow.com/questions/46483/htmlentities-vs-htmlspecialchars
860                }
861                $frm .= '</li></ul>';
862                $frm .= '<p class="boutons"><input type="submit" value="'. _T('asso:bouton_imprimer') .'" /></p>';
863                $res .= generer_form_ecrire("pdf_${objet}s", $frm, '', '');
864                $res .= '</div>';
865                $res .= fin_cadre_enfonce(true);
866        }
867
868        return $res;
869}
870
871// pour executer les squelettes comportant la balise Meta
872include_spip('balise/meta');
873// charger les metas donnees
874$inc_meta = charger_fonction('meta', 'inc'); // inc_version l'a deja chargee
875$inc_meta('association_metas');
876
877// pouvoir utiliser les fonctions de coordonnees comme filtre
878if (test_plugin_actif('COORDONNEES')) {
879        include_spip('inc/association_coordonnees');
880}
881
882// Pour construire des menu avec SELECTED
883function association_mySel($varaut,$variable, $option=NULL)
884{
885        if ( function_exists('mySel') ) //@ http://doc.spip.org/@mySel
886                return mySel($varaut, $variable, $option);
887        // la fonction mySel n'existe plus en SPIP 3 donc on la recree
888        $res = ' value="'.$varaut.'"'. (($variable==$varaut) ? ' selected="selected"' : '');
889        return  (!isset($option) ? $res : "<option$res>$option</option>\n");
890}
891
892?>
Note: See TracBrowser for help on using the repository browser.