/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
- * Copyright (c) 2001-2016 *
+ * Copyright (c) 2001-2017 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
-if (!defined('_ECRIRE_INC_VERSION')) return;
+/**
+ * Gestion de l'installation des plugins
+ *
+ * @package SPIP\Core\Plugins
+ **/
+
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+ return;
+}
/**
* Installe ou retire un plugin
- *
- * Fonction surchargeable permettant d'installer ou retirer un plugin
- * en incluant les fichiers associes et en lancant les fonctions specifiques
- * 1. d'abord sur l'argument 'test',
- * 2. ensuite sur l'action demandee si le test repond False
- * 3. enfin sur l'argument 'test' a nouveau.
- * l'index install_test du tableau resultat est un tableau forme:
- * - du resultat 3
- * - des Echo de l'etape 2
*
- * @param string $plug, nom du plugin
- * @param string $action, nom de l'action (install|uninstall)
- * @param string $dir_type, repertoire du plugin
- *
- * @return array|boolean True si deja installe, le tableau de get_infos sinon
+ * Permet d'installer ou retirer un plugin en incluant les fichiers
+ * associés et en lançant les fonctions spécifiques.
+ *
+ * 1. d'abord sur l'argument `test`,
+ * 2. ensuite sur l'action demandée si le test repond `false`
+ * 3. enfin sur l'argument `test` à nouveau.
+ *
+ * L'index `install_test` du tableau résultat est un tableau formé :
+ *
+ * - du résultat 3
+ * - des echo de l'étape 2
+ *
+ * @note
+ * La fonction quitte (retourne false) si le plugin
+ * n'a pas de version d'installation définie
+ * (information `version_base` dans le paquet.xml)
*
+ * @param string $plug
+ * Nom du plugin
+ * @param string $action
+ * Nom de l'action (install|uninstall)
+ * @param string $dir_type
+ * Répertoire du plugin
+ * @return array|bool
+ * - False si le plugin n'a pas d'installation,
+ * - true si déjà installé,
+ * - le tableau de get_infos sinon
*/
-function plugins_installer_dist($plug, $action, $dir_type='_DIR_PLUGINS')
-{
- $get_infos = charger_fonction('get_infos','plugins');
+function plugins_installer_dist($plug, $action, $dir_type = '_DIR_PLUGINS') {
+ $get_infos = charger_fonction('get_infos', 'plugins');
$infos = $get_infos($plug, false, constant($dir_type));
- if (!isset($infos['install']) OR !$infos['install']) return false;
+ if (!isset($infos['install']) or !$infos['install']) {
+ return false;
+ }
// passer en chemin absolu si possible, c'est plus efficace
- $dir = str_replace('_DIR_','_ROOT_',$dir_type);
- if (!defined($dir)) $dir = $dir_type;
+ $dir = str_replace('_DIR_', '_ROOT_', $dir_type);
+ if (!defined($dir)) {
+ $dir = $dir_type;
+ }
$dir = constant($dir);
- foreach($infos['install'] as $file) {
+ foreach ($infos['install'] as $file) {
$file = $dir . $plug . "/" . trim($file);
- if (file_exists($file)){
+ if (file_exists($file)) {
include_once($file);
}
}
- $version = isset($infos['schema'])?$infos['schema']:'';
- $arg = $infos ;
- $f = $infos['prefix']."_install";
- if (!function_exists($f))
+ $version = isset($infos['schema']) ? $infos['schema'] : '';
+ $arg = $infos;
+ $f = $infos['prefix'] . "_install";
+ if (!function_exists($f)) {
$f = isset($infos['schema']) ? 'spip_plugin_install' : '';
- else
- $arg = $infos['prefix']; // stupide: info deja dans le nom
+ } else {
+ $arg = $infos['prefix'];
+ } // stupide: info deja dans le nom
if (!$f) {
// installation sans operation particuliere
$infos['install_test'] = array(true, '');
- return $infos;
+
+ return $infos;
}
$test = $f('test', $arg, $version);
- if ($action == 'uninstall') $test = !$test;
+ if ($action == 'uninstall') {
+ $test = !$test;
+ }
// Si deja fait, on ne dit rien
- if ($test) return true;
+ if ($test) {
+ return true;
+ }
// Si install et que l'on a la meta d'installation, c'est un upgrade
- if($action == 'install' && !is_null(lire_meta($infos['prefix'].'_base_version')))
+ if ($action == 'install' && !is_null(lire_meta($infos['prefix'] . '_base_version'))) {
$infos['upgrade'] = true;
+ }
// executer l'installation ou l'inverse
// et renvoyer la trace (mais il faudrait passer en AJAX plutot)
- ob_start();
+ ob_start();
$f($action, $arg, $version);
- $aff = ob_get_contents();
+ $aff = ob_get_contents();
ob_end_clean();
// vider le cache des descriptions de tables a chaque (de)installation
$trouver_table = charger_fonction('trouver_table', 'base');
$trouver_table('');
$infos['install_test'] = array($f('test', $arg, $version), $aff);
+
return $infos;
}
// Fonction par defaut pour install/desinstall
-// http://doc.spip.org/@spip_plugin_install
-function spip_plugin_install($action, $infos, $version_cible){
+// http://code.spip.net/@spip_plugin_install
+function spip_plugin_install($action, $infos, $version_cible) {
$prefix = $infos['prefix'];
- if (isset($infos['meta']) AND (($table = $infos['meta']) !== 'meta'))
+ if (isset($infos['meta']) and (($table = $infos['meta']) !== 'meta')) {
$nom_meta = "base_version";
- else {
- $nom_meta = $prefix."_base_version";
+ } else {
+ $nom_meta = $prefix . "_base_version";
$table = 'meta';
}
- switch ($action){
+ switch ($action) {
case 'test':
- return (isset($GLOBALS[$table])
- AND isset($GLOBALS[$table][$nom_meta])
- AND spip_version_compare($GLOBALS[$table][$nom_meta],$version_cible,'>='));
+ return (isset($GLOBALS[$table])
+ and isset($GLOBALS[$table][$nom_meta])
+ and spip_version_compare($GLOBALS[$table][$nom_meta], $version_cible, '>='));
break;
case 'install':
- if (function_exists($upgrade = $prefix."_upgrade"))
+ if (function_exists($upgrade = $prefix . "_upgrade")) {
$upgrade($nom_meta, $version_cible, $table);
+ }
break;
case 'uninstall':
- if (function_exists($vider_tables = $prefix."_vider_tables"))
+ if (function_exists($vider_tables = $prefix . "_vider_tables")) {
$vider_tables($nom_meta, $table);
+ }
break;
}
}
/**
- * Compare 2 numeros de version entre elles.
- *
+ * Compare 2 numéros de version entre elles.
+ *
* Cette fonction est identique (arguments et retours) a la fonction PHP
* version_compare() qu'elle appelle. Cependant, cette fonction reformate
* les numeros de versions pour ameliorer certains usages dans SPIP ou bugs
* dans PHP. On permet ainsi de comparer 3.0.4 à 3.0.* par exemple.
- *
+ *
* @param string $v1
- * Numero de version servant de base a la comparaison.
- * Ce numero ne peut pas comporter d'etoile.
+ * Numero de version servant de base a la comparaison.
+ * Ce numero ne peut pas comporter d'etoile.
* @param string $v2
- * Numero de version a comparer.
- * Il peut posseder des etoiles tel que 3.0.*
+ * Numero de version a comparer.
+ * Il peut posseder des etoiles tel que 3.0.*
* @param string $op
- * Un operateur eventuel (<, >, <=, >=, =, == ...)
+ * Un operateur eventuel (<, >, <=, >=, =, == ...)
* @return int|bool
- * Sans operateur : int. -1 pour inferieur, 0 pour egal, 1 pour superieur
- * Avec operateur : bool.
-**/
-function spip_version_compare($v1,$v2,$op=null){
- $v1 = strtolower(preg_replace(',([0-9])[\s-.]?(dev|alpha|a|beta|b|rc|pl|p),i','\\1.\\2',$v1));
- $v2 = strtolower(preg_replace(',([0-9])[\s-.]?(dev|alpha|a|beta|b|rc|pl|p),i','\\1.\\2',$v2));
- $v1 = str_replace('rc','RC',$v1); // certaines versions de PHP ne comprennent RC qu'en majuscule
- $v2 = str_replace('rc','RC',$v2); // certaines versions de PHP ne comprennent RC qu'en majuscule
-
- $v1 = explode('.',$v1);
- $v2 = explode('.',$v2);
+ * Sans operateur : int. -1 pour inferieur, 0 pour egal, 1 pour superieur
+ * Avec operateur : bool.
+ **/
+function spip_version_compare($v1, $v2, $op = null) {
+ $v1 = strtolower(preg_replace(',([0-9])[\s-.]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v1));
+ $v2 = strtolower(preg_replace(',([0-9])[\s-.]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v2));
+ $v1 = str_replace('rc', 'RC', $v1); // certaines versions de PHP ne comprennent RC qu'en majuscule
+ $v2 = str_replace('rc', 'RC', $v2); // certaines versions de PHP ne comprennent RC qu'en majuscule
+
+ $v1 = explode('.', $v1);
+ $v2 = explode('.', $v2);
// $v1 est toujours une version, donc sans etoile
- while (count($v1)<count($v2))
+ while (count($v1) < count($v2)) {
$v1[] = '0';
+ }
// $v2 peut etre une borne, donc accepte l'etoile
$etoile = false;
foreach ($v1 as $k => $v) {
- if (!isset($v2[$k]))
- $v2[] = ($etoile AND (is_numeric($v) OR $v=='pl' OR $v=='p')) ? $v : '0';
- else if ($v2[$k] == '*') {
- $etoile = true;
- $v2[$k] = $v;
+ if (!isset($v2[$k])) {
+ $v2[] = ($etoile and (is_numeric($v) or $v == 'pl' or $v == 'p')) ? $v : '0';
+ } else {
+ if ($v2[$k] == '*') {
+ $etoile = true;
+ $v2[$k] = $v;
+ }
}
}
- $v1 = implode('.',$v1);
- $v2 = implode('.',$v2);
+ $v1 = implode('.', $v1);
+ $v2 = implode('.', $v2);
- return $op?version_compare($v1, $v2,$op):version_compare($v1, $v2);
+ return $op ? version_compare($v1, $v2, $op) : version_compare($v1, $v2);
}
-// Cette fonction retourne la meta "plugin" deserialisee
-// mais en fait une mise a jour qui aurait du intervenir au chgt de version
-// http://doc.spip.org/@liste_plugin_actifs
-function liste_plugin_actifs(){
- $liste = isset($GLOBALS['meta']['plugin'])?$GLOBALS['meta']['plugin']:'';
- if (!$liste) return array();
- if (!is_array($liste=unserialize($liste))) {
+
+/**
+ * Retourne un tableau des plugins activés sur le site
+ *
+ * Retourne la meta `plugin` désérialisée.
+ * Chaque élément du tableau est lui-même un tableau contenant
+ * les détails du plugin en question : répertoire et version.
+ *
+ * @note
+ * Si le contenu de la meta n’est pas un tableau, cette fonction transforme
+ * l’ancien format en tableau sérialisé pour être conforme au nouveau fonctionnement (SPIP >= 1.9.2)
+ *
+ * @return array Tableau des plugins actifs
+ **/
+function liste_plugin_actifs() {
+ $liste = isset($GLOBALS['meta']['plugin']) ? $GLOBALS['meta']['plugin'] : '';
+ if (!$liste) {
+ return array();
+ }
+ if (!is_array($liste = unserialize($liste))) {
// compatibilite pre 1.9.2, mettre a jour la meta
- spip_log("MAJ meta plugin vieille version : $liste","plugin");
+ spip_log("MAJ meta plugin vieille version : $liste", "plugin");
$new = true;
- list(, $liste) = liste_plugin_valides(explode(",",$liste));
+ list(, $liste) = liste_plugin_valides(explode(",", $liste));
} else {
$new = false;
// compat au moment d'une migration depuis version anterieure
// si pas de dir_type, alors c'est _DIR_PLUGINS
- foreach ($liste as $prefix=>$infos) {
+ foreach ($liste as $prefix => $infos) {
if (!isset($infos['dir_type'])) {
$liste[$prefix]['dir_type'] = "_DIR_PLUGINS";
$new = true;
}
}
}
- if ($new) ecrire_meta('plugin',serialize($liste));
+ if ($new) {
+ ecrire_meta('plugin', serialize($liste));
+ }
+
return $liste;
}
-
-?>