/** * Calcule ou modifie la liste des plugins actifs et recompile les fichiers caches * qui leurs sont relatifs * * @note * Les ecrire_meta() doivent en principe aussi initialiser la valeur a vide * si elle n'existe pas risque de pb en php5 a cause du typage ou de null * (verifier dans la doc php) * * @param string|string[] $plugin * Plugin ou plugins concernés (leur chemin depuis le répertoire plugins) * @param bool $pipe_recherche * ? * @param string $operation * - raz : recalcule tout * - ajoute : ajoute le plugin indiqué à la liste des plugins actifs * - enleve : enleve le plugin indiqué de la liste des plugins actifs * - force : ? * @return bool * true si il y a eu des modifications sur la liste des plugins actifs, false sinon **/ function ecrire_plugin_actifs($plugin, $pipe_recherche = false, $operation = 'raz') { // creer le repertoire cache/ si necessaire ! (installation notamment) $cache = sous_repertoire(_DIR_CACHE, '', false, true); // Si on n'a ni cache accessible, ni connexion SQL, on ne peut pas faire grand chose encore. if (!$cache and !spip_connect()) { return false; } if ($operation != 'raz') { $plugin_valides = liste_chemin_plugin_actifs(); $plugin_valides = is_plugin_dir($plugin_valides); if (defined('_DIR_PLUGINS_SUPPL') && _DIR_PLUGINS_SUPPL) { $plugin_valides_supp = liste_chemin_plugin_actifs(_DIR_PLUGINS_SUPPL); $plugin_valides_supp = is_plugin_dir($plugin_valides_supp, _DIR_PLUGINS_SUPPL); $plugin_valides = array_merge($plugin_valides, $plugin_valides_supp); } // si des plugins sont en attentes (coches mais impossible a activer) // on les reinjecte ici if (isset($GLOBALS['meta']['plugin_attente']) and $a = unserialize($GLOBALS['meta']['plugin_attente'])) { $plugin_valides = $plugin_valides + liste_chemin_plugin($a); } if ($operation == 'ajoute') { $plugin = array_merge($plugin_valides, $plugin); } elseif ($operation == 'enleve') { $plugin = array_diff($plugin_valides, $plugin); } else { $plugin = $plugin_valides; } } $actifs_avant = isset($GLOBALS['meta']['plugin']) ? $GLOBALS['meta']['plugin'] : ''; // si une fonction de gestion de dependances existe, l'appeler ici if ($ajouter_dependances = charger_fonction("ajouter_dependances", "plugins", true)) { $plugin = $ajouter_dependances($plugin); } // recharger le xml des plugins a activer // on forcer le reload ici, meme si le fichier xml n'a pas change // pour ne pas rater l'ajout ou la suppression d'un fichier fonctions/options/administrations // pourra etre evite quand on ne supportera plus les plugin.xml // en deplacant la detection de ces fichiers dans la compilation ci dessous list($infos, $liste) = liste_plugin_valides($plugin, true); // trouver l'ordre d'activation list($plugin_valides, $ordre, $reste) = plugin_trier($infos, $liste); if ($reste) { plugins_erreurs($reste, $liste, $infos); } // Ignorer les plugins necessitant une lib absente // et preparer la meta d'entete Http $err = $msg = $header = array(); foreach ($plugin_valides as $p => $resume) { $header[] = $p . ($resume['version'] ? "(" . $resume['version'] . ")" : ""); if ($resume['dir']) { foreach ($infos[$resume['dir_type']][$resume['dir']]['lib'] as $l) { if (!find_in_path($l['nom'], 'lib/')) { $err[$p] = $resume; $msg[$p][] = $l; unset($plugin_valides[$p]); } } } } if ($err) { plugins_erreurs($err, '', $infos, $msg); } if (isset($GLOBALS['meta']['message_crash_plugins'])) { effacer_meta('message_crash_plugins'); } ecrire_meta('plugin', serialize($plugin_valides)); $liste = array_diff_key($liste, $plugin_valides); ecrire_meta('plugin_attente', serialize($liste)); $header = strtolower(implode(",", $header)); ecrire_meta('plugin_header', substr($header, 0, 900)); if (!isset($GLOBALS['spip_header_silencieux']) or !$GLOBALS['spip_header_silencieux']) { ecrire_fichier(_DIR_VAR . "config.txt", (defined('_HEADER_COMPOSED_BY') ? _HEADER_COMPOSED_BY : "Composed-By: SPIP") . ' ' . $GLOBALS['spip_version_affichee'] . " @ www.spip.net + " . $header); } else { @unlink(_DIR_VAR . "config.txt"); } // generer charger_plugins_chemin.php plugins_precompile_chemin($plugin_valides, $ordre); // generer les fichiers // charger_plugins_options.php // charger_plugins_fonctions.php // et retourner les fichiers a verifier plugins_precompile_xxxtions($plugin_valides, $ordre); // mise a jour de la matrice des pipelines $prepend_code = pipeline_matrice_precompile($plugin_valides, $ordre, $pipe_recherche); // generer le fichier _CACHE_PIPELINE pipeline_precompile($prepend_code); // attendre eventuellement l'invalidation du cache opcode spip_attend_invalidation_opcode_cache(); if (spip_connect()) { // lancer et initialiser les nouveaux crons ! include_spip('inc/genie'); genie_queue_watch_dist(); } return $GLOBALS['meta']['plugin'] != $actifs_avant; }
function ecrire_plugin_actifs($plugin, $pipe_recherche = false, $operation = 'raz') { // creer le repertoire cache/ si necessaire ! (installation notamment) sous_repertoire(_DIR_CACHE, '', false, true); if (!spip_connect()) { return false; } if ($operation != 'raz') { $plugin_valides = liste_chemin_plugin_actifs(); // si des plugins sont en attentes (coches mais impossible a activer) // on les reinjecte ici if (isset($GLOBALS['meta']['plugin_attente']) and $a = unserialize($GLOBALS['meta']['plugin_attente'])) { $plugin_valides = $plugin_valides + liste_chemin_plugin($a); } $plugin_valides = is_plugin_dir($plugin_valides); if ($operation == 'ajoute') { $plugin = array_merge($plugin_valides, $plugin); } elseif ($operation == 'enleve') { $plugin = array_diff($plugin_valides, $plugin); } else { $plugin = $plugin_valides; } } $actifs_avant = $GLOBALS['meta']['plugin']; // recharger le xml des plugins a activer // on forcer le reload ici, meme si le fichier xml n'a pas change // pour ne pas rater l'ajout ou la suppression d'un fichier fonctions/options/administrations // pourra etre evite quand on ne supportera plus les plugin.xml // en deplacant la detection de ces fichiers dans la compilation ci dessous list($infos, $liste) = liste_plugin_valides($plugin, true); // trouver l'ordre d'activation list($plugin_valides, $ordre, $reste) = plugin_trier($infos, $liste); if ($reste) { plugins_erreurs($reste, $liste, $infos); } // Ignorer les plugins necessitant une lib absente // et preparer la meta d'entete Http $err = $msg = $header = array(); foreach ($plugin_valides as $p => $resume) { $header[] = $p . ($resume['version'] ? "(" . $resume['version'] . ")" : ""); if ($resume['dir']) { foreach ($infos[$resume['dir_type']][$resume['dir']]['lib'] as $l) { if (!find_in_path($l['nom'], 'lib/')) { $err[$p] = $resume; $msg[$p][] = $l; unset($plugin_valides[$p]); } } } } if ($err) { plugins_erreurs($err, '', $infos, $msg); } if (isset($GLOBALS['meta']['message_crash_plugins'])) { effacer_meta('message_crash_plugins'); } ecrire_meta('plugin', serialize($plugin_valides)); $liste = array_diff_key($liste, $plugin_valides); ecrire_meta('plugin_attente', serialize($liste)); ecrire_meta('plugin_header', substr(strtolower(implode(",", $header)), 0, 900)); // generer charger_plugins_chemin.php plugins_precompile_chemin($plugin_valides, $ordre); // generer les fichiers // charger_plugins_options.php // charger_plugins_fonctions.php // et retourner les fichiers a verifier plugins_precompile_xxxtions($plugin_valides, $ordre); // mise a jour de la matrice des pipelines pipeline_matrice_precompile($plugin_valides, $ordre, $pipe_recherche); // generer le fichier _CACHE_PIPELINE pipeline_precompile(); // lancer et initialiser les nouveaux crons ! include_spip('inc/genie'); genie_queue_watch_dist(); return $GLOBALS['meta']['plugin'] != $actifs_avant; }