From cc8b2b1c3b8df21184d504389d83e718d903e38c Mon Sep 17 00:00:00 2001 From: Cerdic <cedric@yterium.com> Date: Wed, 20 Jan 2010 08:19:21 +0000 Subject: [PATCH] suite du decoupage de inc/plugins : report des fonctions a jour dans les fichiers de plugins/ propagation des charger_fonction partout ou c'est necessaire --- ecrire/action/desinstaller_plugin.php | 3 +- ecrire/exec/admin_plugin.php | 6 +- ecrire/exec/info_plugin.php | 3 +- ecrire/inc/bandeau.php | 32 +--- ecrire/inc/plugin.php | 248 +------------------------- ecrire/plugins/extraire_pipelines.php | 2 +- ecrire/plugins/get_infos.php | 10 +- ecrire/plugins/verifie_conformite.php | 23 ++- 8 files changed, 43 insertions(+), 284 deletions(-) diff --git a/ecrire/action/desinstaller_plugin.php b/ecrire/action/desinstaller_plugin.php index 3ef8aa8065..7eb5480e3e 100644 --- a/ecrire/action/desinstaller_plugin.php +++ b/ecrire/action/desinstaller_plugin.php @@ -18,7 +18,8 @@ function action_desinstaller_plugin_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); $plug_file = $securiser_action(); - $infos = plugin_get_infos($plug_file); + $get_infos = charger_fonction('get_infos','plugins'); + $infos = $get_infos($plug_file); if (isset($infos['install'])){ // desinstaller $etat = desinstalle_un_plugin($plug_file,$infos); diff --git a/ecrire/exec/admin_plugin.php b/ecrire/exec/admin_plugin.php index bbb827c7f1..f13919fa3f 100644 --- a/ecrire/exec/admin_plugin.php +++ b/ecrire/exec/admin_plugin.php @@ -170,13 +170,14 @@ function exec_admin_plugin_dist($retour='') { // http://doc.spip.org/@affiche_les_plugins function affiche_les_plugins($liste_plugins, $liste_plugins_actifs, $format='arbre'){ + $get_infos = charger_fonction('get_infos','plugins'); # (spip_timer('cachexml')); if ($format=='liste'){ $liste_plugins = array_flip($liste_plugins); foreach(array_keys($liste_plugins) as $chemin) { - $info = plugin_get_infos($chemin); + $info = $get_infos($chemin); $liste_plugins[$chemin] = strtoupper(trim(typo(translitteration(unicode2charset(html2unicode($info['nom'])))))); } asort($liste_plugins); @@ -361,7 +362,8 @@ function ligne_plug($plug_file, $actif, $id){ $erreur = false; $s = ""; - $info = plugin_get_infos($plug_file); + $get_infos = charger_fonction('get_infos','plugins'); + $info = $get_infos($plug_file); // plug pour CFG if ($actif diff --git a/ecrire/exec/info_plugin.php b/ecrire/exec/info_plugin.php index 6110b9ac75..e781bc4fe5 100644 --- a/ecrire/exec/info_plugin.php +++ b/ecrire/exec/info_plugin.php @@ -12,7 +12,8 @@ function exec_info_plugin_dist() { echo minipres(); } else { $plug = _request('plugin'); - $info = plugin_get_infos($plug); + $get_infos = charger_fonction('get_infos','plugins'); + $info = $get_infos($plug); ajax_retour(affiche_bloc_plugin($plug, $info)); } } diff --git a/ecrire/inc/bandeau.php b/ecrire/inc/bandeau.php index 66e3268676..b14ba85b50 100644 --- a/ecrire/inc/bandeau.php +++ b/ecrire/inc/bandeau.php @@ -30,35 +30,6 @@ function definir_barre_contexte(){ return $contexte; } - -function boutons_parse($arbre){ - $ret = array('bouton'=>array(),'onglet'=>array()); - // recuperer les boutons et onglets si necessaire - spip_xml_match_nodes(",^(bouton|onglet)\s,",$arbre,$les_boutons); - if (is_array($les_boutons) && count($les_boutons)){ - $ret['bouton'] = array(); - $ret['onglet'] = array(); - foreach($les_boutons as $bouton => $val) { - $bouton = spip_xml_decompose_tag($bouton); - $type = reset($bouton); - $bouton = end($bouton); - if (isset($bouton['id'])){ - $id = $bouton['id']; - $val = reset($val); - if(is_array($val)){ - $ret[$type][$id]['parent'] = isset($bouton['parent'])?$bouton['parent']:''; - $ret[$type][$id]['position'] = isset($bouton['position'])?$bouton['position']:''; - $ret[$type][$id]['titre'] = isset($val['titre'])?trim(spip_xml_aplatit($val['titre'])):''; - $ret[$type][$id]['icone'] = isset($val['icone'])?trim(end($val['icone'])):''; - $ret[$type][$id]['url'] = isset($val['url'])?trim(end($val['url'])):''; - $ret[$type][$id]['args'] = isset($val['args'])?trim(end($val['args'])):''; - } - } - } - } - return $ret; -} - /** * Construire le tableau qui correspond aux boutons du core * decrits dans prive/navigation.xml @@ -71,9 +42,10 @@ function boutons_core($type='bouton'){ if ( !is_array($ret) /*OR $GLOBALS['var_mode']='recalcul'*/){ + $extraire_boutons = charger_fonction('extraire_boutons','plugins'); include_spip('inc/xml'); $xml = spip_xml_load(find_in_path("prive/navigation.xml")); - $ret = boutons_parse($xml); + $ret = $extraire_boutons($xml); } return $ret[$type]; diff --git a/ecrire/inc/plugin.php b/ecrire/inc/plugin.php index 0adeb88f5c..84b50e2810 100644 --- a/ecrire/inc/plugin.php +++ b/ecrire/inc/plugin.php @@ -169,10 +169,12 @@ function liste_plugin_valides($liste_plug, $force = false){ // que les plugins valides, et dans leur derniere version en cas de doublon $liste_non_classee = array(); + $get_infos = charger_fonction('get_infos','plugins'); + foreach($listes as $dir_type=>$l){ foreach($l as $k=>$plug) { // renseigner ce plugin - $infos[$dir_type][$plug] = plugin_get_infos($plug,$force,constant($dir_type)); + $infos[$dir_type][$plug] = $get_infos($plug,$force,constant($dir_type)); // si il n'y a pas d'erreur if (!isset($infos[$dir_type][$plug]['erreur'])) { // regarder si on a pas deja selectionne le meme plugin dans une autre version @@ -610,10 +612,12 @@ function installe_un_plugin($plug,$infos,$dir_plugins = '_DIR_PLUGINS'){ function installe_plugins(){ $meta_plug_installes = array(); $liste = liste_plugin_actifs(); + $get_infos = charger_fonction('get_infos','plugins'); + foreach ($liste as $prefix=>$resume) { $plug = $resume['dir']; $dir_type = $resume['dir_type']; - $infos = plugin_get_infos($plug,false,constant($dir_type)); + $infos = $get_infos($plug,false,constant($dir_type)); if (isset($infos['install'])){ $ok = installe_un_plugin($plug,$infos,$dir_type); // on peut enregistrer le chemin ici car il est mis a jour juste avant l'affichage @@ -632,246 +636,6 @@ function plugin_est_installe($plug_path){ return in_array($plug_path,$plugin_installes); } -// lecture du fichier de configuration d'un plugin -// http://doc.spip.org/@plugin_get_infos -function plugin_get_infos($plug, $force_reload=false, $dir_plugins = _DIR_PLUGINS){ - static $infos=array(); - static $plugin_xml_cache=NULL; - include_spip('inc/xml'); - if (!isset($infos[$dir_plugins][$plug]) OR $force_reload){ - if ($plugin_xml_cache==NULL){ - $plugin_xml_cache = array(); - if (is_file($f=_DIR_TMP."plugin_xml_cache.gz")){ - lire_fichier($f,$contenu); - $plugin_xml_cache = unserialize($contenu); - if (!is_array($plugin_xml_cache)) $plugin_xml_cache = array(); - } - } - $ret = array(); - if (isset($plugin_xml_cache[$dir_plugins][$plug])){ - $info = $plugin_xml_cache[$dir_plugins][$plug]; - if (!$force_reload - AND isset($info['filemtime']) - AND @file_exists($f = $dir_plugins."$plug/plugin.xml") - AND (@filemtime($f)<=$info['filemtime'])) - $ret = $info; - } - if (!count($ret)){ - if ((@file_exists($dir_plugins))&&(is_dir($dir_plugins))){ - if (@file_exists($f = $dir_plugins."$plug/plugin.xml")) { - $arbre = spip_xml_load($f); - if (!$arbre OR !isset($arbre['plugin']) OR !is_array($arbre['plugin'])) - $arbre = array('erreur' => array(_T('erreur_plugin_fichier_def_incorrect')." : $plug/plugin.xml")); - } - else { - // pour arriver ici on l'a vraiment cherche... - $arbre = array('erreur' => array(_T('erreur_plugin_fichier_def_absent')." : $plug/plugin.xml")); - } - plugin_verifie_conformite($plug,$arbre,$dir_plugins); - - $ret['nom'] = charset2unicode(spip_xml_aplatit($arbre['nom'])); - $ret['version'] = trim(end($arbre['version'])); - if (isset($arbre['auteur'])) - $ret['auteur'] = spip_xml_aplatit($arbre['auteur']); - if (isset($arbre['icon'])) - $ret['icon'] = spip_xml_aplatit($arbre['icon']); - if (isset($arbre['description'])) - $ret['description'] = spip_xml_aplatit($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['licence'])) - $ret['licence'] = spip_xml_aplatit($arbre['licence']); - if (isset($arbre['install'])) - $ret['install'] = $arbre['install']; - if (isset($arbre['fonctions'])) - $ret['fonctions'] = $arbre['fonctions']; - $ret['prefix'] = trim(array_pop($arbre['prefix'])); - if (isset($arbre['pipeline'])) - $ret['pipeline'] = $arbre['pipeline']; - if (isset($arbre['erreur'])) - $ret['erreur'] = $arbre['erreur']; - if (isset($arbre['version_base'])) - $ret['version_base'] = trim(end($arbre['version_base'])); - $ret['necessite'] = $arbre['necessite']; - $ret['utilise'] = $arbre['utilise']; - $ret['path'] = $arbre['path']; - if (isset($arbre['noisette'])) - $ret['noisette'] = $arbre['noisette']; - - include_spip('inc/bandeau'); - $les_boutons = boutons_parse($arbre); - $ret['bouton'] = $les_boutons['bouton']; - $ret['onglet'] = $les_boutons['onglet']; - - if ($t=@filemtime($f)){ - $ret['filemtime'] = $t; - $plugin_xml_cache[$dir_plugins][$plug]=$ret; - ecrire_fichier(_DIR_TMP."plugin_xml_cache.gz",serialize($plugin_xml_cache)); - } - } - } - $infos[$dir_plugins][$plug] = $ret; - } - - return $infos[$dir_plugins][$plug]; -} - -// http://doc.spip.org/@plugin_verifie_conformite -function plugin_verifie_conformite($plug, &$arbre, $dir_plugins = _DIR_PLUGINS){ - $silence = false; - $p = null; - // chercher la declaration <plugin spip='...'> a prendre pour cette version de SPIP - if ($n = spip_xml_match_nodes(",^plugin(\s|$),", $arbre, $matches)){ - // version de SPIP - $vspip = $GLOBALS['spip_version_branche'].".".$GLOBALS['spip_version_code']; - foreach($matches as $tag=>$sous){ - list($tagname,$atts) = spip_xml_decompose_tag($tag); - if ($tagname=='plugin' AND is_array($sous)){ - if (!isset($atts['spip']) - OR plugin_version_compatible($atts['spip'],$vspip)) - // on prend la derniere declaration avec ce nom - $p = end($sous); - } - } - } - if (is_null($p)){ - $arbre = array('erreur' => array(_T('erreur_plugin_tag_plugin_absent')." : $plug/plugin.xml")); - $silence = true; - } - else - $arbre = $p; - if (!is_array($arbre)) $arbre = array(); - // verification de la conformite du plugin avec quelques - // precautions elementaires - if (!isset($arbre['nom'])){ - if (!$silence) - $arbre['erreur'][] = _T('erreur_plugin_nom_manquant'); - $arbre['nom'] = array(""); - } - if (!isset($arbre['version'])){ - if (!$silence) - $arbre['erreur'][] = _T('erreur_plugin_version_manquant'); - $arbre['version'] = array(""); - } - if (!isset($arbre['prefix'])){ - if (!$silence) - $arbre['erreur'][] = _T('erreur_plugin_prefix_manquant'); - $arbre['prefix'] = array(""); - } - else{ - $prefix = ""; - $prefix = trim(end($arbre['prefix'])); - if (strtoupper($prefix)=='SPIP'){ - $arbre['erreur'][] = _T('erreur_plugin_prefix_interdit'); - } - if (isset($arbre['etat'])){ - $etat = trim(end($arbre['etat'])); - if (!in_array($etat,array('dev','experimental','test','stable'))) - $arbre['erreur'][] = _T('erreur_plugin_etat_inconnu')." : $etat"; - } - if (isset($arbre['options'])){ - foreach($arbre['options'] as $optfile){ - $optfile = trim($optfile); - if (!@is_readable($dir_plugins."$plug/$optfile")) - if (!$silence) - $arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $optfile"; - } - } - if (isset($arbre['fonctions'])){ - foreach($arbre['fonctions'] as $optfile){ - $optfile = trim($optfile); - if (!@is_readable($dir_plugins."$plug/$optfile")) - if (!$silence) - $arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $optfile"; - } - } - $fonctions = array(); - if (isset($arbre['fonctions'])) - $fonctions = $arbre['fonctions']; - $liste_methodes_reservees = array('__construct','__destruct','plugin','install','uninstall',strtolower($prefix)); - plugin_pipeline_props($arbre); - foreach($arbre['pipeline'] as $pipe){ - if (!isset($pipe['nom'])) - if (!$silence) - $arbre['erreur'][] = _T("erreur_plugin_nom_pipeline_non_defini"); - if (isset($pipe['action'])) $action = $pipe['action']; - else $action = $pipe['nom']; - // verif que la methode a un nom autorise - if (in_array(strtolower($action),$liste_methodes_reservees)){ - if (!$silence) - $arbre['erreur'][] = _T("erreur_plugin_nom_fonction_interdit")." : $action"; - } - if (isset($pipe['inclure'])) { - $inclure = $dir_plugins."$plug/".$pipe['inclure']; - if (!@is_readable($inclure)) - if (!$silence) - $arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $inclure"; - } - } - $necessite = array(); - if (spip_xml_match_nodes(',^necessite,',$arbre,$needs)){ - foreach(array_keys($needs) as $tag){ - list($tag,$att) = spip_xml_decompose_tag($tag); - $necessite[] = $att; - } - } - $arbre['necessite'] = $necessite; - $utilise = array(); - if (spip_xml_match_nodes(',^utilise,',$arbre,$uses)){ - foreach(array_keys($uses) as $tag){ - list($tag,$att) = spip_xml_decompose_tag($tag); - $utilise[] = $att; - } - } - $arbre['utilise'] = $utilise; - $path = array(); - if (spip_xml_match_nodes(',^chemin,',$arbre,$paths)){ - foreach(array_keys($paths) as $tag){ - list($tag,$att) = spip_xml_decompose_tag($tag); - $path[] = $att; - } - } - else - $path = array(array('dir'=>'')); // initialiser par defaut - $arbre['path'] = $path; - // exposer les noisettes - if (isset($arbre['noisette'])){ - foreach($arbre['noisette'] as $k=>$nut){ - $nut = preg_replace(',[.]html$,uims','',trim($nut)); - $arbre['noisette'][$k] = $nut; - if (!@is_readable($dir_plugins."$plug/$nut.html")) - if (!$silence) - $arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $nut"; - } - } - } -} -// http://doc.spip.org/@plugin_pipeline_props -function plugin_pipeline_props(&$arbre){ - $pipeline = array(); - if (spip_xml_match_nodes(',^pipeline,',$arbre,$pipes)){ - foreach($pipes as $tag=>$p){ - if (!is_array($p[0])){ - list($tag,$att) = spip_xml_decompose_tag($tag); - $pipeline[] = $att; - } - else foreach($p as $pipe){ - $att = array(); - if (is_array($pipe)) - foreach($pipe as $k=>$t) - $att[$k] = trim(end($t)); - $pipeline[] = $att; - } - } - unset($arbre[$tag]); - } - $arbre['pipeline'] = $pipeline; -} - // http://doc.spip.org/@verifie_include_plugins function verifie_include_plugins() { ecrire_meta('message_crash_plugins', 1); diff --git a/ecrire/plugins/extraire_pipelines.php b/ecrire/plugins/extraire_pipelines.php index 9f1bede297..c781454f9b 100644 --- a/ecrire/plugins/extraire_pipelines.php +++ b/ecrire/plugins/extraire_pipelines.php @@ -36,7 +36,7 @@ function plugins_extraire_pipelines_dist(&$arbre){ } unset($arbre[$tag]); } - + return $pipeline; } diff --git a/ecrire/plugins/get_infos.php b/ecrire/plugins/get_infos.php index 501a391da4..ed00c80e50 100644 --- a/ecrire/plugins/get_infos.php +++ b/ecrire/plugins/get_infos.php @@ -26,10 +26,11 @@ function plugins_get_infos_dist($plug, $force_reload=false, $dir_plugins = _DIR_ include_spip('inc/xml'); static $infos=array(); static $plugin_xml_cache=NULL; + include_spip('inc/xml'); if (!isset($infos[$dir_plugins][$plug]) OR $force_reload){ if ($plugin_xml_cache==NULL){ $plugin_xml_cache = array(); - if (is_file($f=_DIR_TMP."plugin_xml.cache")){ + if (is_file($f=_DIR_TMP."plugin_xml_cache.gz")){ lire_fichier($f,$contenu); $plugin_xml_cache = unserialize($contenu); if (!is_array($plugin_xml_cache)) $plugin_xml_cache = array(); @@ -45,7 +46,7 @@ function plugins_get_infos_dist($plug, $force_reload=false, $dir_plugins = _DIR_ $ret = $info; } if (!count($ret)){ - if ((@file_exists($dir_plugins))&&(is_dir($dir_plugins))){ + if ((@file_exists($dir_plugins))&&(is_dir($dir_plugins))){ if (@file_exists($f = $dir_plugins."$plug/plugin.xml")) { $arbre = spip_xml_load($f); if (!$arbre OR !isset($arbre['plugin']) OR !is_array($arbre['plugin'])) @@ -99,13 +100,14 @@ function plugins_get_infos_dist($plug, $force_reload=false, $dir_plugins = _DIR_ if ($t=@filemtime($f)){ $ret['filemtime'] = $t; - $plugin_xml_cache[$plug]=$ret; - ecrire_fichier(_DIR_TMP."plugin_xml.cache",serialize($plugin_xml_cache)); + $plugin_xml_cache[$dir_plugins][$plug]=$ret; + ecrire_fichier(_DIR_TMP."plugin_xml_cache.gz",serialize($plugin_xml_cache)); } } } $infos[$dir_plugins][$plug] = $ret; } + return $infos[$dir_plugins][$plug]; } diff --git a/ecrire/plugins/verifie_conformite.php b/ecrire/plugins/verifie_conformite.php index f77218a1ea..6c4d1b8f60 100644 --- a/ecrire/plugins/verifie_conformite.php +++ b/ecrire/plugins/verifie_conformite.php @@ -12,16 +12,33 @@ if (!defined("_ECRIRE_INC_VERSION")) return; +include_spip('inc/xml'); +include_spip('inc/plugin'); // http://doc.spip.org/@plugin_verifie_conformite function plugins_verifie_conformite_dist($plug, &$arbre, $dir_plugins = _DIR_PLUGINS){ $silence = false; - if (isset($arbre['plugin']) AND is_array($arbre['plugin'])) - $arbre = end($arbre['plugin']); // derniere def plugin - else{ + $p = null; + // chercher la declaration <plugin spip='...'> a prendre pour cette version de SPIP + if ($n = spip_xml_match_nodes(",^plugin(\s|$),", $arbre, $matches)){ + // version de SPIP + $vspip = $GLOBALS['spip_version_branche'].".".$GLOBALS['spip_version_code']; + foreach($matches as $tag=>$sous){ + list($tagname,$atts) = spip_xml_decompose_tag($tag); + if ($tagname=='plugin' AND is_array($sous)){ + if (!isset($atts['spip']) + OR plugin_version_compatible($atts['spip'],$vspip)) + // on prend la derniere declaration avec ce nom + $p = end($sous); + } + } + } + if (is_null($p)){ $arbre = array('erreur' => array(_T('erreur_plugin_tag_plugin_absent')." : $plug/plugin.xml")); $silence = true; } + else + $arbre = $p; if (!is_array($arbre)) $arbre = array(); // verification de la conformite du plugin avec quelques // precautions elementaires -- GitLab