PageRenderTime 77ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 1ms

/_dev_/recherche_plugin/formulaires/plugins.php

https://bitbucket.org/pombredanne/spip-zone-treemap
PHP | 470 lines | 361 code | 59 blank | 50 comment | 48 complexity | a2b4a113081c002577d23cdc1072fde7 MD5 | raw file
  1. <?php
  2. include_spip('inc/config');
  3. include_spip('inc/plugin');
  4. include_spip('inc/presentation');
  5. include_spip('inc/layer');
  6. include_spip('inc/actions');
  7. include_spip('inc/securiser_action');
  8. function formulaires_plugins_charger_dist(){
  9. $recherche = _request('recherche_plugin','');
  10. $format = '';
  11. if (_request('format')!==NULL)
  12. $format = _request('format');
  13. list($resultats, $nombre) = plugins_formulaire_resultats($recherche,$format);
  14. include_spip('inc/securiser_action');
  15. return array(
  16. 'recherche_plugin' => $recherche,
  17. 'nombre_resultats' => ($recherche ? _L('@nb@ réponses',array('nb'=>$nombre)) : ''),
  18. '_resultats' => $resultats,
  19. // en fait, il faut mettre liste/arbre en option de la recherche directement...
  20. // plop. yaka !
  21. //'_forcer_request' => 'oui' // pour recuperer les GET des liens (liste/arbre)
  22. );
  23. }
  24. function formulaires_plugins_verifier_dist(){
  25. $erreurs = array();
  26. // si on vient du formulaire rechercher, on ne fait aucun traitement.
  27. if (!('oui' == _request('frm_activer_plugins')))
  28. $erreurs['rien_a_faire'] = " ";
  29. // sinon, verifier l'autorisation
  30. elseif (!autoriser('configurer', 'plugins'))
  31. $erreurs['message_erreur'] = _L('acces_interdit');
  32. return $erreurs;
  33. }
  34. function formulaires_plugins_traiter_dist(){
  35. $res = array('editable'=>true);
  36. // forcer la maj des metas pour les cas de modif de numero de version base via phpmyadmin
  37. lire_metas();
  38. // enregistrer les modifs
  39. include_spip('action/activer_plugins');
  40. enregistre_modif_plugin();
  41. if (isset($GLOBALS['meta']['plugin_erreur_activation'])
  42. AND autoriser('configurer', 'plugins', null, $id_auteur)) {
  43. if ($message = $GLOBALS['meta']['plugin_erreur_activation'])
  44. $res['message_erreur'] = $message;
  45. effacer_meta('plugin_erreur_activation');
  46. }
  47. return $res;
  48. }
  49. // installe les plugins, mais recupere le buffur si possible,
  50. // sinon ajax se retrouve avec des header deja envoyes
  51. function rp_installe_plugins(){
  52. if ($GLOBALS['flag_ob']) {
  53. ob_start();
  54. installe_plugins();
  55. $compte_rendu = ob_get_contents();
  56. ob_end_clean();
  57. } else {
  58. installe_plugins();
  59. }
  60. return $compte_rendu;
  61. }
  62. // cette fonction retourne
  63. // - soit une liste de plugins correspondant a la recherche
  64. // - soit en absence de recherche les plugins actifs, interessants,
  65. // ainsi que tous les plugins a la racine /plugins/ et dans /plugins/auto/
  66. function plugins_formulaire_resultats($recherche="", $format=''){
  67. $lpf = liste_plugin_files();
  68. $lcpa = liste_chemin_plugin_actifs();
  69. $plugins_interessants = @array_keys(unserialize($GLOBALS['meta']['plugins_interessants']));
  70. if (!is_array($plugins_interessants))
  71. $plugins_interessants = array();
  72. if ($lpf) {
  73. // pas de recherche = comme avant
  74. if (!$recherche) {
  75. // S'il y a plus de 10 plugins pas installes, les signaler a part ;
  76. // mais on affiche tous les plugins mis a la racine ou dans auto/
  77. if (count($lpf) - count($lcpa) > 9
  78. AND _request('afficher_tous_plugins') != 'oui') {
  79. $dir_auto = substr(_DIR_PLUGINS_AUTO, strlen(_DIR_PLUGINS));
  80. $lcpaffiche = array();
  81. foreach ($lpf as $f)
  82. if (!strpos($f, '/')
  83. OR ($dir_auto AND substr($f, 0, strlen($dir_auto)) == $dir_auto)
  84. OR in_array($f, $lcpa)
  85. OR in_array($f, $plugins_interessants))
  86. $lcpaffiche[] = $f;
  87. if (count($lcpaffiche)<10 && !$format) $format = 'liste';
  88. $corps = plugins_generer_liens_liste($lpf, $lcpa, $format,true)
  89. . affiche_les_plugins($lcpaffiche, $lcpa, $format);
  90. } else {
  91. $corps = plugins_generer_liens_liste($lpf, $lcpa, $format)
  92. //. (count($lpf)>20 ? $sub : '')
  93. . affiche_les_plugins($lpf, $lcpa, $format);
  94. }
  95. }
  96. // on a des choses à rechercher !
  97. // il faut penser a mettre en hinput hidden coche les plugins actifs
  98. // non presents dans le resultat de recherche
  99. // sinon ils seraient consideres desactives lors de la validation du
  100. // formulaire d'activation
  101. else {
  102. $results = $scores = array();
  103. foreach($lpf as $adresse) {
  104. $info = plugin_get_infos($adresse);
  105. // on compte les points
  106. $find = '';
  107. if (false !== stripos($info['nom'], $recherche))
  108. $find='titre';
  109. elseif (false !== stripos($info['prefix'], $recherche))
  110. $find='titre';
  111. elseif (false !== stripos($info['auteur'], $recherche))
  112. $find='auteur';
  113. //if (false !== stripos($adresse, $recherche))
  114. // $find[]='adresse';
  115. elseif (false !== stripos($info['description'], $recherche))
  116. $find='description';
  117. if ($find) {
  118. $results[] = $adresse;
  119. $scores[$adresse] = $find;
  120. }
  121. }
  122. $nb = count($results);
  123. $format= ($f = _request('format')) ? $f : 'recherche';
  124. $corps = plugins_generer_liens_liste($lpf, $lcpa, $format,true, $recherche)
  125. . affiche_les_plugins($results, $lcpa, $format, $scores);
  126. // ajouter les hidden
  127. $hiddens = array_diff($lcpa,$results);
  128. foreach ($hiddens as $h){
  129. $name = 's' . substr(md5("statusplug_$h"),0,16);
  130. $corps .= "\n<input type='hidden' name='$name' value='O' />";
  131. }
  132. // infos sur les paquets distants
  133. include_spip('inc/charger_plugin');
  134. $plugs_distants = liste_plugins_distants(true);
  135. //spip_log($plugs_distants,'plugins');
  136. }
  137. return array($corps,$nb);
  138. }
  139. }
  140. function plugins_generer_liens_liste(&$lpf, &$lcpa, $format, $tous=false, $recherche=""){
  141. $url_tous = parametre_url(self(),'recherche_plugin','');
  142. $url = parametre_url(self(), 'recherche_plugin', $recherche);
  143. foreach(array('recherche_titre','recherche_description','recherche_repertoire','recherche_auteur') as $r)
  144. $url = parametre_url($url, $r, _request($r));
  145. $lien_format = ($format!='liste')
  146. ?("<a href='".parametre_url($url,'format','liste')."' class='ajax'>"._T('plugins_vue_liste')."</a>")
  147. :("<a href='".parametre_url($url,'format','arbre')."' class='ajax'>"._T('plugins_vue_hierarchie')."</a>");
  148. return "<p>$lien_format | "._T('plugins_actifs',array('count'=>count($lcpa)))."\n"
  149. . " | <a href='". parametre_url($url_tous,'afficher_tous_plugins', $tous?'oui':'') ."' class='ajax'>"
  150. ._T('plugins_disponibles',array('count'=>count($lpf)))."</a></p>\n";
  151. }
  152. // http://doc.spip.org/@affiche_les_plugins
  153. function affiche_les_plugins($liste_plugins, $liste_plugins_actifs, $format='arbre', $scores=array()){
  154. if ($format=='liste'){
  155. $liste_plugins = array_flip($liste_plugins);
  156. foreach(array_keys($liste_plugins) as $chemin) {
  157. $info = plugin_get_infos($chemin);
  158. $liste_plugins[$chemin] = strtoupper(trim(typo(translitteration(unicode2charset(html2unicode($info['nom']))))));
  159. }
  160. asort($liste_plugins);
  161. $res = affiche_liste_plugins($liste_plugins,$liste_plugins_actifs);
  162. }
  163. elseif ($format == 'recherche') {
  164. $liste_plugins = array_flip($liste_plugins);
  165. foreach(array_keys($liste_plugins) as $chemin) {
  166. $liste_plugins[$chemin] = $scores[$chemin];
  167. }
  168. arsort($liste_plugins);
  169. $res = affiche_recherche_plugins($liste_plugins,$liste_plugins_actifs);
  170. }
  171. else
  172. $res = affiche_arbre_plugins($liste_plugins,$liste_plugins_actifs);
  173. return http_script("
  174. jQuery(function(){
  175. jQuery('input.check').click(function(){
  176. jQuery(this).parent().toggleClass('nomplugin_on');
  177. });
  178. jQuery('div.nomplugin a[@rel=info]').click(function(){
  179. var prefix = jQuery(this).parent().prev().attr('name');
  180. if (!jQuery(this).siblings('div.info').html()) {
  181. jQuery(this).siblings('div.info').prepend(ajax_image_searching).load(
  182. jQuery(this).attr('href').replace(/admin_plugin|plugins/, 'info_plugin'), {},
  183. function() {
  184. document.location = '#' + prefix;
  185. }
  186. );
  187. } else {
  188. if (jQuery(this).siblings('div.info').toggle().attr('display') != 'none') {
  189. document.location = '#' + prefix;
  190. }
  191. }
  192. return false;
  193. });
  194. });
  195. ") . $res;
  196. }
  197. // http://doc.spip.org/@affiche_block_initiale
  198. function affiche_block_initiale($initiale,$block,$block_actif){
  199. if (strlen($block)){
  200. return "<li>"
  201. . bouton_block_depliable($initiale,$block_actif?true:false)
  202. . debut_block_depliable($block_actif)
  203. . "<ul>$block</ul>"
  204. . fin_block()
  205. . "</li>";
  206. }
  207. return "";
  208. }
  209. // http://doc.spip.org/@affiche_liste_plugins
  210. function affiche_liste_plugins($liste_plugins, $liste_plugins_actifs){
  211. $block_par_lettre = count($liste_plugins)>10;
  212. $fast_liste_plugins_actifs = array_flip($liste_plugins_actifs);
  213. $maxiter=1000;
  214. $res = '';
  215. $block = '';
  216. $initiale = '';
  217. $block_actif = false;
  218. foreach($liste_plugins as $plug => $nom){
  219. if (($i=substr($nom,0,1))!==$initiale){
  220. $res .= $block_par_lettre ? affiche_block_initiale($initiale,$block,$block_actif): $block;
  221. $initiale = $i;
  222. $block = '';
  223. $block_actif = false;
  224. }
  225. // le rep suivant
  226. $actif = @isset($fast_liste_plugins_actifs[$plug]);
  227. $block_actif = $block_actif | $actif;
  228. $id = substr(md5($plug),0,16);
  229. $block .= "<li>"
  230. . ligne_plug($plug, $actif, $id)
  231. . "</li>\n";
  232. }
  233. $res .= $block_par_lettre ? affiche_block_initiale($initiale,$block,$block_actif): $block;
  234. return "<ul>"
  235. . $res
  236. . "</ul>";
  237. }
  238. // http://doc.spip.org/@affiche_liste_plugins
  239. function affiche_recherche_plugins($liste_plugins, $liste_plugins_actifs){
  240. //$block_par_lettre = count($liste_plugins)>10;
  241. $fast_liste_plugins_actifs = array_flip($liste_plugins_actifs);
  242. $maxiter=1000;
  243. $res = '';
  244. $block = '';
  245. $initiale = '';
  246. $block_actif = false;
  247. foreach($liste_plugins as $plug => $nom){
  248. if ($nom!==$initiale){
  249. //$res .= $block_par_lettre ? affiche_block_initiale(_T($initiale),$block,$block_actif): $block;
  250. $res .= affiche_block_initiale(_T($initiale),$block,$block_actif);
  251. $initiale = $nom;
  252. $block = '';
  253. $block_actif = false;
  254. }
  255. // le rep suivant
  256. $actif = @isset($fast_liste_plugins_actifs[$plug]);
  257. $block_actif = $block_actif | $actif;
  258. $id = substr(md5($plug),0,16);
  259. $block .= "<li>"
  260. . ligne_plug($plug, $actif, $id)
  261. . "</li>\n";
  262. }
  263. //$res .= $block_par_lettre ? affiche_block_initiale(_T($initiale),$block,$block_actif): $block;
  264. $res .= affiche_block_initiale(_T($initiale),$block,$block_actif);
  265. return "<ul>"
  266. . $res
  267. . "</ul>";
  268. }
  269. // http://doc.spip.org/@tree_open_close_dir
  270. function tree_open_close_dir(&$current,$target,$deplie=array()){
  271. if ($current == $target) return "";
  272. $tcur = explode("/",$current);
  273. $ttarg = explode("/",$target);
  274. $tcom = array();
  275. $output = "";
  276. // la partie commune
  277. while (reset($tcur)==reset($ttarg)){
  278. $tcom[] = array_shift($tcur);
  279. array_shift($ttarg);
  280. }
  281. // fermer les repertoires courant jusqu'au point de fork
  282. while($close = array_pop($tcur)){
  283. $output .= "</ul>\n";
  284. $output .= fin_block();
  285. $output .= "</li>\n";
  286. }
  287. $chemin = "";
  288. if (count($tcom))
  289. $chemin .= implode("/",$tcom)."/";
  290. // ouvrir les repertoires jusqu'a la cible
  291. while($open = array_shift($ttarg)){
  292. $visible = @isset($deplie[$chemin.$open]);
  293. $chemin .= $open . "/";
  294. $output .= "<li>";
  295. $output .= bouton_block_depliable($chemin,$visible);
  296. $output .= debut_block_depliable($visible);
  297. $output .= "<ul>\n";
  298. }
  299. $current = $target;
  300. return $output;
  301. }
  302. // http://doc.spip.org/@affiche_arbre_plugins
  303. function affiche_arbre_plugins($liste_plugins, $liste_plugins_actifs){
  304. $racine = basename(_DIR_PLUGINS);
  305. $init_dir = $current_dir = "";
  306. // liste des repertoires deplies : construit en remontant l'arbo de chaque plugin actif
  307. // des qu'un path est deja note deplie on s'arrete
  308. $deplie = array($racine=>true);
  309. $fast_liste_plugins_actifs=array();
  310. foreach($liste_plugins_actifs as $key=>$plug){
  311. $fast_liste_plugins_actifs["$racine/$plug"]=true;
  312. $dir = dirname("$racine/$plug");$maxiter=100;
  313. while(strlen($dir) && !isset($deplie[$dir]) && $dir!=$racine && $maxiter-->0){
  314. $deplie[$dir] = true;
  315. $dir = dirname($dir);
  316. }
  317. }
  318. // index repertoires --> plugin
  319. $dir_index=array();
  320. foreach($liste_plugins as $key=>$plug){
  321. $liste_plugins[$key] = "$racine/$plug";
  322. $dir_index[dirname("$racine/$plug")][] = $key;
  323. }
  324. $visible = @isset($deplie[$current_dir]);
  325. $maxiter=1000;
  326. $res = '';
  327. while (count($liste_plugins) && $maxiter--){
  328. // le rep suivant
  329. $dir = dirname(reset($liste_plugins));
  330. if ($dir != $current_dir)
  331. $res .= tree_open_close_dir($current_dir,$dir,$deplie);
  332. // d'abord tous les plugins du rep courant
  333. if (isset($dir_index[$current_dir]))
  334. foreach($dir_index[$current_dir] as $key){
  335. $plug = $liste_plugins[$key];
  336. $actif = @isset($fast_liste_plugins_actifs[$plug]);
  337. $id = substr(md5($plug),0,16);
  338. $res .= "<li>"
  339. . ligne_plug(substr($plug,strlen($racine)+1), $actif, $id)
  340. . "</li>\n";
  341. unset($liste_plugins[$key]);
  342. }
  343. }
  344. $res .= tree_open_close_dir($current_dir,$init_dir, true);
  345. return "<ul>"
  346. . $res
  347. . "</ul>";
  348. }
  349. // http://doc.spip.org/@ligne_plug
  350. function ligne_plug($plug_file, $actif, $id){
  351. global $spip_lang_right;
  352. static $id_input=0;
  353. static $versions = array();
  354. $erreur = false;
  355. $vals = array();
  356. $info = plugin_get_infos($plug_file);
  357. // plug pour CFG
  358. if ($actif
  359. AND defined('_DIR_PLUGIN_CFG')) {
  360. if (include_spip('inc/cfg') // test CFG version >= 1.0.5
  361. AND $i = icone_lien_cfg(_DIR_PLUGINS.$plug_file))
  362. $s .= '<div style="float:right;">'.$i.'</div>';
  363. }
  364. $versions[$info['prefix']] = isset($versions[$info['prefix']]) ?
  365. $versions[$info['prefix']] + 1 : '';
  366. $s .= "<div id='" . $info['prefix'] . $versions[$info['prefix']] . "' class='nomplugin ".($actif?'nomplugin_on':'')."'>";
  367. if (isset($info['erreur'])){
  368. $s .= "<div class='plugin_erreur'>";
  369. $erreur = true;
  370. foreach($info['erreur'] as $err)
  371. $s .= "/!\ $err <br/>";
  372. $s .= "</div>";
  373. }
  374. $etat = 'dev';
  375. if (isset($info['etat']))
  376. $etat = $info['etat'];
  377. $nom = typo($info['nom']);
  378. $id = substr(md5("aide_$plug_file"),0,8);
  379. $puce_etat = array(
  380. "dev"=>"<img src='". chemin_image('puce-poubelle.gif') . "' width='9' height='9' alt='dev' />",
  381. "test"=>"<img src='". chemin_image('puce-orange.gif') . "' width='9' height='9' alt='dev' />",
  382. "stable"=>"<img src='". chemin_image('puce-verte.gif') . "' width='9' height='9' alt='dev' />",
  383. "experimental"=>"<img src='". chemin_image('puce-rouge.gif') . "' width='9' height='9' alt='dev' />",
  384. );
  385. if (isset($puce_etat[$etat]))
  386. $s .= $puce_etat[$etat];
  387. if (!$erreur){
  388. $name = 's' . substr(md5("statusplug_$plug_file"),0,16);
  389. $s .= "\n<input type='checkbox' name='$name' id='label_$id_input' value='O'";
  390. $s .= $actif?" checked='checked'":"";
  391. $s .= " class='check' />";
  392. $s .= "\n<label for='label_$id_input'>"._T('activer_plugin')."</label>";
  393. }
  394. $id_input++;
  395. $url_stat = generer_url_ecrire(_request('exec'),"plug=".urlencode($plug_file));
  396. $s .= "<a href='$url_stat' rel='info' class='titre_plugin' title='$plug_file'>$nom</a>";
  397. // afficher les details d'un plug en secours ; la div sert pour l'ajax
  398. $s .= "<div class='info'>";
  399. if (urldecode(_request('plug'))==$plug_file)
  400. $s .= affiche_bloc_plugin($plug_file, $info);
  401. $s .= "</div>";
  402. $s .= "</div>";
  403. return $s;
  404. }
  405. function plugins_script_info_plug(){
  406. $script = "
  407. jQuery(document).ready(function() {
  408. });";
  409. return http_script($script);
  410. }
  411. ?>