/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
- * Copyright (c) 2001-2014 *
+ * Copyright (c) 2001-2016 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
}
-
-// Construire la liste des infos strictement necessaires aux plugins a activer
-// afin de les memoriser dans une meta pas trop grosse
-// http://doc.spip.org/@liste_plugin_valides
-function liste_plugin_valides($liste_plug, $force = false)
-{
+/**
+ * Construire la liste des infos strictement necessaires aux plugins a activer
+ * afin de les memoriser dans une meta pas trop grosse
+ * http://code.spip.net/@liste_plugin_valides
+ *
+ * @param array $liste_plug
+ * @param bool $force
+ * @return array
+ */
+function liste_plugin_valides($liste_plug, $force = false){
$liste_ext = liste_plugin_files(_DIR_PLUGINS_DIST);
- $get_infos = charger_fonction('get_infos','plugins');
+ $get_infos = charger_fonction('get_infos', 'plugins');
$infos = array(
// lister les extensions qui sont automatiquement actives
'_DIR_PLUGINS_DIST' => $get_infos($liste_ext, $force, _DIR_PLUGINS_DIST),
'_DIR_PLUGINS' => $get_infos($liste_plug, $force, _DIR_PLUGINS)
- );
+ );
// creer une premiere liste non ordonnee mais qui ne retient
// que les plugins valides, et dans leur derniere version en cas de doublon
- $infos['_DIR_RESTREINT'][''] = $get_infos('./',$force,_DIR_RESTREINT);
+ $infos['_DIR_RESTREINT'][''] = $get_infos('./', $force, _DIR_RESTREINT);
$infos['_DIR_RESTREINT']['SPIP']['version'] = $GLOBALS['spip_version_branche'];
$infos['_DIR_RESTREINT']['SPIP']['chemin'] = array();
- $liste_non_classee = array('SPIP'=>array(
+ $liste_non_classee = array('SPIP' => array(
'nom' => 'SPIP',
'etat' => 'stable',
'version' => $GLOBALS['spip_version_branche'],
'dir_type' => '_DIR_RESTREINT',
- 'dir'=> '',
+ 'dir' => '',
)
);
- foreach($liste_ext as $plug){
- if (isset($infos['_DIR_PLUGINS_DIST'][$plug]))
- plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS_DIST');
+ foreach ($liste_ext as $plug){
+ if (isset($infos['_DIR_PLUGINS_DIST'][$plug]))
+ plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS_DIST');
}
- foreach($liste_plug as $plug) {
- if (isset($infos['_DIR_PLUGINS'][$plug]))
- plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS');
+ foreach ($liste_plug as $plug){
+ if (isset($infos['_DIR_PLUGINS'][$plug]))
+ plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS');
}
- if (defined('_DIR_PLUGINS_SUPPL') and _DIR_PLUGINS_SUPPL) {
+ if (defined('_DIR_PLUGINS_SUPPL') and _DIR_PLUGINS_SUPPL){
$infos['_DIR_PLUGINS_SUPPL'] = $get_infos($liste_plug, false, _DIR_PLUGINS_SUPPL);
- foreach($liste_plug as $plug) {
+ foreach ($liste_plug as $plug){
if (isset($infos['_DIR_PLUGINS_SUPPL'][$plug]))
plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS_SUPPL');
}
}
- // les procure de core.xml sont consideres comme des plugins proposes,
- // mais surchargeables (on peut activer un plugin qui procure ca pour l'ameliorer,
- // donc avec le meme prefixe)
- foreach($infos['_DIR_RESTREINT']['']['procure'] as $procure) {
- $p = strtoupper($procure['nom']);
- if (!isset($liste_non_classee[$p])){
- $procure['etat'] = '?';
- $procure['dir_type'] = '_DIR_RESTREINT';
- $procure['dir'] = '';
- $liste_non_classee[$p] = $procure;
- }
- }
+ plugin_fixer_procure($liste_non_classee, $infos);
return array($infos, $liste_non_classee);
}
-// Ne retenir un plugin que s'il est valide
-// et dans leur plus recente version compatible
-// avec la version presente de SPIP
-
-function plugin_valide_resume(&$liste, $plug, $infos, $dir)
-{
- $i = $infos[$dir][$plug];
+/**
+ * Ne retenir un plugin que s'il est valide
+ * et dans leur plus recente version compatible
+ * avec la version presente de SPIP
+ *
+ * @param array $liste
+ * @param string $plug
+ * @param array $infos
+ * @param string $dir_type
+ */
+function plugin_valide_resume(&$liste, $plug, $infos, $dir_type){
+ $i = $infos[$dir_type][$plug];
if (isset($i['erreur']) AND $i['erreur'])
return;
- if (!plugin_version_compatible($i['compatibilite'], $GLOBALS['spip_version_branche'],'spip'))
+ if (!plugin_version_compatible($i['compatibilite'], $GLOBALS['spip_version_branche'], 'spip'))
return;
$p = strtoupper($i['prefix']);
if (!isset($liste[$p])
- OR spip_version_compare($i['version'],$liste[$p]['version'],'>')) {
+ OR spip_version_compare($i['version'], $liste[$p]['version'], '>')
+ ){
$liste[$p] = array(
'nom' => $i['nom'],
'etat' => $i['etat'],
- 'version'=> $i['version'],
- 'dir'=> $plug,
- 'dir_type' => $dir
- );
+ 'version' => $i['version'],
+ 'dir' => $plug,
+ 'dir_type' => $dir_type
+ );
+ }
+}
+
+/**
+ * Completer la liste des plugins avec les eventuels procure
+ *
+ * les <procure> sont consideres comme des plugins proposes,
+ * mais surchargeables (on peut activer un plugin qui procure ca pour l'ameliorer,
+ * donc avec le meme prefixe, qui sera pris en compte si il a une version plus grande)
+ *
+ * @param array $liste
+ * @param array $infos
+ */
+function plugin_fixer_procure(&$liste, &$infos){
+ foreach($liste as $p=>$resume){
+ $i = $infos[$resume['dir_type']][$resume['dir']];
+ if (isset($i['procure']) AND $i['procure']){
+ foreach($i['procure'] as $procure){
+ $p = strtoupper($procure['nom']);
+ $dir = $resume['dir'];
+ if ($dir) $dir .= "/";
+ $dir .= "procure:".$procure['nom'];
+
+ $procure['etat'] = '?';
+ $procure['dir_type'] = $resume['dir_type'];
+ $procure['dir'] = $dir;
+
+ // si ce plugin n'est pas deja procure, ou dans une version plus ancienne
+ // on ajoute cette version a la liste
+ if (!isset($liste[$p])
+ OR spip_version_compare($procure['version'], $liste[$p]['version'], '>')
+ ){
+ $liste[$p] = $procure;
+
+ // on fournit une information minimale pour ne pas perturber la compilation
+ $infos[$resume['dir_type']][$dir] = array(
+ 'prefix' => $procure['nom'],
+ 'nom' => $procure['nom'],
+ 'etat' => $procure['etat'],
+ 'version' => $procure['version'],
+ 'chemin' => array(),
+ 'necessite' => array(),
+ 'utilise' => array(),
+ 'lib' => array(),
+ 'menu' => array(),
+ 'onglet' => array(),
+ 'procure' => array(),
+ );
+ }
+ }
}
+ }
}
/**
// donc ni sa relecture, ni sa detection
if (!isset($info[$charge])
AND $dir // exclure le cas du plugin "SPIP"
+ AND strpos($dir,":")===false // exclure le cas des procure:
AND file_exists("$dir$plug/paquet.xml") // uniquement pour les paquet.xml
){
if (is_readable("$dir$plug/".($file=$info['prefix']."_".$charge.".php"))){