From c83878fca29a1401bc15e9e9b34e36bb718bb953 Mon Sep 17 00:00:00 2001 From: Cerdic <cedric@yterium.com> Date: Thu, 5 Apr 2007 16:38:09 +0000 Subject: [PATCH] "version intermediaire qui supporte dans plugin.xml : <chemin dir='' type='public' version='[1.9250;]' /> permettant de definir explicitement les chemins a ajouter dans le path pour chaque plugin : dir : le chemin relatif par rapport au rep du plugin optionels : type : public ou prive, pour definir un chemin dans un des deux cas uniquement version : pour definir un chemin pour certaines version de spip uniquement Temporairement (ATTENTION, cela sera supprime avant la prochaine release stable) en l'absence de directive chemin dans le plugin.xml, on ajoute le repertoire du plugin dans le path de spip " --- ecrire/inc/plugin.php | 26 +++++++++++--- ecrire/inc/utils.php | 80 ++++++++++++++++++++++++++++++------------- 2 files changed, 77 insertions(+), 29 deletions(-) diff --git a/ecrire/inc/plugin.php b/ecrire/inc/plugin.php index 2f232ac893..563bd73ab2 100644 --- a/ecrire/inc/plugin.php +++ b/ecrire/inc/plugin.php @@ -181,9 +181,18 @@ function ecrire_plugin_actifs($plugin,$pipe_recherche=false,$operation='raz'){ // permet de faire des include_ecrire pour attraper un inc_ du plugin if ($charge=='options'){ $prefix = strtoupper($info['prefix']); - $splugs .= '$GLOBALS[\'plugins\'][]=\''.$plug.'\';'; - $splugs .= "define('_DIR_PLUGIN_$prefix',_DIR_PLUGINS.'$plug/');"; - $splugs .= "\n"; + $splugs .= "define('_DIR_PLUGIN_$prefix',_DIR_PLUGINS.'$plug/');\n"; + foreach($info['path'] as $chemin){ + if (!isset($chemin['version']) OR plugin_version_compatible($chemin['version'],$GLOBALS['spip_version_code'])){ + if (isset($chemin['type'])) + $splugs .= "if (".(($chemin['type']=='public')?"":"!")."_DIR_RESTREINT) "; + $dir = $chemin['dir']; + if (strlen($dir) AND $dir{0}=="/") $dir = substr($dir,1); + $splugs .= "_chemin(_DIR_PLUGIN_$prefix".(strlen($dir)?".'$dir'":"").");\n"; + } + } + //$splugs .= '$GLOBALS[\'plugins\'][]=\''.$plug.'\';'; + //$splugs .= "\n"; } if (isset($info[$charge])){ foreach($info[$charge] as $file){ @@ -482,6 +491,7 @@ function plugin_get_infos($plug, $force_reload=false){ $ret['version_base'] = trim(end($arbre['version_base'])); $ret['necessite'] = $arbre['necessite']; $ret['utilise'] = $arbre['utilise']; + $ret['path'] = $arbre['path']; if ($t=@filemtime($f)){ $ret['filemtime'] = $t; @@ -573,7 +583,6 @@ function plugin_verifie_conformite($plug,&$arbre){ foreach(array_keys($needs) as $tag){ list($tag,$att) = spip_xml_decompose_tag($tag); $necessite[] = $att; - unset($arbre[$tag]); } } $arbre['necessite'] = $necessite; @@ -582,10 +591,17 @@ function plugin_verifie_conformite($plug,&$arbre){ foreach(array_keys($uses) as $tag){ list($tag,$att) = spip_xml_decompose_tag($tag); $utilise[] = $att; - unset($arbre[$tag]); } } $arbre['utilise'] = $utilise; + $path = array(array('dir'=>'')); // initialiser par defaut (provisoire) + if (spip_xml_match_nodes(',^chemin,',$arbre,$paths)){ + foreach(array_keys($paths) as $tag){ + list($tag,$att) = spip_xml_decompose_tag($tag); + $path[] = $att; + } + } + $arbre['path'] = $path; } } // http://doc.spip.org/@plugin_pipeline_props diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php index 2354ed5620..671c87bdc8 100644 --- a/ecrire/inc/utils.php +++ b/ecrire/inc/utils.php @@ -579,46 +579,78 @@ function texte_script($texte) { // // find_in_path() : chercher un fichier nomme x selon le chemin rep1:rep2:rep3 // -// http://doc.spip.org/@creer_chemin -function creer_chemin() { - static $path_a = array(); - static $c = ''; - // on calcule le chemin si le nombre de plugins a change - if ($c != count($GLOBALS['plugins']).$GLOBALS['dossier_squelettes']) { - $c = count($GLOBALS['plugins']).$GLOBALS['dossier_squelettes']; +// la fonction _chemin ajoute un repertoire au chemin courant si un repertoire lui est passe en parametre +// retourne le chemin courant sinon, sous forme de array +// seul le dossier squelette peut etre modifie en dehors de cette fonction, pour raison historique +function _chemin($dir_path=NULL){ + static $path_base = NULL; + static $path_full = NULL; + if ($path_base==NULL){ // Chemin standard depuis l'espace public $path = defined('_SPIP_PATH') ? _SPIP_PATH : _DIR_RACINE.':'. _DIR_RACINE.'dist/:'. _DIR_RESTREINT; - - // Ajouter les repertoires des plugins - if ($GLOBALS['plugins']) - $path = _DIR_PLUGINS - . join(':'._DIR_PLUGINS, $GLOBALS['plugins']) - . ':' . $path; - // Ajouter squelettes/ if (@is_dir(_DIR_RACINE.'squelettes')) $path = _DIR_RACINE.'squelettes/:' . $path; - - // Et le(s) dossier(s) des squelettes nommes - if ($GLOBALS['dossier_squelettes']) - foreach (array_reverse(explode(':', $GLOBALS['dossier_squelettes'])) as $d) - $path = - ($d[0] == '/' ? '' : _DIR_RACINE) . $d . '/:' . $path; - - // nettoyer les / du path - $path_a = array(); foreach (explode(':', $path) as $dir) { if (strlen($dir) AND substr($dir,-1) != '/') $dir .= "/"; - $path_a[] = $dir; + $path_base[] = $dir; } + $path_full = $path_base; + // Et le(s) dossier(s) des squelettes nommes + if (strlen($GLOBALS['dossier_squelettes'])) + foreach (array_reverse(explode(':', $GLOBALS['dossier_squelettes'])) as $d) + array_unshift($path_full, ($d[0] == '/' ? '' : _DIR_RACINE) . $d . '/'); + } + if ($dir_path==NULL) return $path_full; + + if (strlen($dir_path)){ + if ($dir_path{0}!='/') + $dir_path = $dir_path; + if (substr($dir_path,-1) != '/') + $dir_path .= "/"; + if (!in_array($dir_path,$path_base)){ + $tete = ""; + if (reset($path_base)==_DIR_RACINE.'squelettes/') + $tete = array_shift($path_base); + + array_unshift($path_base,$dir_path); + if (strlen($tete)) + array_unshift($path_base,$tete); + } + } + $path_full = $path_base; + // Et le(s) dossier(s) des squelettes nommes + if (strlen($GLOBALS['dossier_squelettes'])) + foreach (array_reverse(explode(':', $GLOBALS['dossier_squelettes'])) as $d) + array_unshift($path_full, ($d[0] == '/' ? '' : _DIR_RACINE) . $d . '/'); + + return $path_full; +} + +// http://doc.spip.org/@creer_chemin +function creer_chemin() { + $path_a = _chemin(); + static $c = ''; + // provisoire, a remplacer par un @unlink sur les fichiers compiles lors d'un prochain upgrade + if (isset($GLOBALS['plugins'])){ + $c = ''; + foreach($GLOBALS['plugins'] as $dir) $path_base = _chemin(_DIR_PLUGINS.$dir); + unset($GLOBALS['plugins']); + } + // on calcule le chemin si le dossier skel a change + if ($c != $GLOBALS['dossier_squelettes']) { + // assurer le non plantage lors de la montee de version : + $c = $GLOBALS['dossier_squelettes']; + $path_a = _chemin(''); // forcer un recalcul du chemin + } return $path_a; } -- GitLab