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

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

harmonisation d'interface et quelques corrections en passant

File size: 34.7 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', "action_$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='', $url_action='') {
505    if ($exec) {
506                $res = '<form method="post" action="'. generer_url_ecrire($exec) .'"><div>';
507                $res .= '<input type="hidden" name="exec" value="'.$exec.'" />';
508    } else {
509                $res = '';
510    }
511    $res .= '<select name ="exercice" onchange="form.submit()">';
512    $res .= '<option value="0" ';
513    if (!$exercice) {
514                $res .= ' selected="selected"';
515    }
516    $res .= '>'. _L("choisir l'exercice ?") .'</option>';
517    $sql = sql_select('id_exercice, intitule', 'spip_asso_exercices','', 'intitule DESC');
518    while ($val = sql_fetch($sql)) {
519                $res .= '<option value="'.$val['id_exercice'].'" ';
520                if ($exercice==$val['id_exercice']) {
521                        $res .= ' selected="selected"';
522                }
523                $res .= '>'.$val['intitule'].'</option>';
524    }
525    $res .= '</select>';
526    if ($exec) {
527                $res .= '<noscript><input type="submit" value="'._T('asso:bouton_lister').'" /></noscript>';
528                $res .= '</div></form>';
529    }
530    return $res;
531}
532
533/* selecteur d'exercice comptable */
534function association_selectionner_destination($destination='', $exec='') {
535    if ($exec) {
536                $res = '<form method="post" action="'. generer_url_ecrire($exec) .'"><div>';
537                $res .= '<input type="hidden" name="exec" value="'.$exec.'" />';
538    } else {
539                $res = '';
540    }
541//    $res .= '<select name ="destination[]" multiple="multiple" onchange="form.submit()">';
542    $res .= '<select name ="destination" onchange="form.submit()">';
543    $res .= '<option value="0" ';
544//    if ( !(array_search(0, $destinations)===FALSE) ) {
545    if (!$destination) {
546                $res .= ' selected="selected"';
547    }
548//    $res .= '>'. _T('asso:toutes_destinations') .'</option><option disabled="disabled">--------</option>';
549    $res .= '>'. _T('asso:toutes_destinations') .'</option>';
550    $intitule_destinations = array();
551    $sql = sql_select('id_destination, intitule', 'spip_asso_destination','', 'intitule DESC');
552    while ($val = sql_fetch($sql)) {
553                $res .= '<option value="'.$val['id_destination'].'" ';
554//              if (!(array_search($val['id_destination'], $destinations)===FALSE)) {
555                if ($destination==$val['id_destination']) {
556                        $res .= ' selected="selected"';
557                }
558                $res .= '>'.$val['intitule'].'</option>';
559//              $intitule_destinations[$val['id_destination']] = $val['intitule'];
560    }
561    $res .= '</select>';
562    if ($exec) {
563                $res .= '<noscript><input type="submit" value="'._T('asso:bouton_lister').'" /></noscript>';
564                $res .= '</div></form>';
565    }
566    if ($GLOBALS['association_metas']['destinations']){
567                return $res;
568        } else {
569                return FALSE;
570        }
571}
572
573/* selecteur de grouoe de membres*/
574function association_selectionner_groupe($id_groupe='', $exec='') {
575    if ($exec) {
576                $res = '<form method="post" action="'. generer_url_ecrire($exec) .'"><div>';
577                $res .= '<input type="hidden" name="exec" value="'.$exec.'" />';
578    } else {
579                $res = '';
580    }
581    $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
582    if ( $qGroupes && sql_count($qGroupes) ) { // ne proposer que s'il y a des groupes definis
583                $res .= '<select name="id_groupe" onchange="form.submit()">';
584                $res .= '<option value="">'._T('asso:tous_les_groupes').'</option>';
585                while ($groupe = sql_fetch($qGroupes)) {
586                        $res .= '<option value="'.$groupe['id_groupe'].'"';
587                        if ($id_groupe==$groupe['id_groupe'])
588                                $res .= ' selected="selected"';
589                        $res .= '>'.$groupe['nom'].'</option>';
590                }
591                $res .= '</select><noscript><input type="submit" value="'._T('asso:bouton_lister').'" /></noscript></div></form>';
592                return $res;
593        } else {
594                return FALSE;
595        }
596}
597
598/* selecteur de statut de membres*/
599function association_selectionner_statut($statut_interne='', $exec='') {
600    if ($exec) {
601                $res = '<form method="post" action="'. generer_url_ecrire($exec) .'"><div>';
602                $res .= '<input type="hidden" name="exec" value="'.$exec.'" />';
603    } else {
604                $res = '';
605    }
606    $res .= '<select name="statut_interne" onchange="form.submit()">';
607    $res .= '<option value="%"'. (($statut_interne=='defaut' || $statut_interne=='%')?' selected="selected"':'') .'>'._T('asso:entete_tous').'</option>';
608    foreach ($GLOBALS['association_liste_des_statuts'] as $statut) {
609                $res .= '<option value="'.$statut.'"';
610                if ($statut_interne==$statut)
611                        $res .= ' selected="selected"';
612                $res .= '> '._T('asso:adherent_entete_statut_'.$statut).'</option>';
613        }
614        $res .= '</select>';
615    if ($exec) {
616                $res .= '<noscript><input type="submit" value="'._T('asso:bouton_lister').'" /></noscript>';
617                $res .= '</div></form>';
618    }
619    return $res;
620}
621
622function encadre($texte,$avant='[',$apres=']')
623{
624    return ($texte=='')?'':$avant.$texte.$apres;
625}
626
627// Raccourcis
628// Les tables ayant 2 prefixes ("spip_asso_")
629// le raccourci "don" implique de declarer le raccourci "asso_don" etc.
630
631function generer_url_asso_don($id, $param='', $ancre='') {
632        return  generer_url_ecrire('edit_don', 'id='.intval($id));
633}
634function generer_url_don($id, $param='', $ancre='') {
635        return  array('asso_don', $id);
636}
637
638function generer_url_asso_membre($id, $param='', $ancre='') {
639        return  generer_url_ecrire('voir_adherent', 'id='.intval($id));
640}
641function generer_url_membre($id, $param='', $ancre='') {
642        return  array('asso_membre', $id);
643}
644
645function generer_url_asso_vente($id, $param='', $ancre='') {
646        return  generer_url_ecrire('edit_vente', 'id='.intval($id));
647}
648function generer_url_vente($id, $param='', $ancre='') {
649        return  array('asso_vente', $id);
650}
651
652function generer_url_asso_ressource($id, $param='', $ancre='') {
653        return  generer_url_ecrire('edit_ressource', 'id='.intval($id));
654}
655function generer_url_ressource($id, $param='', $ancre='') {
656        return  array('asso_ressource', $id);
657}
658
659function generer_url_asso_activite($id, $param='', $ancre='') {
660        return  generer_url_ecrire('voir_activite', 'id='.intval($id));
661}
662function generer_url_activite($id, $param='', $ancre='') {
663        return  array('asso_activite', $id);
664}
665
666function instituer_adherent_ici($auteur=array()){
667        $instituer_adherent = charger_fonction('instituer_adherent', 'inc');
668        return $instituer_adherent($auteur);
669}
670function instituer_statut_interne_ici($auteur=array()){
671        $instituer_statut_interne = charger_fonction('instituer_statut_interne', 'inc');
672        return $instituer_statut_interne($auteur);
673}
674
675// bloc infos integral (colonne gauche)
676// Rem: une certaine similitude avec http://programmer.spip.org/boite_infos :)
677function bloc_infos($TitreObjet,$NumObjet,$DesLignes=array(),$PrefixeLangue='asso')
678{
679        $res = debut_boite_info(true);
680        $res .= '<div style="font-weight: bold; text-align: center" class="verdana1 spip_xx-small">'. _T("$PrefixeLangue:$TitreObjet") .'<br /><span class="spip_xx-large">'.$NumObjet.'</span></div>';
681        if (count($DesLignes)) {
682                $res .= '<div class="verdana1 spip_xx-small">';
683                foreach ($DesLignes as $p) {
684                        $res .= propre($p); // propre() encadre dans P...
685                }
686                $res .= '</div>';
687        }
688        $res .= association_date_du_jour();
689        $res .= fin_boite_info(true);
690        return $res;
691}
692
693// Rappels sur l'objet dans le bloc infos
694// 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 !
695function totauxinfos_intro($titre,$type='',$id=0,$DesLignes=array(),$PrefixeLangue='asso')
696{
697        $res = '';
698        if ($type) {
699                $res .= '<div style="text-align: center" class="verdana1 spip_x-small">'. _T('asso:titre_num', array('titre'=>_T("local:$type"), 'num'=>$id) ) .'</div>';
700        }
701        $res .= '<div style="text-align: center" class="verdana1 spip_medium">'.$titre.'</div>';
702        if (count($DesLignes)) {
703                $res .= '<dl class="verdana1 spip_xx-small">';
704                foreach ($DesLignes as $dt=>$dd) {
705                        $res .= '<dt>'. _T("$PrefixeLangue:$dt") .'</dt><dd>'. propre($dd) .'</dd>'; // propre() encadre dans P...
706                }
707                $res .= '</dl>';
708        }
709        return $res;
710}
711
712// Tableau presentant les chiffres de synthese de la statistique descriptive dans le bloc infos
713// 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)
714// 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)
715function totauxinfos_stats($legende='',$sql_table_asso,$sql_champs,$sql_criteres='1=1',$decimales_significatives=1,$avec_extrema=false)
716{
717        if (!is_array($sql_champs) || !$sql_table_asso)
718                return FALSE;
719        $res = '<table width="100%" class="asso_infos">';
720        $res .= '<caption>'. _T('asso:totaux_moyens', array('de_par'=>_T("local:$legende"))) .'</caption><thead>';
721        $res .= '<tr class="row_first"> <th>&nbsp;</th>';
722        $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>
723        $res .= '<th title="'. _T('entete_stats_mea') .'">&sigma;</th>'; // σ &sigma; &#963; &#x3C3;
724        if ($avec_extrema) {
725                $res .= '<th title="'. _T('entete_stats_min') .'">[&lt;</th>';
726                $res .= '<th title="'. _T('entete_stats_max') .'">&gt;]</th>';
727        }
728        $res .= '</tr>';
729        $res .= '</thead><tbody>';
730        $compteur = 0;
731        foreach ($sql_champs as $libelle=>$champs) {
732                $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);
733                $res .= '<tr class="'. ($compteur%2?'row_odd':'row_even') .'">';
734                $res .= '<td class"text">'. _T('asso:'.(is_numeric($libelle)?$champs:$libelle)) .'</td>';
735                $res .= '<td class="'.($decimales_significatives?'decimal':'integer').'">'. association_nbrefr($stats['valMoy'],$decimales_significatives) .'</td>';
736                $res .= '<td class="'.($decimales_significatives?'decimal':'integer').'">'. association_nbrefr($stats['ekrTyp'],$decimales_significatives) .'</td>';
737                if ($avec_extrema) {
738                        $res .= '<td class="'.($decimales_significatives?'decimal':'integer').'">'. association_nbrefr($stats['valMin'],$decimales_significatives) .'</td>';
739                        $res .= '<td class="'.($decimales_significatives?'decimal':'integer').'">'. association_nbrefr($stats['valMax'],$decimales_significatives) .'</td>';
740                }
741                $res .= '</tr>';
742                $compteur++;
743        }
744        $res .= '</tbody></table>';
745        return $res;
746}
747
748// Tableau des decomptes statistiques dans le bloc infos
749// 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)
750function totauxinfos_effectifs($legende='',$table_textes,$table_nombres,$decimales_significatives=0)
751{
752        if (!is_array($table_textes) || !is_array($table_nombres) )
753                return FALSE;
754        $nombre = $nombre_total = 0;
755        $res = '<table width="100%" class="asso_infos">';
756        $res .= '<caption>'. _T('asso:totaux_nombres', array('de_par'=>_T("local:$legende"))) .'</caption><tbody>';
757        foreach ($table_textes as $classe_css=>$libelle) {
758                $res .= '<tr class="'.$classe_css.'">';
759                $res .= '<td class"text">'._T('asso:'.$libelle).'</td>';
760                $res .= '<td class="' .($decimales_significatives?'decimal':'integer') .'">'. association_nbrefr($table_nombres[$classe_css],$decimales_significatives) .'</td>';
761                $nombre_total += $table_nombres[$classe_css];
762                $res .= '</tr>';
763        }
764        $res .= '</tbody>';
765        if (count($table_nombres)>1) {
766                $res .= '<tfoot>';
767                $res .= '<tr><th class="text">'._T('asso:liste_nombre_total').'</th>';
768                $res .= '<th class="' .($decimales_significatives?'decimal':'integer') .'">'. association_nbrefr($nombre_total,$decimales_significatives) .'</th></tr>';
769                $res .= '</tfoot>';
770        }
771        return $res.'</table>';
772}
773
774// Tableau des totaux comptables dans le bloc infos
775// 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)
776function totauxinfos_montants($legende='',$somme_recettes=0,$somme_depenses=0)
777{
778        $res = '<table width="100%" class="asso_infos">';
779        $res .= '<caption>'. _T('asso:totaux_montants', array('de_par'=>_T("local:$legende"))) .'</caption><tbody>';
780        if ($somme_recettes) {
781                $res .= '<tr class="impair">'
782                . '<th class="entree">'. _T('asso:bilan_recettes') .'</th>'
783                . '<td class="decimal">' .association_prixfr($somme_recettes). ' </td>'
784                . '</tr>';
785        }
786        if ($somme_depenses) {
787                $res .= '<tr class="pair">'
788                . '<th class="sortie">'. _T('asso:bilan_depenses') .'</th>'
789                . '<td class="decimal">'.association_prixfr($somme_depenses) .'</td>'
790                . '</tr>';
791        }
792        if ($somme_recettes && $somme_depenses) {
793                $solde = $somme_recettes-$somme_depenses;
794                $res .= '<tr class="'.($solde>0?'impair':'pair').'">'
795                . '<th class="solde">'. _T('asso:bilan_solde') .'</th>'
796                . '<td class="decimal">'.association_prixfr($solde).'</td>'
797                . '</tr>';
798        }
799        return $res.'</tbody></table>';
800}
801
802// pour executer les squelettes comportant la balise Meta
803include_spip('balise/meta');
804// charger les metas donnees
805$inc_meta = charger_fonction('meta', 'inc'); // inc_version l'a deja chargee
806$inc_meta('association_metas');
807
808// pouvoir utiliser les fonctions de coordonnees comme filtre
809if (test_plugin_actif('COORDONNEES')) {
810        include_spip('inc/association_coordonnees');
811}
812
813// Pour construire des menu avec SELECTED
814function association_mySel($varaut,$variable, $option=NULL)
815{
816        if ( function_exists('mySel') ) //@ http://doc.spip.org/@mySel
817                return mySel($varaut, $variable, $option);
818        // la fonction mySel n'existe plus en SPIP 3 donc on la recree
819        $res = ' value="'.$varaut.'"'. (($variable==$varaut) ? ' selected="selected"' : '');
820        return  (!isset($option) ? $res : "<option$res>$option</option>\n");
821}
822
823?>
Note: See TracBrowser for help on using the repository browser.