diff --git a/ecrire/exec_admin_plugin.php b/ecrire/exec_admin_plugin.php index 8df6de1561617a9993422ec9d3f16f9bfae0d8b4..955ff5e3ffa475be5b662028f1551ec1468d2554 100644 --- a/ecrire/exec_admin_plugin.php +++ b/ecrire/exec_admin_plugin.php @@ -39,11 +39,36 @@ function ligne_plug($plug_file,&$plug_actifs,$last_actif = false,$surligne = fal $s .= "/!\ $err <br/>"; $s .= "</div>"; } + // puce d'etat du plugin + // <etat>dev|experimental|test|stable</etat> + $etat = 'dev'; + if (isset($info['etat'])) + $etat = $info['etat']; + switch ($etat) { + case 'experimental': + $puce = 'puce-rouge.gif'; + $titre_etat = _T('plugin:etat_experimental'); + break; + case 'test': + $puce = 'puce-orange.gif'; + $titre_etat = _T('plugin:etat_test'); + break; + case 'stable': + $puce = 'puce-verte.gif'; + $titre_etat = _T('plugin:etat_stable'); + break; + default: + $puce = 'puce-poubelle.gif'; + $titre_etat = _T('plugin:etat_developpement'); + break; + } + $s .= "<img src='"._DIR_IMG_PACK."$puce' width='9' height='9' style='border:0;' alt='$titre_etat' title='$titre_etat' /> "; + $s .= bouton_block_invisible("$plug_file"); $s .= ($plugok=='O'?"<strong>":"").$info['nom'].($plugok=='O'?"</strong>":""); $s .= "</div>"; $s .= debut_block_invisible("$plug_file"); - $s .= _T("plugin:version_plugin") . " : " . $info['version'] . "<br/>"; + $s .= _T("plugin:version_plugin") . " : " . $info['version'] . " | <strong>$titre_etat</strong><br/>"; $s .= _T("plugin:repertoire_plugin") . " : " . $plug_file . "<br/>"; if (isset($info['description'])) @@ -86,6 +111,7 @@ function ligne_plug($plug_file,&$plug_actifs,$last_actif = false,$surligne = fal function admin_plugin(){ global $connect_statut; global $connect_toutes_rubriques; + global $spip_lang_right; $surligne = ""; if ($connect_statut != '0minirezo' OR !$connect_toutes_rubriques) { diff --git a/ecrire/inc_plugin.php b/ecrire/inc_plugin.php index 6faeec8a4ec3255a38425b79742fa6412adf2066..df693d4d01d6be820450caf97573e9fb0f8afdc3 100644 --- a/ecrire/inc_plugin.php +++ b/ecrire/inc_plugin.php @@ -1,4 +1,4 @@ -<? +<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * @@ -16,29 +16,17 @@ if (!defined("_ECRIRE_INC_VERSION")) return; // define('_FILE_PLUGIN_CONFIG', "plugin.xml"); -// besoin de inc_meta (et aussi de version mais on suppose qu'il est cahrgé par ailleurs ...) -include_ecrire ("inc_db_mysql"); +// besoin de inc_meta include_ecrire ("inc_meta"); // lecture des sous repertoire plugin existants -function liste_plugin_files(){ - //unset $plugin_files; - $plugin_files=array();// tableau des repertoire de plugin - if ((@file_exists(_DIR_PLUGINS))&&(is_dir(_DIR_PLUGINS))){ - if ($handle = opendir(_DIR_PLUGINS)) { - while (false !== ($file = readdir($handle))) { - if ($file != "." && $file != "..") { - if (@file_exists(_DIR_PLUGINS."$file/"._FILE_PLUGIN_CONFIG)) { - // verif de disponibilite des infos minimu - // nom, version, class - $infos = plugin_get_infos($file); - if (isset($infos['nom'])&&isset($infos['version'])&&isset($infos['class'])) - $plugin_files[]=$file; //le plugin est "valide" - } - } - } - closedir($handle); - } +function liste_plugin_files(){ + $plugin_files=array(); + foreach (preg_files(_DIR_PLUGINS, '/plugin[.]xml$') as $plugin) { + $infos = plugin_get_infos($file); + if (isset($infos['nom']) && isset($infos['version']) + && isset($infos['prefix'])) + $plugin_files[]=substr(dirname($plugin), strlen(_DIR_PLUGINS)); } return $plugin_files; } @@ -52,8 +40,11 @@ function liste_plugin_actifs(){ return array(); } -function ecrire_plugin_actifs($plugin){ - +function ecrire_plugin_actifs($plugin,$pipe_recherche=false){ + static $liste_pipe_manquants=array(); + if (($pipe_recherche)&&(!in_array($pipe_recherche,$liste_pipe_manquants))) + $liste_pipe_manquants[]=$pipe_recherche; + $plugin_valides = array(); if (is_array($plugin)){ // charger les infos de plugin en memoire @@ -87,11 +78,8 @@ function ecrire_plugin_actifs($plugin){ $s .= '$GLOBALS[\'plugins\'][]=\''.$plug.'\';'."\n"; } } - $filename = _DIR_SESSIONS."charger_plugins_$charge.php"; - if ($handle = fopen($filename, 'wb')) { - @fwrite($handle, $start_file . $s . $end_file); - @fclose($handle); - } + ecrire_fichier(_DIR_SESSIONS."charger_plugins_$charge.php", + $start_file . $s . $end_file); } if (is_array($infos)){ @@ -99,21 +87,26 @@ function ecrire_plugin_actifs($plugin){ // $GLOBALS['spip_pipeline'] // $GLOBALS['spip_matrice'] foreach($infos as $plug=>$info){ - $class = trim(array_pop($info['class'])); + $prefix = ""; + $prefix = trim(array_pop($info['prefix']))."_"; foreach($info['pipeline'] as $pipe){ $nom = trim(array_pop($pipe['nom'])); if (isset($pipe['action'])) $action = trim(array_pop($pipe['action'])); else $action = $nom; - $GLOBALS['spip_pipeline'][$nom] .= "|$class::$action"; + $GLOBALS['spip_pipeline'][$nom] .= "|$prefix$action"; if (isset($pipe['inclure'])){ - $GLOBALS['spip_matrice']["$class::$action"] = + $GLOBALS['spip_matrice']["$prefix$action"] = "_DIR_PLUGINS$plug/".array_pop($pipe['inclure']); } } } } + // on ajoute les pipe qui ont ete recenses manquants + foreach($liste_pipe_manquants as $add_pipe) + if (!isset($GLOBALS['spip_pipeline'][$add_pipe])) + $GLOBALS['spip_pipeline'][$add_pipe]= ''; pipeline_precompile(); } @@ -121,13 +114,13 @@ function ecrire_plugin_actifs($plugin){ // precompilsation des pipelines function pipeline_precompile(){ global $spip_pipeline, $spip_matrice; - $nouveaux_pipe=array(); $start_file = "<"."?php\nif (!defined('_ECRIRE_INC_VERSION')) return;\n"; $end_file = "\n?".">"; + $content = ""; foreach($spip_pipeline as $action=>$pipeline){ $s_inc = ""; - $s_call = "function execute_pipeline_$action(\$val){\n"; + $s_call = ""; $pipe = array_filter(explode('|',$pipeline)); // Eclater le pipeline en filtres et appliquer chaque filtre foreach ($pipe as $fonc) { @@ -147,28 +140,14 @@ function pipeline_precompile(){ $s_inc .= ');'."\n"; } } - $s_inc .= "\n"; - $s_call .= "return \$val;\n}\n"; - $filename = _DIR_SESSIONS."charger_pipeline_$action.php"; - if ($handle = fopen($filename, 'wb')) { - @fwrite($handle, $start_file . $s_inc . $s_call . $end_file); - @fclose($handle); - } - $nouveaux_pipe[] = "charger_pipeline_$action.php"; - } - - // nettoyer les anciens fichiers pipeline obsoletes - if ($handle = opendir(_DIR_SESSIONS)) { - while (false !== ($file = readdir($handle))) { - if ($file != "." && $file != "..") { - if (preg_match(",^charger_pipeline_(.*).php$,",$file)){ - if (!in_array($file,$nouveaux_pipe)) - unlink(_DIR_SESSIONS.$file); - } - } - } - closedir($handle); + $content .= "// Pipeline $action \n"; + $content .= "function execute_pipeline_$action(\$val){\n"; + $content .= $s_inc; + $content .= $s_call; + $content .= "return \$val;\n}\n\n"; } + ecrire_fichier(_DIR_SESSIONS."charger_pipelines.php", + $start_file . $content . $end_file); } // pas sur que ça serve juste au cas où @@ -180,11 +159,11 @@ function liste_plugin_inactifs(){ // penser à faire une maj du cache => ecrire_meta() // en principe cela doit aussi initialiser la valeur à vide si elle n'esite pas // risque de pb en php5 à cause du typage ou de null (vérifier dans la doc php) -function verif_plugin(){ +function verif_plugin($pipe_recherche = false){ $plugin_actifs = liste_plugin_actifs(); $plugin_liste = liste_plugin_files(); $plugin_new = array_intersect($plugin_actifs,$plugin_liste); - ecrire_plugin_actifs($plugin_new); + ecrire_plugin_actifs($plugin_new,$pipe_recherche); ecrire_metas(); } @@ -273,7 +252,7 @@ function plugin_get_infos($plug){ $ret = array(); if ((@file_exists(_DIR_PLUGINS))&&(is_dir(_DIR_PLUGINS))){ if (@file_exists(_DIR_PLUGINS."$plug/plugin.xml")) { - $texte = file_get_contents(_DIR_PLUGINS."$plug/plugin.xml"); + lire_fichier(_DIR_PLUGINS."$plug/plugin.xml", $texte); $arbre = parse_plugin_xml($texte); if (!isset($arbre['plugin'])&&is_array($arbre['plugin'])) $arbre = array('erreur' => array(_T('plugin:erreur_plugin_fichier_def_incorrect')." : $plug/plugin.xml")); @@ -285,19 +264,21 @@ function plugin_get_infos($plug){ plugin_verifie_conformite($plug,$arbre); - $ret['nom'] = join(' ',$arbre['nom']); - $ret['version'] = array_pop($arbre['version']); + $ret['nom'] = trim(join(' ',$arbre['nom'])); + $ret['version'] = trim(end($arbre['version'])); if (isset($arbre['auteur'])) - $ret['auteur'] = join(',',$arbre['auteur']); + $ret['auteur'] = trim(join(',',$arbre['auteur'])); if (isset($arbre['description'])) $ret['description'] = chaines_lang(join(' ',$arbre['description'])); if (isset($arbre['lien'])) $ret['lien'] = join(' ',$arbre['lien']); + if (isset($arbre['etat'])) + $ret['etat'] = trim(end($arbre['etat'])); if (isset($arbre['options'])) $ret['options'] = $arbre['options']; if (isset($arbre['fonctions'])) $ret['fonctions'] = $arbre['fonctions']; - $ret['class'] = $arbre['class']; + $ret['prefix'] = $arbre['prefix']; if (isset($arbre['pipeline'])) $ret['pipeline'] = $arbre['pipeline']; if (isset($arbre['erreur'])) @@ -326,13 +307,19 @@ function plugin_verifie_conformite($plug,&$arbre){ $arbre['erreur'][] = _T('plugin:erreur_plugin_version_manquant'); $arbre['version'] = array(""); } - if (!isset($arbre['class'])){ + if (!isset($arbre['prefix'])){ if (!$silence) - $arbre['erreur'][] = _T('plugin:erreur_plugin_class_manquant'); - $arbre['class'] = array(""); + $arbre['erreur'][] = _T('plugin:erreur_plugin_prefix_manquant'); + $arbre['prefix'] = array(""); } else{ - $class = trim(end($arbre['class'])); + $prefix = ""; + $prefix = trim(end($arbre['prefix'])); + if (isset($arbre['etat'])){ + $etat = trim(end($arbre['etat'])); + if (!preg_match(',^(dev|experimental|test|stable)$,',$etat)) + $arbre['erreur'][] = _T('plugin:erreur_plugin_etat_inconnu')." : $etat"; + } if (isset($arbre['options'])){ foreach($arbre['options'] as $optfile){ $optfile = trim($optfile); @@ -352,7 +339,7 @@ function plugin_verifie_conformite($plug,&$arbre){ $fonctions = array(); if (isset($arbre['fonctions'])) $fonctions = $arbres['fonctions']; - $liste_methodes_reservees = array('__construct','__destruct','plugin','install',strtolower($class)); + $liste_methodes_reservees = array('__construct','__destruct','plugin','install','uninstall',strtolower($prefix)); foreach($arbre['pipeline'] as $pipe){ $nom = trim(end($pipe['nom'])); if (isset($pipe['action'])) @@ -376,4 +363,5 @@ function plugin_verifie_conformite($plug,&$arbre){ } } } -?> \ No newline at end of file + +?> diff --git a/ecrire/inc_utils.php b/ecrire/inc_utils.php index 2516a80b6e56f49d4ded0842c8e49e9ba272262c..d7b602000ab090ce333f9d8fab49716df14624bf 100644 --- a/ecrire/inc_utils.php +++ b/ecrire/inc_utils.php @@ -92,24 +92,34 @@ function minipipe($fonc,$val){ // chargement du pipeline sous la forme d'un fichier php prepare function pipeline($action,$val){ - $ok = @is_readable($f = _DIR_SESSIONS."charger_pipeline_$action.php"); + $ok = @is_readable($f = _DIR_SESSIONS."charger_pipelines.php"); if (!$ok){ include_ecrire('inc_plugin'); // generer les fichiers php precompiles // de chargement des plugins et des pipelines verif_plugin(); - $ok = @is_readable($f = _DIR_SESSIONS."charger_pipeline_$action.php"); + $ok = @is_readable($f = _DIR_SESSIONS."charger_pipelines.php"); if (!$ok) - spip_log("generation de $f impossible; pipeline desactives"); + spip_log("generation de $f impossible; tous les pipeline desactives"); } if ($ok){ require_once($f); $f = "execute_pipeline_$action"; - $val = $f($val); - // si le flux est une table qui encapsule donnees et autres - // on ne ressort du pipe que les donnees - if (is_array($val)&&isset($val['data'])) - $val = $val['data']; + $ok = function_exists($f); + if ($ok){ + $val = $f($val); + // si le flux est une table qui encapsule donnees et autres + // on ne ressort du pipe que les donnees + if (is_array($val)&&isset($val['data'])) + $val = $val['data']; + } + else{ + include_ecrire('inc_plugin'); + //on passe $action en arg pour creer la fonction meme si le pipe n'est defini nul part + // vu qu'on est la c'est qu'il existe ! + verif_plugin($action); + spip_log("fonction $f absente : pipeline desactive"); + } } return $val; } diff --git a/ecrire/lang/plugin_fr.php3 b/ecrire/lang/plugin_fr.php3 index a0a3826cc476143d3dbcf9d385df105991b6a9e0..6fe4bdd080b679ca8a94a4640f7f21525e068025 100644 --- a/ecrire/lang/plugin_fr.php3 +++ b/ecrire/lang/plugin_fr.php3 @@ -11,10 +11,15 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( 'erreur_plugin_tag_plugin_absent' => "<plugin> manquant dans le fichier de definition", 'erreur_plugin_nom_manquant' => "Nom du plugin manquant", 'erreur_plugin_version_manquant' => "Version du plugin manquante", -'erreur_plugin_class_manquant' => "Classe du plugin manquant", +'erreur_plugin_prefix_manquant' => "Espace de nommage du plugin non defini", 'erreur_plugin_fichier_absent' => "Fichier absent", 'erreur_plugin_nom_fonction_interdit' => 'Nom de fonction interdit', +'etat_developpement' => 'En developpement', +'etat_experimental' => 'Experimental', +'etat_test' => 'En test', +'etat_stable' => 'Version Stable', + 'lien_plugin' => 'Lien', 'onglet_plugin' => 'Gestion des plugins',