source: spip-zone/_plugins_/couteau_suisse/inc/cs_outils.php @ 33843

Last change on this file since 33843 was 33843, checked in by patfr@…, 10 years ago

Optimisation du Couteau Suisse en backoffice :

  • Dans les descriptions d'outil, les constantes '@_CS_MA_CONSTANTE@' sont remplacées dans le pipeline 'pre_description_outil'
  • Le fichier cout_define.php perd enfin les constantes liées à certains outils : chaque chose à sa place !!
  • Le pipeline 'pre_description_outil' peut donc facilement être utilisé par les lames perso
  • Les pipelines 'init_description_outil' et 'post_description_outil' sont prêts mais non activés car non nécessaires à ce jour.

L'initialisation et l'énumération des variables du Couteau Suisse a été accélérée.
Rappel : les variables sont tirées de la chaîne de langue 'mon_outil:description' trouvée dans le module 'couteauprive'.

File size: 13.8 KB
Line 
1<?php
2#-----------------------------------------------------#
3#  Plugin  : Couteau Suisse - Licence : GPL           #
4#  Auteur  : Patrice Vanneufville, 2007               #
5#  Contact : patrice¡.!vanneufville¡@!laposte¡.!net   #
6#  Infos : http://www.spip-contrib.net/?article2166   #
7#-----------------------------------------------------#
8#  Fichier contenant les fonctions concernant la      #
9#  description des outils.                            #
10#-----------------------------------------------------#
11
12if(!defined("_ECRIRE_INC_VERSION")) return;
13
14include_spip('inc/autoriser');
15// Constantes distantes
16include_spip('cout_define');
17
18// initialiser les plugins, les pipelines, etc.
19function cs_init_plugins() {
20        @unlink(_DIR_TMP."couteau-suisse.plat");
21        include_spip('inc/plugin'); verif_plugin();
22        if(defined('_LOG_CS')) cs_log(" -- verif_plugin() effectue");
23}
24
25// initialise un outil, ses variables, et en renvoie la description compilee
26function cs_initialisation_d_un_outil($outil_, $description_outil, $modif) {
27        global $outils, $metas_outils;
28        $outil = &$outils[$outil_];
29        if(!isset($outil['categorie'])) $outil['categorie'] = 'divers';
30        if(!isset($outil['nom'])) $outil['nom'] = _T('couteauprive:'.$outil['id'].':nom');
31        if(isset($outil['code:jq'])) $outil['jquery']='oui';
32        $outil['actif'] = isset($metas_outils[$outil['id']])?$metas_outils[$outil['id']]['actif']:0;
33        // Si Spip est trop ancien ou trop recent...
34        if(cs_version_erreur($outil)) { $metas_outils[$outil['id']]['actif'] = $outil['actif'] = 0; }
35        // au cas ou des variables sont presentes dans le code
36        $outil['variables'] = array(); $outil['nb_variables'] = 0;
37        // ces 2 lignes peuvent initialiser des variables dans $metas_vars ou $metas_vars_code
38        if(isset($outil['code:spip_options'])) $outil['code:spip_options'] = cs_parse_code_php($outil['code:spip_options']);
39        if(isset($outil['code:options'])) $outil['code:options'] = cs_parse_code_php($outil['code:options']);
40        if(isset($outil['code:fonctions'])) $outil['code:fonctions'] = cs_parse_code_php($outil['code:fonctions']);
41        // cette ligne peut utiliser des variables dans $metas_vars ou $metas_vars_code
42        return $description_outil($outil_, 'admin_couteau_suisse', $modif);
43}
44
45// renvoie le configuration du pack actuel
46function cs_description_pack() {
47        if(!isset($GLOBALS['cs_pack_actuel'])) return '';
48        return debut_cadre_relief('', true)
49                . "<h3 class='titrem'><img src='"._DIR_IMG_PACK."puce-verte.gif' width='9' height='9' alt='-' />&nbsp;" . _T('couteauprive:pack_titre') . '</h3>'
50                . ((strlen($temp = cs_action_rapide('pack')))?"<div class='cs_action_rapide' id='cs_action_rapide'>$temp</div>":'')
51                . propre(_T('couteauprive:pack_descrip', array('pack'=> _T('couteauprive:pack_actuel', array('date'=>cs_date()))))
52                . "\n\n" . _T('couteauprive:contrib', array('url'=>'[->'._URL_CONTRIB.'2552]')))
53                . '<br/><textarea rows=40 cols=500 style="width:100%; font-size:90%;">'.htmlentities($GLOBALS[cs_pack_actuel], ENT_QUOTES, $GLOBALS['meta']['charset']).'</textarea>'
54                . fin_cadre_relief(true);
55}
56
57// renvoie (pour la nouvelle interface) la description d'un outil
58function description_outil2($outil_id) {
59        if(!strlen($outil_id)) return _T('couteauprive:outils_cliquez');
60        global $outils, $metas_vars, $metas_outils;
61        include_spip('cout_utils');
62        // remplir $outils (et aussi $cs_variables qu'on n'utilise pas ici);
63        include_spip('config_outils');
64cs_log(" -- description_outil2($outil_id) - Appel de config_outils.php : nb_outils = ".count($outils));
65
66cs_log(" -- appel de charger_fonction('description_outil', 'inc') et de description_outil($outil_id) :");
67        $description_outil = charger_fonction('description_outil', 'inc');
68        $descrip = cs_initialisation_d_un_outil($outil_id, $description_outil, true);
69
70        include_spip('inc/presentation');
71        include_spip('inc/texte');
72        include_spip('public/parametrer'); // fonctions pour les pipelines
73
74        $s = '<div class="cs-cadre">';
75
76        $outil = $outils[$outil_id]; unset($outils);
77        $actif = $outil['actif'];
78        $puce = $actif?'puce-verte.gif':'puce-rouge.gif';
79        $titre_etat = _T('couteauprive:outil_'.($actif?'actif':'inactif'));
80        $nb_var = intval($outil['nb_variables']);
81
82        // cette valeur par defaut n'est pas definie sous SPIP 1.92
83        @define('_ID_WEBMESTRES', 1);
84        if(!strlen($outil['id']) || !autoriser('configurer', 'outil', 0, NULL, $outil))
85                return $s . _T('info_acces_interdit') . '</div>';
86
87        $s .= "<h3 class='titrem'><img src='"._DIR_IMG_PACK."$puce' width='9' height='9' alt=\"$titre_etat\" title=\"$titre_etat\" />&nbsp;" . $outil['nom'] . '</h3>';
88        $s .= '<div class="cs_menu_outil">';
89        if($nb_var)
90                $s .= '<a href="'.generer_url_ecrire(_request('source'),'cmd=reset&outil='.$outil_id).'" title="' . _T('couteauprive:par_defaut') . '">' . _T('couteauprive:par_defaut') . '</a>&nbsp;|&nbsp;';
91        if(!$actif)
92                $s .= '<a href="'.generer_url_ecrire(_request('source'),'cmd=hide&outil='.$outil_id).'" title="' . _T('couteauprive:outil_cacher') . '">' . _T('couteauprive:outil_cacher') . '</a>&nbsp;|&nbsp;';
93        $act = $actif?'des':'';
94        $s .= '<a href="'.generer_url_ecrire(_request('source'),'cmd=switch&outil='.$outil_id).'" title="'._T("couteauprive:outil_{$act}activer_le").'">'._T("couteauprive:outil_{$act}activer")."</a></div>";
95        if(strlen($temp = cs_action_fichiers_distant($outil) . cs_action_rapide($outil_id, $actif)))
96                $s .= "<div class='cs_action_rapide' id='cs_action_rapide'>$temp</div>";
97        $s .= propre($descrip);
98
99        $serial = serialize(array_keys($outil));
100        $p = '';
101        if(preg_match_all(',traitement:([A-Z_]+),', $serial, $regs, PREG_PATTERN_ORDER))
102                $p .=  _T('couteauprive:detail_balise_etoilee', array('bal' => '#'.join('*, #', array_unique($regs[1])).'*')); 
103        if(isset($outil['jquery']) && $outil['jquery']=='oui')
104                $p .= '<p>' . _T('couteauprive:detail_jquery2') . '</p>';
105        if(isset($outil['auteur']) && strlen($outil['auteur']))
106                $p .= '<p>' . _T('auteur') .' '. ($outil['auteur']) . '</p>';
107        if(isset($outil['contrib']) && strlen($outil['contrib']))
108                $p .= '<p>' . _T('couteauprive:contrib', array('url'=>'[->'._URL_CONTRIB.$outil['contrib'].']')) . '</p>';
109
110        return $s . propre($p) . detail_outil($outil_id) . '</div>';
111}
112
113// met a jour les outils caches/interdits et renvoie deux listes d'outils actifs et inactifs
114function liste_outils() {
115        global $outils;
116        $id = $nb_actifs = 0;
117        $metas_caches = isset($GLOBALS['meta']['tweaks_caches'])?unserialize($GLOBALS['meta']['tweaks_caches']):array();
118        foreach($outils as $outil) {
119                // liste des categories
120                $categ[_T('couteauprive:categ:'.$outil['categorie'])] = $outil['categorie'];
121                // ressensement des autorisations
122                if(!autoriser('configurer', 'outil', 0, NULL, $outil))
123                        $outils[$outil['id']]['interdit'] = $metas_caches[$outil['id']]['cache'] = 1;
124        }
125        // une constante : facon rapide d'interdire des lames a la manipulation
126        if(defined('_CS_OUTILS_CACHES'))
127                foreach (explode(':',_CS_OUTILS_CACHES) as $o) $outils[$o]['interdit'] = $metas_caches[$o]['cache'] = 1;
128        ksort($categ);
129        $results_actifs = $results_inactifs = '';
130        foreach($categ as $c=>$i) {
131                $s_actifs = $s_inactifs = array();
132                foreach($outils as $outil) if($outil['categorie']==$i) {
133                        $test = $outil['actif']?'s_actifs':'s_inactifs';
134                        $hide = !$outil['actif'] && isset($metas_caches[$outil['id']]['cache']);
135                        if(!$hide)
136                                ${$test}[] .= $outil['nom'] . '|' . $outil['index'] . '|' . $outil['id'];
137                }
138                $nb_actifs += count($s_actifs);
139                foreach(array('s_actifs', 's_inactifs') as $temp) {
140                        sort(${$temp});
141                        $reset=_request('cmd')=='resetjs'?"\ncs_EffaceCookie('sous_liste_$id');":'';
142                        $titre = "<span class='light cs_hidden'> (".count(${$temp}).")</span>";
143                        preg_match(',([0-9]+)\.?\s*(.*),', _T('couteauprive:'.$c), $reg);
144                        $titre = "<div class='titrem categorie'>$reg[2]$titre</div>";
145                        $href = generer_url_ecrire(_request('exec'),"cmd=descrip&outil=");
146                        foreach(${$temp} as $j=>$v)
147                                ${$temp}[$j] = preg_replace(',^(.*)\|(.*)\|(.*)$,', '<a class="cs_href" id="$3" href="'.$href.'$3">$1</a>', $v);
148                        ${$temp} = join("<br/>\n", ${$temp});
149                        if(strlen(${$temp})) ${'result'.$temp} .= $titre
150                                . "<div id='sous_liste_$id' class='sous_liste'>" . ${$temp} . '</div>';
151                        $id++;
152                }
153        }
154
155        $fieldset = '<fieldset style="width:92%; margin:0; padding:0.6em;" class="cadre-trait-couleur liste_outils"><legend style="font-weight:bold; color:';
156        return array($nb_actifs, '<div id="cs_outils" class="cs_outils">'
157        . '<div class="cs_liste cs_inactifs">' . $fieldset . 'red;">' . _T('couteauprive:outils_inactifs') . '</legend>'
158        . $results_inactifs . '</fieldset></div>'
159        . '<form id="csform" name="csform" method="post" action="'.generer_url_ecrire(_request('exec'),"cmd=switch").'">'
160        . '<input type="hidden" value="test" name="cs_selection" id="cs_selection" />'
161        . '<div class="cs_toggle"><div style="display:none;">'
162        . '<a id="cs_toggle_a" title="'._T('couteauprive:outils_permuter_gras1').'" href="'.generer_url_ecrire(_request('exec'),"cmd=switch").'">'
163        . '<img alt="<->" src="'.find_in_path('img/permute.gif').'"/></a>'
164        . '<p id="cs_toggle_p">(0)</p>'
165        . '<a id="cs_reset_a" title="'._T('couteauprive:outils_resetselection').'" href="#">'
166        . '&nbsp;<img alt="X" class="class_png" src="'.find_in_path('img/nosel.gif').'"/>&nbsp;</a>'
167        .       '</div></div></form>'
168        . '<div class="cs_liste cs_actifs">' . $fieldset . '#22BB22;">' . _T('couteauprive:outils_actifs') . '</legend>'
169        . $results_actifs . '</fieldset>'
170        . '<div style="text-align: right;"><a id="cs_tous_a" title="'._T('couteauprive:outils_selectionactifs').'" href="#">'._T('couteauprive:outils_selectiontous').'</a></div>'
171        . '</div></div>');
172}
173
174// renvoie les details techniques d'un outil
175function detail_outil($outil_id) {
176        global $outils;
177        $outil = &$outils[$outil_id];
178        $div = '<div class="cs_details_outil">';
179        if(cs_version_erreur($outil)) return $div . _T('couteauprive:erreur:version') . '</div>';
180        $details = $a = array();
181        foreach(array('spip_options', 'options', 'fonctions', 'js', 'jq', 'css') as $in)
182                if(isset($outil['code:'.$in])) $a[] = _T('couteauprive:code_'.$in);
183        if(count($a)) $details[] = _T('couteauprive:detail_inline') . ' ' . join(', ', $a);
184        $a = array();
185        foreach(array('.php', '_options.php', '_fonctions.php', '.js', '.js.html', '.css', '.css.html') as $ext)
186                if(find_in_path('outils/'.($temp=$outil_id.$ext))) $a[] = $temp;
187        if(count($a)) $details[] = _T('couteauprive:detail_fichiers') . ' ' . join(', ', $a);
188        $serial = serialize(array_keys($outil));
189        if(preg_match_all(',traitement:([A-Z_]+),', $serial, $regs, PREG_PATTERN_ORDER))
190                $details[] =  _T('couteauprive:detail_traitements') . ' #' . join(', #', array_unique($regs[1]));       
191        $serkeys = serialize(array_keys($outil));
192        if(preg_match_all(',(pipeline|pipelinecode):([a-z_]+),', $serkeys, $regs, PREG_PATTERN_ORDER))
193                $details[] = _T('couteauprive:detail_pipelines') . ' ' . join(', ', array_unique($regs[2]));
194        if($outil['nb_disabled']) $details[] = _T('couteauprive:detail_disabled') . ' ' . $outil['nb_disabled'];
195        if(isset($outil['fichiers_distants'])) {
196                $a = array();
197                foreach($outil['fichiers_distants'] as $i) $a[] = basename($outil[$i]);
198                $details[] = _T('couteauprive:detail_fichiers_distant') . ' ' . join(', ', $a);
199        }
200        if(count($details)) return $div . join('<br />', $details) . '</div>';
201        return '';
202}
203
204// renvoie les boutons eventuels d'action rapide
205function cs_action_rapide($outil_id, $actif=true) {
206        include_spip('inc/texte');
207        $f = "{$outil_id}_action_rapide";
208        include_spip("outils/$f");
209        if(!function_exists($f)) return '';
210        if(strlen($f = trim($f()))) {
211                // si inactif...
212                if(!$actif) {
213                        if(preg_match_all(',<legend[^>]*>(.*?):?\s*</legend>,', $f, $regs))
214                                // on ne conserve que les <legend>
215                                $f = '<ul><li>' . join("</li><li>", $regs[1]) . '</li></ul>';
216                                // on ne conserve que les value
217                }
218                $info = '<strong>' . definir_puce() . '&nbsp;' . _T('couteauprive:action_rapide'.($actif?'':'_non')) . "</strong>";
219                return "<div>$info</div><div>$f</div>";
220        }
221        return '';
222}
223
224// gere les fichiers distants d'un outil
225function cs_action_fichiers_distant(&$outil, $force=false) {
226        if(!isset($outil['fichiers_distants'])) return '';
227        $lib = sous_repertoire(_DIR_PLUGIN_COUTEAU_SUISSE, 'lib');
228        $a = array();
229        foreach($outil['fichiers_distants'] as $i) {
230                $erreur = false;
231                $dir = sous_repertoire($lib, $outil['id']);
232                $f = $i . '_' . basename($outil[$i]);
233                $file = $dir.$f;
234                $size = ($force || @(!file_exists($file)) ? 0 : filesize($file));
235                if($size) $statut = _T('couteauprive:distant_present', array('date'=>cs_date_long(date('Y-m-d H:i:s', filemtime($file)))));
236                elseif($outil['actif'] || $force) {
237                        include_spip('inc/distant');
238                        if($distant = recuperer_page($outil[$i])) {
239                                $test = preg_replace(',^.*?\<\?php|\?\>.*?$,', '', $distant);
240                                if(!@eval("return true; $test")) $distant = false;
241                                else $distant = ecrire_fichier($file, '<'."?php\n\n".trim($test)."\n\n?".'>');
242                        }
243                        if($distant) $statut = '<span style="color:green">'._T('couteauprive:distant_charge').'</span>';
244                        else $erreur = $statut = '<span style="color:red">'._T('couteauprive:distant_echoue').'</span>';
245                } else $erreur = $statut = _T('couteauprive:distant_inactif');
246                $a[] = "[{$f}->{$outil[$i]}]\n_ $statut";
247        }
248        $a = '<ul style="margin:0.6em 0 0.6em 4em;"><li>' . join("</li><li style='margin-top:0.4em;'>", $a) . '</li></ul>';
249        $b = ($outil['actif'] || !$erreur)?'rss_actualiser':($erreur?'distant_charger':false);
250        $b = $b?"\n<p class='cs_sobre'><input class='cs_sobre' type='submit' value=\" ["
251                        . attribut_html(_T('couteauprive:'.$b)).']" /></p>':'';
252        return ajax_action_auteur('action_rapide', 'fichiers_distants', 'admin_couteau_suisse', "arg=$outil[id]|fichiers_distants&cmd=descrip#cs_action_rapide",
253                        '<p>' . _T('couteauprive:distant_aide') . '</p>'
254                        . '<p style="margin-top:1em"><strong>' . definir_puce() . '&nbsp;' . _T('couteauprive:detail_fichiers_distant') . '</strong></p>'
255                        . '<div>' . propre($a) . '</div>' . $b);
256       
257}
258
259?>
Note: See TracBrowser for help on using the repository browser.