source: spip-zone/_core_/plugins/svp/svp_fonctions.php @ 60090

Last change on this file since 60090 was 59379, checked in by marcimat@…, 8 years ago
  • Indiquer lorsque auto n'est pas présent.
  • Empêcher de télécharger un plugin lorsque auto n'est pas présent
  • Property svn:eol-style set to native
File size: 14.1 KB
Line 
1<?php
2
3function svp_afficher_intervalle($intervalle, $logiciel){
4        if (!strlen($intervalle)) return '';
5        if (!preg_match(',^[\[\(\]]([0-9.a-zRC\s\-]*)[;]([0-9.a-zRC\s\-\*]*)[\]\)\[]$,Uis',$intervalle,$regs)) return false;
6        $mineure = $regs[1];
7        $majeure = preg_replace(',\.99$,', '.*', $regs[2]);
8        $mineure_inc = $intervalle{0}=="[";
9        $majeure_inc = substr($intervalle,-1)=="]";
10        if (strlen($mineure)){
11                if (!strlen($majeure))
12                        $version = $logiciel . ($mineure_inc ? ' &ge; ' : ' &gt; ') . $mineure;
13                else
14                        $version = $mineure . ($mineure_inc ? ' &le; ' : ' &lt; ') .  $logiciel . ($majeure_inc ? ' &le; ' : ' &lt; ') . $majeure;
15        }
16        else {
17                if (!strlen($majeure))
18                        $version = $logiciel;
19                else
20                        $version =  $logiciel . ($majeure_inc ? ' &le; ' : ' &lt; ') . $majeure;
21        }
22
23        return $version;
24}
25
26
27function svp_afficher_etat($etat) {
28        include_spip('plugins/afficher_plugin');
29        return plugin_etat_en_clair($etat);
30}
31
32
33function svp_afficher_dependances($balise_serialisee, $dependance='necessite', $sep='<br />') {
34        $texte = '';
35       
36        $t = unserialize($balise_serialisee);
37        $dependances = $t[$dependance];
38        if (is_array($dependances)) {
39                ksort($dependances);
40       
41                foreach($dependances as $_compatibilite => $_dependance) {
42                        $compatibilite = ($_compatibilite !== 0)
43                                        ? _T('svp:info_compatibilite_dependance', array('compatibilite' => svp_afficher_intervalle($_compatibilite, 'SPIP')))
44                                        : '';
45                        if ($compatibilite)
46                                $texte .= ($texte ? str_repeat($sep, 2) : '') . $compatibilite;
47                        foreach ($_dependance as $_plugin) {
48                                if ($texte)
49                                        $texte .= $sep;
50                                if (($dependance == 'necessite' ) OR ($dependance == 'utilise')) {
51                                        if ($plugin = sql_fetsel('id_plugin, nom', 'spip_plugins', 'prefixe=' . sql_quote($_plugin['nom'])))
52                                                $logiciel = '<a href="' . generer_url_entite($plugin['id_plugin'], 'plugin') . '" title="' . _T('svp:bulle_aller_plugin') . '">' .
53                                                                        extraire_multi($plugin['nom']) . '</a>';
54                                        else
55                                                // Cas ou le plugin n'est pas encore dans la base SVP.
56                                                // On affiche son préfixe, cependant ce n'est pas un affichage devant perdurer
57                                                $logiciel = $_plugin['nom'];
58                                        $intervalle = svp_afficher_intervalle($_plugin['compatibilite'], $logiciel);
59                                        $texte .= ($intervalle) ? svp_afficher_intervalle($_plugin['compatibilite'], $logiciel) : $logiciel;
60                                }
61                                else
62                                        // On demande l'affichage des librairies
63                                        $texte .= '<a href="' . $_plugin['lien'] . '" title="' . _T('svp:bulle_telecharger_librairie') . '">' . $_plugin['nom'] . '</a>';
64                        }
65                }
66        }
67
68        return $texte;
69}
70
71
72function svp_dependances_existe($balise_serialisee) {
73        $dependances = unserialize($balise_serialisee);
74        foreach($dependances as $_dependance) {
75                if ($_dependance)
76                        return true;
77        }
78
79        return false;
80}
81
82
83function svp_afficher_credits($balise_serialisee, $sep=', ') {
84        $texte = '';
85       
86        $credits = unserialize($balise_serialisee);
87        if (is_array($credits)) {
88                foreach ($credits as $_credit) {
89                        if ($texte) 
90                                $texte .= $sep;
91                        // Si le credit en cours n'est pas un array c'est donc un copyright
92                        $texte .= 
93                                (!is_array($_credit)) 
94                                ? PtoBR(propre($_credit)) // propre pour les [lien->url] des auteurs de plugin.xml ...
95                                : ($_credit['url'] ? '<a href="' . $_credit['url'] . '">' : '') . 
96                                  $_credit['nom'] .
97                                  ($_credit['url'] ? '</a>' : '');
98                }
99        }
100
101        return $texte;
102}
103
104
105function svp_afficher_langues($langues, $sep=', '){
106        $texte = '';
107       
108        if ($langues) {
109                foreach ($langues as $_code => $_traducteurs) {
110                        if ($texte) 
111                                $texte .= $sep;
112                        $traducteurs_langue = array();
113                        foreach ($_traducteurs as $_traducteur) {
114                                if (is_array($_traducteur))
115                                        $traducteurs_langue[] =
116                                                ($_traducteur['lien'] ? '<a href="' . $_traducteur['lien'] . '">' : '') .
117                                                $_traducteur['nom'] .
118                                                ($_traducteur['lien'] ? '</a>' : '');
119                        }
120                        $texte .= $_code . (count($traducteurs_langue) > 0 ? ' (' . implode(', ', $traducteurs_langue) . ')' : '');
121                }
122        }
123
124        return $texte;
125}
126
127
128function svp_afficher_statistiques_globales($id_depot=0){
129        $info = '';
130
131        $total = svp_compter('depot', $id_depot);
132        if (!$id_depot) {
133                // Si on filtre pas sur un depot alors on affiche le nombre de depots
134                $info = '<li id="stats-depot" class="item">
135                                        <div class="unit size4of5">' . ucfirst(trim(_T('svp:info_depots_disponibles', array('total_depots'=>'')))) . '</div>
136                                        <div class="unit size1of5 lastUnit">' . $total['depot'] . '</div>
137                                </li>';
138        }
139        // Compteur des plugins filtre ou pas par depot
140        $info .= '<li id="stats-plugin" class="item">
141                                <div class="unit size4of5">' . ucfirst(trim(_T('svp:info_plugins_heberges',  array('total_plugins'=>'')))) . '</div>
142                                <div class="unit size1of5 lastUnit">' . $total['plugin'] . '</div>
143                        </li>';
144        // Compteur des paquets filtre ou pas par depot
145        $info .= '<li id="stats-paquet" class="item">
146                                <div class="unit size4of5">' . ucfirst(trim(_T('svp:info_paquets_disponibles', array('total_paquets'=>'')))) . '</div>
147                                <div class="unit size1of5 lastUnit">' . $total['paquet'] . '</div>
148                        </li>';
149
150        return $info;
151}
152
153
154function svp_compter_telechargements($id_depot=0, $categorie='', $compatible_spip=''){
155        $total = svp_compter('paquet', $id_depot, $categorie, $compatible_spip);
156        $info = _T('svp:info_paquets_disponibles', array('total_paquets'=>$total['paquet']));
157        return $info;
158}
159
160
161function svp_compter_depots($id_depot, $contrib='plugin'){
162        $info = '';
163
164        $total = svp_compter('depot', $id_depot);
165        if (!$id_depot) {
166                $info = _T('svp:info_depots_disponibles', array('total_depots'=>$total['depot'])) . ', ' .
167                                _T('svp:info_plugins_heberges', array('total_plugins'=>$total['plugin'])) . ', ' .
168                                _T('svp:info_paquets_disponibles', array('total_paquets'=>$total['paquet']));
169        }
170        else {
171                if ($contrib == 'plugin') {
172                        $info = _T('svp:info_plugins_heberges', array('total_plugins'=>$total['plugin'])) . ', ' .
173                                        _T('svp:info_paquets_disponibles', array('total_paquets'=>$total['paquet']-$total['autre']));
174                }
175                else {
176                        $info = _T('svp:info_contributions_hebergees', array('total_autres'=>$total['autre']));
177                }
178        }
179        return $info;
180}
181
182
183function svp_compter_plugins($id_depot=0, $categorie='', $compatible_spip='') {
184        $total = svp_compter('plugin', $id_depot, $categorie, $compatible_spip);
185        $info = _T('svp:info_plugins_disponibles', array('total_plugins'=>$total['plugin']));
186        return $info;
187}
188
189
190// Attention le critere de compatibilite spip pris en compte est uniquement celui d'une branche SPIP
191function svp_compter($entite, $id_depot=0, $categorie='', $compatible_spip=''){
192        $compteurs = array();
193
194        $group_by = array();
195        $where = array();
196        if ($id_depot)
197                $where[] = "t1.id_depot=" . sql_quote($id_depot);
198        else
199                $where[] = "t1.id_depot>0";
200
201        if ($entite == 'plugin') {
202                $from = 'spip_plugins AS t2, spip_depots_plugins AS t1';
203                $where[] = "t1.id_plugin=t2.id_plugin";
204                if ($categorie)
205                        $where[] = "t2.categorie=" . sql_quote($categorie);
206                if ($compatible_spip) {
207                        $creer_where = charger_fonction('where_compatible_spip', 'inc');
208                        $where[] =  $creer_where($compatible_spip, 't2', '>');
209                }
210                $compteurs['plugin'] = sql_count(sql_select('t2.id_plugin', $from, $where));
211        }
212        elseif ($entite == 'paquet') {
213                if ($categorie) {
214                        $ids = sql_allfetsel('id_plugin', 'spip_plugins', 'categorie='.sql_quote($categorie));
215                        $ids = array_map('reset', $ids);
216                        $where[] = sql_in('t1.id_plugin', $ids);
217                }
218                if ($compatible_spip) {
219                        $creer_where = charger_fonction('where_compatible_spip', 'inc');
220                        $where[] =  $creer_where($compatible_spip, 't1', '>');
221                }
222                $compteurs['paquet'] = sql_countsel('spip_paquets AS t1', $where);
223        }
224        elseif ($entite == 'depot') {
225                $champs = array('COUNT(t1.id_depot) AS depot', 
226                                                'SUM(t1.nbr_plugins) AS plugin', 
227                                                'SUM(t1.nbr_paquets) AS paquet',
228                                                'SUM(t1.nbr_autres) AS autre');
229                $compteurs = sql_fetsel($champs, 'spip_depots AS t1', $where);
230        }
231        elseif ($entite == 'categorie') {
232                $from = array('spip_plugins AS t2');
233                $where_depot = $where[0];
234                $where = array();
235                if ($id_depot) {
236                        $ids = sql_allfetsel('id_plugin', 'spip_depots_plugins AS t1', $where_depot);
237                        $ids = array_map('reset', $ids);
238                        $where[] = sql_in('t2.id_plugin', $ids);
239                }
240                if ($compatible_spip) {
241                        $creer_where = charger_fonction('where_compatible_spip', 'inc');
242                        $where[] =  $creer_where($compatible_spip, 't2', '>');
243                }
244                if ($categorie)
245                        $where[] = "t2.categorie=" . sql_quote($categorie);
246                else
247                        $group_by = array('t2.categorie');
248                $compteurs['categorie'] = sql_countsel($from, $where, $group_by); 
249        }
250
251        return $compteurs;
252}
253
254
255function balise_SVP_CATEGORIES($p) {
256
257        $tri = interprete_argument_balise(1,$p);
258        $tri = isset($tri) ? str_replace('\'', '"', $tri) : '"ordre_cle"';
259        $categorie = interprete_argument_balise(1,$p);
260        $categorie = isset($categorie) ? str_replace('\'', '"', $categorie) : '""';
261
262        $p->code = 'calcul_svp_categories('.$categorie.')';
263
264        return $p;
265}
266
267function calcul_svp_categories($tri='ordre_cle', $categorie='') {
268
269        $retour = array();
270        include_spip('inc/svp_phraser'); // pour $GLOBALS['categories_plugin']
271        $svp_categories = $GLOBALS['categories_plugin'];
272
273        if (is_array($svp_categories)) {
274                if (($categorie) AND in_array($categorie, $svp_categories))
275                        $retour[$categorie] = _T('svp:categorie_' . strtolower($categorie));
276                else {
277                        if ($tri == 'ordre_alpha') {
278                                sort($svp_categories);
279                                // On positionne l'absence de categorie en fin du tableau
280                                $svp_categories[] = array_shift($svp_categories);
281                        }
282                        foreach ($svp_categories as $_alias)
283                                $retour[$_alias] = svp_traduire_categorie($_alias);
284                }
285        }
286       
287        return $retour;
288}
289
290
291function balise_SVP_BRANCHES_SPIP($p) {
292
293        $branche = interprete_argument_balise(1,$p);
294        $branche = isset($branche) ? str_replace('\'', '"', $branche) : '""';
295
296        $p->code = 'calcul_svp_branches_spip('.$branche.')';
297
298        return $p;
299}
300
301function calcul_svp_branches_spip($branche) {
302
303        $retour = array();
304        include_spip('inc/svp_outiller'); // pour $GLOBALS['infos_branches_spip']
305        $svp_branches = $GLOBALS['infos_branches_spip'];
306
307        if (is_array($svp_branches)) {
308                if (($branche) AND in_array($branche, $svp_branches))
309                        // On renvoie les bornes inf et sup de la branche specifiee
310                        $retour = $svp_branches[$branche];
311                else {
312                        // On renvoie uniquement les numeros de branches
313                        $retour = array_keys($svp_branches);
314                }
315        }
316       
317        return $retour;
318}
319
320function svp_traduire_categorie($alias) {
321
322        $traduction = '';
323        if ($alias) {
324                $traduction = _T('svp:categorie_' . strtolower($alias));
325        }
326        return $traduction;
327}
328
329function svp_traduire_type_depot($type) {
330
331        $traduction = '';
332        if ($type) {
333                $traduction = _T('svp:info_type_depot_' . $type);
334        }
335        return $traduction;
336}
337
338/**
339 * Critere de compatibilite avec une VERSION precise ou une BRANCHE de SPIP :
340 * Fonctionne sur les tables spip_paquets et spip_plugins
341 *
342 *   {compatible_spip}
343 *   {compatible_spip 2.0.8} ou {compatible_spip 1.9}
344 *   {compatible_spip #ENV{vers}} ou {compatible_spip #ENV{vers, 1.9.2}}
345 *   {compatible_spip #GET{vers}} ou {compatible_spip #GET{vers, 2.1}}
346 *
347 *   Si aucune valeur explicite (dans le critère, par #ENV, par #SET)
348 *   tous les enregistrements sont retournés.
349 *
350 *   Le ! (NOT) fonctionne sur le critère BRANCHE
351 */
352function critere_compatible_spip_dist($idb, &$boucles, $crit) {
353
354        $boucle = &$boucles[$idb];
355        $table = $boucle->id_table;
356
357        // Si on utilise ! la fonction LOCATE doit retourner 0.
358        // -> utilise uniquement avec le critere BRANCHE
359        $op = ($crit->not == '!') ? '=' : '>';
360
361        $boucle->hash .= '
362        // COMPATIBILITE SPIP
363        $creer_where = charger_fonction(\'where_compatible_spip\', \'inc\');';
364
365        // version/branche explicite dans l'appel du critere
366        if (isset($crit->param[0][0])) {
367                $version = calculer_liste(array($crit->param[0][0]), array(), $boucles, $boucle->id_parent);
368                $boucle->hash .= '
369                $where = $creer_where('.$version.', \''.$table.'\', \''.$op.'\');
370                ';
371        }
372        // pas de version/branche explicite dans l'appel du critere
373        // on regarde si elle est dans le contexte
374        else {
375                $boucle->hash .= '
376                $version = isset($Pile[0][\'compatible_spip\']) ? $Pile[0][\'compatible_spip\'] : \'\';
377                $where = $creer_where($version, \''.$table.'\', \''.$op.'\');
378                ';
379        }
380
381        $boucle->where[] = '$where';
382}
383
384
385function filtre_construire_recherche_plugins($phrase='', $categorie='', $etat='', $depot='', $afficher_exclusions=true, $afficher_doublons=false) {
386
387        // On traite les paramètres d'affichage
388        $afficher_exclusions = ($afficher_exclusions == 'oui') ? true : false;
389        $afficher_doublons = ($afficher_doublons == 'oui') ? true : false;
390
391        $tri = ($phrase) ? 'score' : 'nom';
392        $version_spip = $GLOBALS['spip_version_branche'].".".$GLOBALS['spip_version_code'];
393
394        // On recupere la liste des paquets:
395        // - sans doublons, ie on ne garde que la version la plus recente
396        // - correspondant a ces criteres
397        // - compatible avec la version SPIP installee sur le site
398        // - et n'etant pas deja installes (ces paquets peuvent toutefois etre affiches)
399        // tries par nom ou score
400        include_spip('inc/svp_rechercher');
401        $plugins = svp_rechercher_plugins_spip(
402                $phrase, $categorie, $etat, $depot, $version_spip,
403                svp_lister_plugins_installes(), $afficher_exclusions, $afficher_doublons, $tri);
404
405        return $plugins;
406
407}
408
409/**
410 * Retourner le nombre d'heure entre chaque actualisation
411 * si le cron est activé.
412 *
413 * @return nb d'heures (sinon 0)
414**/
415function filtre_svp_periode_actualisation_depots() {
416        include_spip('genie/svp_taches_generales_cron');
417        return _SVP_CRON_ACTUALISATION_DEPOTS ? _SVP_PERIODE_ACTUALISATION_DEPOTS : 0;
418}
419
420
421/**
422 * Retourner la chaine de la version x.y.z sous une forme sa forme initiale
423 * sans remplissage à gauche avec des 0
424 *
425 * @return string
426**/
427function denormaliser_version($version_normalisee='') {
428
429        $version = '';
430        if ($version_normalisee) {
431                $v = explode('.', $version_normalisee);
432                foreach($v as $_nombre) {
433                        $n = ltrim($_nombre, '0');
434                        // On traite les cas du type 001.002.000-dev qui doivent etre transformes en 1.2.0-dev.
435                        // Etant donne que la denormalisation est toujours effectuee sur une version normalisee on sait
436                        // que le suffixe commence toujours pas '-'
437                        $vn[] = ((strlen($n)>0) AND substr($n, 0, 1)!='-' ) ? $n : "0$n";
438                }
439                $version = implode('.', $vn);
440        }
441        return $version;
442}
443
444function test_plugins_auto() {
445        static $test = null;
446        if (is_null($test)) {
447                include_spip('inc/plugin'); // pour _DIR_PLUGINS_AUTO
448                $test = (defined('_DIR_PLUGINS_AUTO') and _DIR_PLUGINS_AUTO and is_writable(_DIR_PLUGINS_AUTO));
449        }
450        return $test;
451}
452?>
Note: See TracBrowser for help on using the repository browser.