Skip to content
Extraits de code Groupes Projets
Valider e806a865 rédigé par Fil's avatar Fil
Parcourir les fichiers

patches pour les plugins (Cedric)

parent f27075d2
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -39,11 +39,36 @@ function ligne_plug($plug_file,&$plug_actifs,$last_actif = false,$surligne = fal ...@@ -39,11 +39,36 @@ function ligne_plug($plug_file,&$plug_actifs,$last_actif = false,$surligne = fal
$s .= "/!\ $err <br/>"; $s .= "/!\ $err <br/>";
$s .= "</div>"; $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' />&nbsp;";
$s .= bouton_block_invisible("$plug_file"); $s .= bouton_block_invisible("$plug_file");
$s .= ($plugok=='O'?"<strong>":"").$info['nom'].($plugok=='O'?"</strong>":""); $s .= ($plugok=='O'?"<strong>":"").$info['nom'].($plugok=='O'?"</strong>":"");
$s .= "</div>"; $s .= "</div>";
$s .= debut_block_invisible("$plug_file"); $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/>"; $s .= _T("plugin:repertoire_plugin") . " : " . $plug_file . "<br/>";
if (isset($info['description'])) if (isset($info['description']))
...@@ -86,6 +111,7 @@ function ligne_plug($plug_file,&$plug_actifs,$last_actif = false,$surligne = fal ...@@ -86,6 +111,7 @@ function ligne_plug($plug_file,&$plug_actifs,$last_actif = false,$surligne = fal
function admin_plugin(){ function admin_plugin(){
global $connect_statut; global $connect_statut;
global $connect_toutes_rubriques; global $connect_toutes_rubriques;
global $spip_lang_right;
$surligne = ""; $surligne = "";
if ($connect_statut != '0minirezo' OR !$connect_toutes_rubriques) { if ($connect_statut != '0minirezo' OR !$connect_toutes_rubriques) {
......
<? <?php
/***************************************************************************\ /***************************************************************************\
* SPIP, Systeme de publication pour l'internet * * SPIP, Systeme de publication pour l'internet *
...@@ -16,29 +16,17 @@ if (!defined("_ECRIRE_INC_VERSION")) return; ...@@ -16,29 +16,17 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
// //
define('_FILE_PLUGIN_CONFIG', "plugin.xml"); define('_FILE_PLUGIN_CONFIG', "plugin.xml");
// besoin de inc_meta (et aussi de version mais on suppose qu'il est cahrg par ailleurs ...) // besoin de inc_meta
include_ecrire ("inc_db_mysql");
include_ecrire ("inc_meta"); include_ecrire ("inc_meta");
// lecture des sous repertoire plugin existants // lecture des sous repertoire plugin existants
function liste_plugin_files(){ function liste_plugin_files(){
//unset $plugin_files; $plugin_files=array();
$plugin_files=array();// tableau des repertoire de plugin foreach (preg_files(_DIR_PLUGINS, '/plugin[.]xml$') as $plugin) {
if ((@file_exists(_DIR_PLUGINS))&&(is_dir(_DIR_PLUGINS))){ $infos = plugin_get_infos($file);
if ($handle = opendir(_DIR_PLUGINS)) { if (isset($infos['nom']) && isset($infos['version'])
while (false !== ($file = readdir($handle))) { && isset($infos['prefix']))
if ($file != "." && $file != "..") { $plugin_files[]=substr(dirname($plugin), strlen(_DIR_PLUGINS));
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);
}
} }
return $plugin_files; return $plugin_files;
} }
...@@ -52,8 +40,11 @@ function liste_plugin_actifs(){ ...@@ -52,8 +40,11 @@ function liste_plugin_actifs(){
return array(); 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(); $plugin_valides = array();
if (is_array($plugin)){ if (is_array($plugin)){
// charger les infos de plugin en memoire // charger les infos de plugin en memoire
...@@ -87,11 +78,8 @@ function ecrire_plugin_actifs($plugin){ ...@@ -87,11 +78,8 @@ function ecrire_plugin_actifs($plugin){
$s .= '$GLOBALS[\'plugins\'][]=\''.$plug.'\';'."\n"; $s .= '$GLOBALS[\'plugins\'][]=\''.$plug.'\';'."\n";
} }
} }
$filename = _DIR_SESSIONS."charger_plugins_$charge.php"; ecrire_fichier(_DIR_SESSIONS."charger_plugins_$charge.php",
if ($handle = fopen($filename, 'wb')) { $start_file . $s . $end_file);
@fwrite($handle, $start_file . $s . $end_file);
@fclose($handle);
}
} }
if (is_array($infos)){ if (is_array($infos)){
...@@ -99,21 +87,26 @@ function ecrire_plugin_actifs($plugin){ ...@@ -99,21 +87,26 @@ function ecrire_plugin_actifs($plugin){
// $GLOBALS['spip_pipeline'] // $GLOBALS['spip_pipeline']
// $GLOBALS['spip_matrice'] // $GLOBALS['spip_matrice']
foreach($infos as $plug=>$info){ foreach($infos as $plug=>$info){
$class = trim(array_pop($info['class'])); $prefix = "";
$prefix = trim(array_pop($info['prefix']))."_";
foreach($info['pipeline'] as $pipe){ foreach($info['pipeline'] as $pipe){
$nom = trim(array_pop($pipe['nom'])); $nom = trim(array_pop($pipe['nom']));
if (isset($pipe['action'])) if (isset($pipe['action']))
$action = trim(array_pop($pipe['action'])); $action = trim(array_pop($pipe['action']));
else else
$action = $nom; $action = $nom;
$GLOBALS['spip_pipeline'][$nom] .= "|$class::$action"; $GLOBALS['spip_pipeline'][$nom] .= "|$prefix$action";
if (isset($pipe['inclure'])){ if (isset($pipe['inclure'])){
$GLOBALS['spip_matrice']["$class::$action"] = $GLOBALS['spip_matrice']["$prefix$action"] =
"_DIR_PLUGINS$plug/".array_pop($pipe['inclure']); "_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(); pipeline_precompile();
} }
...@@ -121,13 +114,13 @@ function ecrire_plugin_actifs($plugin){ ...@@ -121,13 +114,13 @@ function ecrire_plugin_actifs($plugin){
// precompilsation des pipelines // precompilsation des pipelines
function pipeline_precompile(){ function pipeline_precompile(){
global $spip_pipeline, $spip_matrice; global $spip_pipeline, $spip_matrice;
$nouveaux_pipe=array();
$start_file = "<"."?php\nif (!defined('_ECRIRE_INC_VERSION')) return;\n"; $start_file = "<"."?php\nif (!defined('_ECRIRE_INC_VERSION')) return;\n";
$end_file = "\n?".">"; $end_file = "\n?".">";
$content = "";
foreach($spip_pipeline as $action=>$pipeline){ foreach($spip_pipeline as $action=>$pipeline){
$s_inc = ""; $s_inc = "";
$s_call = "function execute_pipeline_$action(\$val){\n"; $s_call = "";
$pipe = array_filter(explode('|',$pipeline)); $pipe = array_filter(explode('|',$pipeline));
// Eclater le pipeline en filtres et appliquer chaque filtre // Eclater le pipeline en filtres et appliquer chaque filtre
foreach ($pipe as $fonc) { foreach ($pipe as $fonc) {
...@@ -147,28 +140,14 @@ function pipeline_precompile(){ ...@@ -147,28 +140,14 @@ function pipeline_precompile(){
$s_inc .= ');'."\n"; $s_inc .= ');'."\n";
} }
} }
$s_inc .= "\n"; $content .= "// Pipeline $action \n";
$s_call .= "return \$val;\n}\n"; $content .= "function execute_pipeline_$action(\$val){\n";
$filename = _DIR_SESSIONS."charger_pipeline_$action.php"; $content .= $s_inc;
if ($handle = fopen($filename, 'wb')) { $content .= $s_call;
@fwrite($handle, $start_file . $s_inc . $s_call . $end_file); $content .= "return \$val;\n}\n\n";
@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);
} }
ecrire_fichier(_DIR_SESSIONS."charger_pipelines.php",
$start_file . $content . $end_file);
} }
// pas sur que a serve juste au cas o // pas sur que a serve juste au cas o
...@@ -180,11 +159,11 @@ function liste_plugin_inactifs(){ ...@@ -180,11 +159,11 @@ function liste_plugin_inactifs(){
// penser faire une maj du cache => ecrire_meta() // penser faire une maj du cache => ecrire_meta()
// en principe cela doit aussi initialiser la valeur vide si elle n'esite pas // 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 (vrifier dans la doc php) // risque de pb en php5 cause du typage ou de null (vrifier dans la doc php)
function verif_plugin(){ function verif_plugin($pipe_recherche = false){
$plugin_actifs = liste_plugin_actifs(); $plugin_actifs = liste_plugin_actifs();
$plugin_liste = liste_plugin_files(); $plugin_liste = liste_plugin_files();
$plugin_new = array_intersect($plugin_actifs,$plugin_liste); $plugin_new = array_intersect($plugin_actifs,$plugin_liste);
ecrire_plugin_actifs($plugin_new); ecrire_plugin_actifs($plugin_new,$pipe_recherche);
ecrire_metas(); ecrire_metas();
} }
...@@ -273,7 +252,7 @@ function plugin_get_infos($plug){ ...@@ -273,7 +252,7 @@ function plugin_get_infos($plug){
$ret = array(); $ret = array();
if ((@file_exists(_DIR_PLUGINS))&&(is_dir(_DIR_PLUGINS))){ if ((@file_exists(_DIR_PLUGINS))&&(is_dir(_DIR_PLUGINS))){
if (@file_exists(_DIR_PLUGINS."$plug/plugin.xml")) { 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); $arbre = parse_plugin_xml($texte);
if (!isset($arbre['plugin'])&&is_array($arbre['plugin'])) if (!isset($arbre['plugin'])&&is_array($arbre['plugin']))
$arbre = array('erreur' => array(_T('plugin:erreur_plugin_fichier_def_incorrect')." : $plug/plugin.xml")); $arbre = array('erreur' => array(_T('plugin:erreur_plugin_fichier_def_incorrect')." : $plug/plugin.xml"));
...@@ -285,19 +264,21 @@ function plugin_get_infos($plug){ ...@@ -285,19 +264,21 @@ function plugin_get_infos($plug){
plugin_verifie_conformite($plug,$arbre); plugin_verifie_conformite($plug,$arbre);
$ret['nom'] = join(' ',$arbre['nom']); $ret['nom'] = trim(join(' ',$arbre['nom']));
$ret['version'] = array_pop($arbre['version']); $ret['version'] = trim(end($arbre['version']));
if (isset($arbre['auteur'])) if (isset($arbre['auteur']))
$ret['auteur'] = join(',',$arbre['auteur']); $ret['auteur'] = trim(join(',',$arbre['auteur']));
if (isset($arbre['description'])) if (isset($arbre['description']))
$ret['description'] = chaines_lang(join(' ',$arbre['description'])); $ret['description'] = chaines_lang(join(' ',$arbre['description']));
if (isset($arbre['lien'])) if (isset($arbre['lien']))
$ret['lien'] = join(' ',$arbre['lien']); $ret['lien'] = join(' ',$arbre['lien']);
if (isset($arbre['etat']))
$ret['etat'] = trim(end($arbre['etat']));
if (isset($arbre['options'])) if (isset($arbre['options']))
$ret['options'] = $arbre['options']; $ret['options'] = $arbre['options'];
if (isset($arbre['fonctions'])) if (isset($arbre['fonctions']))
$ret['fonctions'] = $arbre['fonctions']; $ret['fonctions'] = $arbre['fonctions'];
$ret['class'] = $arbre['class']; $ret['prefix'] = $arbre['prefix'];
if (isset($arbre['pipeline'])) if (isset($arbre['pipeline']))
$ret['pipeline'] = $arbre['pipeline']; $ret['pipeline'] = $arbre['pipeline'];
if (isset($arbre['erreur'])) if (isset($arbre['erreur']))
...@@ -326,13 +307,19 @@ function plugin_verifie_conformite($plug,&$arbre){ ...@@ -326,13 +307,19 @@ function plugin_verifie_conformite($plug,&$arbre){
$arbre['erreur'][] = _T('plugin:erreur_plugin_version_manquant'); $arbre['erreur'][] = _T('plugin:erreur_plugin_version_manquant');
$arbre['version'] = array(""); $arbre['version'] = array("");
} }
if (!isset($arbre['class'])){ if (!isset($arbre['prefix'])){
if (!$silence) if (!$silence)
$arbre['erreur'][] = _T('plugin:erreur_plugin_class_manquant'); $arbre['erreur'][] = _T('plugin:erreur_plugin_prefix_manquant');
$arbre['class'] = array(""); $arbre['prefix'] = array("");
} }
else{ 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'])){ if (isset($arbre['options'])){
foreach($arbre['options'] as $optfile){ foreach($arbre['options'] as $optfile){
$optfile = trim($optfile); $optfile = trim($optfile);
...@@ -352,7 +339,7 @@ function plugin_verifie_conformite($plug,&$arbre){ ...@@ -352,7 +339,7 @@ function plugin_verifie_conformite($plug,&$arbre){
$fonctions = array(); $fonctions = array();
if (isset($arbre['fonctions'])) if (isset($arbre['fonctions']))
$fonctions = $arbres['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){ foreach($arbre['pipeline'] as $pipe){
$nom = trim(end($pipe['nom'])); $nom = trim(end($pipe['nom']));
if (isset($pipe['action'])) if (isset($pipe['action']))
...@@ -376,4 +363,5 @@ function plugin_verifie_conformite($plug,&$arbre){ ...@@ -376,4 +363,5 @@ function plugin_verifie_conformite($plug,&$arbre){
} }
} }
} }
?>
\ No newline at end of file ?>
...@@ -92,24 +92,34 @@ function minipipe($fonc,$val){ ...@@ -92,24 +92,34 @@ function minipipe($fonc,$val){
// chargement du pipeline sous la forme d'un fichier php prepare // chargement du pipeline sous la forme d'un fichier php prepare
function pipeline($action,$val){ 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){ if (!$ok){
include_ecrire('inc_plugin'); include_ecrire('inc_plugin');
// generer les fichiers php precompiles // generer les fichiers php precompiles
// de chargement des plugins et des pipelines // de chargement des plugins et des pipelines
verif_plugin(); verif_plugin();
$ok = @is_readable($f = _DIR_SESSIONS."charger_pipeline_$action.php"); $ok = @is_readable($f = _DIR_SESSIONS."charger_pipelines.php");
if (!$ok) if (!$ok)
spip_log("generation de $f impossible; pipeline desactives"); spip_log("generation de $f impossible; tous les pipeline desactives");
} }
if ($ok){ if ($ok){
require_once($f); require_once($f);
$f = "execute_pipeline_$action"; $f = "execute_pipeline_$action";
$val = $f($val); $ok = function_exists($f);
// si le flux est une table qui encapsule donnees et autres if ($ok){
// on ne ressort du pipe que les donnees $val = $f($val);
if (is_array($val)&&isset($val['data'])) // si le flux est une table qui encapsule donnees et autres
$val = $val['data']; // 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; return $val;
} }
......
...@@ -11,10 +11,15 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( ...@@ -11,10 +11,15 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'erreur_plugin_tag_plugin_absent' => "&lt;plugin&gt; manquant dans le fichier de definition", 'erreur_plugin_tag_plugin_absent' => "&lt;plugin&gt; manquant dans le fichier de definition",
'erreur_plugin_nom_manquant' => "Nom du plugin manquant", 'erreur_plugin_nom_manquant' => "Nom du plugin manquant",
'erreur_plugin_version_manquant' => "Version du plugin manquante", '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_fichier_absent' => "Fichier absent",
'erreur_plugin_nom_fonction_interdit' => 'Nom de fonction interdit', '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', 'lien_plugin' => 'Lien',
'onglet_plugin' => 'Gestion des plugins', 'onglet_plugin' => 'Gestion des plugins',
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter