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

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

harmonisation, correction et extension du filtrage des listes principales

File size: 36.9 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="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
622/* selecteur de statut de membres*/
623function association_selectionner_id($id='', $exec='') {
624    if ($exec) {
625                $res = '<form method="post" action="'. generer_url_ecrire($exec) .'"><div>';
626                $res .= '<input type="hidden" name="exec" value="'.$exec.'" />';
627    } else {
628                $res = '';
629    }
630    $res .= '<input type="text" name="id" onfocus=\'this.value=""\' size="5"  value="'. ($id?$id:_T('asso:entete_id')) .'" />';
631    if ($exec) {
632                $res .= '<noscript><input type="submit" value="'._T('spip:chercher').'" /></noscript>';
633                $res .= '</div></form>';
634    }
635    return $res;
636}
637
638/* selecteur d'annee parmi celles disponibles dans une table */
639function association_selectionner_annee($annee='', $dtable, $dchamp, $exec='') {
640    if ($exec) {
641                $res = '<form method="post" action="'. generer_url_ecrire($exec) .'"><div>';
642                $res .= '<input type="hidden" name="exec" value="'.$exec.'" />';
643    } else {
644                $res = '';
645    }
646    $pager = '';
647    $res .= '<select name ="annee" onchange="form.submit()">';
648    $an_max = sql_getfetsel("MAX(DATE_FORMAT(date_$dchamp, '%Y')) AS an_max", "spip_$dtable", '');
649    $an_min = sql_getfetsel("MIN(DATE_FORMAT(date_$dchamp, '%Y')) AS an_min", "spip_$dtable", '');
650    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
651                $res .= '<option value="'.$annee.'" selected="selected">'.$annee.'</option>';
652
653        }
654    $sql = sql_select("DATE_FORMAT(date_$dchamp, '%Y') AS annee", "spip_$dtable",'', 'annee DESC', 'annee');
655    while ($val = sql_fetch($sql)) {
656                $res .= '<option value="'.$val['annee'].'"';
657                if ($annee==$val['annee']) {
658                        $res .= ' selected="selected"';
659                        $pager .= "\n<strong>$val[annee]</strong>";
660                } else {
661                        $pager .= ' <a href="'. generer_url_ecrire($exec, '&annee='.$val['annee']) .'">'.$val['annee']."</a>\n";
662                }
663                $res .= '>'.$val['annee'].'</option>';
664    }
665    $res .= '</select>';
666    if ($exec) {
667                $res .= '<noscript><input type="submit" value="'._T('asso:bouton_lister').'" /></noscript>';
668                $res .= '</div></form>';
669    }
670    return $res;
671}
672
673function encadre($texte,$avant='[',$apres=']')
674{
675    return ($texte=='')?'':$avant.$texte.$apres;
676}
677
678// Raccourcis
679// Les tables ayant 2 prefixes ("spip_asso_")
680// le raccourci "don" implique de declarer le raccourci "asso_don" etc.
681
682function generer_url_asso_don($id, $param='', $ancre='') {
683        return  generer_url_ecrire('edit_don', 'id='.intval($id));
684}
685function generer_url_don($id, $param='', $ancre='') {
686        return  array('asso_don', $id);
687}
688
689function generer_url_asso_membre($id, $param='', $ancre='') {
690        return  generer_url_ecrire('voir_adherent', 'id='.intval($id));
691}
692function generer_url_membre($id, $param='', $ancre='') {
693        return  array('asso_membre', $id);
694}
695
696function generer_url_asso_vente($id, $param='', $ancre='') {
697        return  generer_url_ecrire('edit_vente', 'id='.intval($id));
698}
699function generer_url_vente($id, $param='', $ancre='') {
700        return  array('asso_vente', $id);
701}
702
703function generer_url_asso_ressource($id, $param='', $ancre='') {
704        return  generer_url_ecrire('edit_ressource', 'id='.intval($id));
705}
706function generer_url_ressource($id, $param='', $ancre='') {
707        return  array('asso_ressource', $id);
708}
709
710function generer_url_asso_activite($id, $param='', $ancre='') {
711        return  generer_url_ecrire('voir_activite', 'id='.intval($id));
712}
713function generer_url_activite($id, $param='', $ancre='') {
714        return  array('asso_activite', $id);
715}
716
717function instituer_adherent_ici($auteur=array()){
718        $instituer_adherent = charger_fonction('instituer_adherent', 'inc');
719        return $instituer_adherent($auteur);
720}
721function instituer_statut_interne_ici($auteur=array()){
722        $instituer_statut_interne = charger_fonction('instituer_statut_interne', 'inc');
723        return $instituer_statut_interne($auteur);
724}
725
726// bloc infos integral (colonne gauche)
727// Rem: une certaine similitude avec http://programmer.spip.org/boite_infos :)
728function bloc_infos($TitreObjet,$NumObjet,$DesLignes=array(),$PrefixeLangue='asso')
729{
730        $res = debut_boite_info(true);
731        $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>';
732        if (count($DesLignes)) {
733                $res .= '<div class="verdana1 spip_xx-small">';
734                foreach ($DesLignes as $p) {
735                        $res .= propre($p); // propre() encadre dans P...
736                }
737                $res .= '</div>';
738        }
739        $res .= association_date_du_jour();
740        $res .= fin_boite_info(true);
741        return $res;
742}
743
744// Rappels sur l'objet dans le bloc infos
745// 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 !
746function totauxinfos_intro($titre,$type='',$id=0,$DesLignes=array(),$PrefixeLangue='asso')
747{
748        $res = '';
749        if ($type) {
750                $res .= '<div style="text-align: center" class="verdana1 spip_x-small">'. _T('asso:titre_num', array('titre'=>_T("local:$type"), 'num'=>$id) ) .'</div>';
751        }
752        $res .= '<div style="text-align: center" class="verdana1 spip_medium">'.$titre.'</div>';
753        if (count($DesLignes)) {
754                $res .= '<dl class="verdana1 spip_xx-small">';
755                foreach ($DesLignes as $dt=>$dd) {
756                        $res .= '<dt>'. _T("$PrefixeLangue:$dt") .'</dt><dd>'. propre($dd) .'</dd>'; // propre() encadre dans P...
757                }
758                $res .= '</dl>';
759        }
760        return $res;
761}
762
763// Tableau presentant les chiffres de synthese de la statistique descriptive dans le bloc infos
764// 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)
765// 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)
766function totauxinfos_stats($legende='',$sql_table_asso,$sql_champs,$sql_criteres='1=1',$decimales_significatives=1,$avec_extrema=false)
767{
768        if (!is_array($sql_champs) || !$sql_table_asso)
769                return FALSE;
770        $res = '<table width="100%" class="asso_infos">';
771        $res .= '<caption>'. _T('asso:totaux_moyens', array('de_par'=>_T("local:$legende"))) .'</caption><thead>';
772        $res .= '<tr class="row_first"> <th>&nbsp;</th>';
773        $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>
774        $res .= '<th title="'. _T('entete_stats_mea') .'">&sigma;</th>'; // σ &sigma; &#963; &#x3C3;
775        if ($avec_extrema) {
776                $res .= '<th title="'. _T('entete_stats_min') .'">[&lt;</th>';
777                $res .= '<th title="'. _T('entete_stats_max') .'">&gt;]</th>';
778        }
779        $res .= '</tr>';
780        $res .= '</thead><tbody>';
781        $compteur = 0;
782        foreach ($sql_champs as $libelle=>$champs) {
783                $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);
784                $res .= '<tr class="'. ($compteur%2?'row_odd':'row_even') .'">';
785                $res .= '<td class"text">'. _T('asso:'.(is_numeric($libelle)?$champs:$libelle)) .'</td>';
786                $res .= '<td class="'.($decimales_significatives?'decimal':'integer').'">'. association_nbrefr($stats['valMoy'],$decimales_significatives) .'</td>';
787                $res .= '<td class="'.($decimales_significatives?'decimal':'integer').'">'. association_nbrefr($stats['ekrTyp'],$decimales_significatives) .'</td>';
788                if ($avec_extrema) {
789                        $res .= '<td class="'.($decimales_significatives?'decimal':'integer').'">'. association_nbrefr($stats['valMin'],$decimales_significatives) .'</td>';
790                        $res .= '<td class="'.($decimales_significatives?'decimal':'integer').'">'. association_nbrefr($stats['valMax'],$decimales_significatives) .'</td>';
791                }
792                $res .= '</tr>';
793                $compteur++;
794        }
795        $res .= '</tbody></table>';
796        return $res;
797}
798
799// Tableau des decomptes statistiques dans le bloc infos
800// 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)
801function totauxinfos_effectifs($legende='',$table_textes,$table_nombres,$decimales_significatives=0)
802{
803        if (!is_array($table_textes) || !is_array($table_nombres) )
804                return FALSE;
805        $nombre = $nombre_total = 0;
806        $res = '<table width="100%" class="asso_infos">';
807        $res .= '<caption>'. _T('asso:totaux_nombres', array('de_par'=>_T("local:$legende"))) .'</caption><tbody>';
808        foreach ($table_textes as $classe_css=>$libelle) {
809                $res .= '<tr class="'.$classe_css.'">';
810                $res .= '<td class"text">'._T('asso:'.$libelle).'</td>';
811                $res .= '<td class="' .($decimales_significatives?'decimal':'integer') .'">'. association_nbrefr($table_nombres[$classe_css],$decimales_significatives) .'</td>';
812                $nombre_total += $table_nombres[$classe_css];
813                $res .= '</tr>';
814        }
815        $res .= '</tbody>';
816        if (count($table_nombres)>1) {
817                $res .= '<tfoot>';
818                $res .= '<tr><th class="text">'._T('asso:liste_nombre_total').'</th>';
819                $res .= '<th class="' .($decimales_significatives?'decimal':'integer') .'">'. association_nbrefr($nombre_total,$decimales_significatives) .'</th></tr>';
820                $res .= '</tfoot>';
821        }
822        return $res.'</table>';
823}
824
825// Tableau des totaux comptables dans le bloc infos
826// 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)
827function totauxinfos_montants($legende='',$somme_recettes=0,$somme_depenses=0)
828{
829        $res = '<table width="100%" class="asso_infos">';
830        $res .= '<caption>'. _T('asso:totaux_montants', array('de_par'=>_T("local:$legende"))) .'</caption><tbody>';
831        if ($somme_recettes) {
832                $res .= '<tr class="impair">'
833                . '<th class="entree">'. _T('asso:bilan_recettes') .'</th>'
834                . '<td class="decimal">' .association_prixfr($somme_recettes). ' </td>'
835                . '</tr>';
836        }
837        if ($somme_depenses) {
838                $res .= '<tr class="pair">'
839                . '<th class="sortie">'. _T('asso:bilan_depenses') .'</th>'
840                . '<td class="decimal">'.association_prixfr($somme_depenses) .'</td>'
841                . '</tr>';
842        }
843        if ($somme_recettes && $somme_depenses) {
844                $solde = $somme_recettes-$somme_depenses;
845                $res .= '<tr class="'.($solde>0?'impair':'pair').'">'
846                . '<th class="solde">'. _T('asso:bilan_solde') .'</th>'
847                . '<td class="decimal">'.association_prixfr($solde).'</td>'
848                . '</tr>';
849        }
850        return $res.'</tbody></table>';
851}
852
853// pour executer les squelettes comportant la balise Meta
854include_spip('balise/meta');
855// charger les metas donnees
856$inc_meta = charger_fonction('meta', 'inc'); // inc_version l'a deja chargee
857$inc_meta('association_metas');
858
859// pouvoir utiliser les fonctions de coordonnees comme filtre
860if (test_plugin_actif('COORDONNEES')) {
861        include_spip('inc/association_coordonnees');
862}
863
864// Pour construire des menu avec SELECTED
865function association_mySel($varaut,$variable, $option=NULL)
866{
867        if ( function_exists('mySel') ) //@ http://doc.spip.org/@mySel
868                return mySel($varaut, $variable, $option);
869        // la fonction mySel n'existe plus en SPIP 3 donc on la recree
870        $res = ' value="'.$varaut.'"'. (($variable==$varaut) ? ' selected="selected"' : '');
871        return  (!isset($option) ? $res : "<option$res>$option</option>\n");
872}
873
874?>
Note: See TracBrowser for help on using the repository browser.