[SPIP] v3.2.1-->v3.2.2
[lhc/web/www.git] / www / ecrire / exec / admin_plugin.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2019 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 /**
14 * Gestion d'affichage de l'administration des plugins
15 *
16 * @package SPIP\Core\Exec
17 */
18
19 if (!defined('_ECRIRE_INC_VERSION')) {
20 return;
21 }
22
23 include_spip('inc/config');
24 include_spip('inc/plugin');
25 include_spip('inc/presentation');
26 include_spip('inc/layer');
27 include_spip('inc/actions');
28 include_spip('inc/securiser_action');
29
30 /**
31 * Affichage de la page de gestion des plugins
32 *
33 * Relance la page si des plugins ont été modifiés, sinon affiche la liste.
34 *
35 * @uses actualise_plugins_actifs()
36 * @param string $retour Inutilisé
37 */
38 function exec_admin_plugin_dist($retour = '') {
39
40 if (!autoriser('configurer', '_plugins')) {
41 include_spip('inc/minipres');
42 echo minipres();
43 } else {
44 // on fait la verif du path avant tout,
45 // et l'installation des qu'on est dans la colonne principale
46 // si jamais la liste des plugins actifs change, il faut faire un refresh du hit
47 // pour etre sur que les bons fichiers seront charges lors de l'install
48 $new = actualise_plugins_actifs();
49 if ($new and _request('actualise') < 2) {
50 include_spip('inc/headers');
51 if (isset($GLOBALS['fichier_php_compile_recent'])) {
52 // attendre eventuellement l'invalidation du cache opcode
53 spip_attend_invalidation_opcode_cache($GLOBALS['fichier_php_compile_recent']);
54 }
55 redirige_par_entete(parametre_url(self(), 'actualise', _request('actualise') + 1, '&'));
56 } else {
57 admin_plug_args(_request('voir'), _request('erreur'), _request('format'));
58 }
59 }
60 }
61
62 /**
63 * Affichage spécifique de la page de gestion des plugins
64 *
65 * Affiche la liste des plugins demandés et les erreurs éventuelles.
66 *
67 * @uses plugin_donne_erreurs()
68 * @uses liste_chemin_plugin()
69 * @uses plugin_installes_meta()
70 * @uses affiche_les_plugins_verrouilles()
71 *
72 * @pipeline_appel affiche_gauche
73 * @pipeline_appel affiche_droit
74 * @pipeline_appel affiche_milieu
75 *
76 * @param string $quoi
77 * Quels plugins afficher ? actifs, ou autre
78 * @param string $erreur
79 * Erreur éventuelle à afficher
80 * @param string $format
81 * Format d'affichage (liste ou arborescence)
82 **/
83 function admin_plug_args($quoi, $erreur, $format) {
84 if (!$quoi) {
85 $quoi = 'actifs';
86 }
87 // empecher l'affichage des erreurs dans le bandeau, on le donne ensuite
88 // format brut par plugin
89 $GLOBALS['erreurs_activation_raw'] = plugin_donne_erreurs(true, false);
90 // format resume mis en forme
91 $erreur_activation = plugin_donne_erreurs();
92 $commencer_page = charger_fonction('commencer_page', 'inc');
93 echo $commencer_page(_T('icone_admin_plugin'), "configuration", "plugin");
94
95 echo debut_gauche('plugin', true);
96 echo recuperer_fond('prive/squelettes/navigation/configurer', array('exec' => 'admin_plugin'));
97
98 echo pipeline('affiche_gauche',
99 array(
100 'args' => array('exec' => 'admin_plugin'),
101 'data' => afficher_librairies()
102 )
103 );
104
105 echo debut_droite('plugin', true);
106 echo gros_titre(_T('icone_admin_plugin'), '', false);
107
108 // Barre d'onglets de premier niveau
109 echo barre_onglets("plugins", "plugins_actifs");
110 // Barre d'onglets de second niveau
111 $onglet2 = $quoi == 'actifs' ? 'plugins_actifs' : 'admin_plugin';
112 echo debut_onglet('onglets_simple second');
113 echo onglet(_T('plugins_tous_liste'), generer_url_ecrire("admin_plugin", "voir=tous"), 'admin_plugin', $onglet2);
114 echo onglet(_T('plugins_actifs_liste'), generer_url_ecrire("admin_plugin"), 'plugins_actifs', $onglet2);
115 echo fin_onglet();
116
117 // message d'erreur au retour d'une operation
118 if ($erreur) {
119 echo "<div class='error'>$erreur</div>";
120 }
121 if ($erreur_activation) {
122 echo "<div class='error'>$erreur_activation</div>";
123 }
124
125 // la mise a jour de cette meta a ete faite par ecrire_plugin_actifs
126 $actifs = unserialize($GLOBALS['meta']['plugin']);
127 $lcpa = $actifs + unserialize($GLOBALS['meta']['plugin_attente']);
128
129 // Les affichages se basent sur le repertoire, pas sur le nom
130 $actifs = liste_chemin_plugin($actifs, '');
131 if (defined('_DIR_PLUGINS_SUPPL')) {
132 $lcpas = liste_chemin_plugin($lcpa, _DIR_PLUGINS_SUPPL);
133 }
134 $lcpa = liste_chemin_plugin($lcpa);
135
136 // on installe les plugins maintenant,
137 // cela permet aux scripts d'install de faire des affichages (moches...)
138 plugin_installes_meta();
139
140 echo "<div class='liste-plugins formulaire_spip'>";
141 echo debut_cadre_trait_couleur('plugin-24.png', true, '', _T('plugins_liste'), 'plugins');
142
143 if ($quoi !== 'actifs') {
144 $lpf = liste_plugin_files();
145 if ($lpf) {
146 echo "<p>" . _T('texte_presente_plugin') . "</p>";
147 } else {
148 if (!@is_dir(_DIR_PLUGINS)) {
149 echo "<p>" . _T('plugin_info_automatique_ftp', array('rep' => joli_repertoire(_DIR_PLUGINS)))
150 . " &mdash; " . _T('plugin_info_automatique_creer') . "</p>";
151 }
152 }
153 $lcpaffiche = $lpf;
154 if (defined('_DIR_PLUGINS_SUPPL')) {
155 $lcpaffichesup = liste_plugin_files(_DIR_PLUGINS_SUPPL);
156 }
157 } else {
158 // la liste
159 // $quoi=='actifs'
160 $lcpaffiche = $lcpa;
161 if (defined('_DIR_PLUGINS_SUPPL')) {
162 $lcpaffichesup = $lcpas;
163 }
164 }
165
166 if ($quoi == 'actifs' or $lpf) {
167 $nb = count($lcpa);
168 if (defined('_DIR_PLUGINS_SUPPL')) {
169 $nb += count($lcpas);
170 }
171 echo "<h3>" . sinon(singulier_ou_pluriel($nb, 'plugins_actif_un', 'plugins_actifs', 'count'),
172 _T('plugins_actif_aucun')) . "</h3>";
173 }
174
175 if (empty($format)) {
176 $format = 'liste';
177 } elseif (!in_array($format, array('liste', 'repertoires'))) {
178 $format = 'repertoires';
179 }
180
181 $afficher = charger_fonction("afficher_$format", 'plugins');
182 $corps = $afficher(self(), $lcpaffiche, $lcpa, $actifs);
183 if (defined('_DIR_PLUGINS_SUPPL')) {
184 $corps .= $afficher(self(), $lcpaffichesup, $lcpas, $actifs, _DIR_PLUGINS_SUPPL);
185 }
186
187 if ($corps) {
188 $corps .= "\n<div class='boutons' style='display:none;'>"
189 . "<input type='submit' class='submit save' value='" . _T('bouton_enregistrer')
190 . "' />"
191 . "</div>";
192 }
193
194 echo redirige_action_post('activer_plugins', 'activer', 'admin_plugin', '', $corps);
195
196 echo fin_cadre_trait_couleur(true);
197
198 if ($quoi == 'actifs') {
199 echo affiche_les_plugins_verrouilles($actifs);
200 }
201 echo "</div>";
202
203 echo http_script("
204 jQuery(function(){
205 jQuery('.plugins li.item a[rel=info]').click(function(){
206 var li = jQuery(this).parents('li').eq(0);
207 var prefix = li.find('input.checkbox').attr('name');
208 if (!jQuery('div.details',li).html()) {
209 jQuery('div.details',li).prepend(ajax_image_searching).load(
210 jQuery(this).attr('href').replace(/admin_plugin|plugins/, 'info_plugin'), function(){
211 li.addClass('on');
212 }
213 );
214 }
215 else {
216 if (jQuery('div.details',li).toggle().is(':visible'))
217 li.addClass('on');
218 else
219 li.removeClass('on');
220 }
221 return false;
222 });
223 jQuery('.plugins li.item input.checkbox').change(function(){
224 jQuery(this).parents('form').eq(0).find('.boutons').slideDown();
225 });
226 });
227 ");
228
229 echo pipeline('affiche_milieu',
230 array(
231 'args' => array('exec' => 'admin_plugin'),
232 'data' => ''
233 )
234 );
235
236 echo fin_gauche(), fin_page();
237 }
238
239 /**
240 * Crée le code HTML de la liste des plugins verrouillés
241 *
242 * @uses liste_plugin_files()
243 *
244 * @param array $actifs
245 * Liste des plugins actifs
246 * @return string
247 * Code HTML
248 **/
249 function affiche_les_plugins_verrouilles($actifs) {
250 if ((!$liste = liste_plugin_files(_DIR_PLUGINS_DIST))) {
251 return '';
252 }
253
254 $afficher = charger_fonction("afficher_liste", 'plugins');
255 $liste = $afficher(self(), $liste, array(), $actifs, _DIR_PLUGINS_DIST);
256
257 return
258 "<div id='plugins_dist'>"
259 . debut_cadre_trait_couleur('', true, '', _T('plugins_liste_dist'), 'liste_plugins_dist')
260 . "<p>"
261 . _T('plugin_info_plugins_dist_1', array('plugins_dist' => joli_repertoire(_DIR_PLUGINS_DIST)))
262 . '<br />' . _T('plugin_info_plugins_dist_2')
263 . "</p>"
264 . $liste
265 . fin_cadre_trait_couleur(true)
266 . "</div>\n";
267 }
268
269 /**
270 * Crée le code HTML de la liste des librairies présentes
271 *
272 * @uses liste_librairies()
273 *
274 * @return string Code HTML
275 */
276 function afficher_librairies() {
277
278 if (!$libs = liste_librairies()) {
279 return '';
280 }
281 ksort($libs);
282 $res = debut_cadre_enfonce('', true, '', _T('plugin_librairies_installees'));
283 $res .= '<dl>';
284 foreach ($libs as $lib => $rep) {
285 $res .= "<dt>$lib</dt><dd>" . joli_repertoire($rep) . "</dd>\n";
286 }
287 $res .= '</dl>';
288 $res .= fin_cadre_enfonce(true);
289
290 return $res;
291 }
292
293
294 /**
295 * Faire la liste des librairies disponibles
296 *
297 * @return array
298 * Tableau (nom de la lib => repertoire , ...)
299 */
300 function liste_librairies() {
301 $libs = array();
302 foreach (array_reverse(creer_chemin()) as $d) {
303 if (is_dir($dir = $d . 'lib/')
304 and $t = opendir($dir)
305 ) {
306 while (($f = readdir($t)) !== false) {
307 if ($f[0] != '.'
308 and is_dir("$dir/$f")
309 ) {
310 $libs[$f] = $dir;
311 }
312 }
313 }
314 }
315
316 return $libs;
317 }