Exemplo n.º 1
0
Arquivo: plugin.php Projeto: spip/SPIP
/**
 * 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;
}
Exemplo n.º 2
0
/**
 * Affichage spécifique de la page de gestion des plugins 
 *
 * Affiche la liste des plugins demandés et les erreurs éventuelles.
 *
 * @uses plugin_donne_erreurs()
 * @uses liste_chemin_plugin()
 * @uses plugin_installes_meta()
 * @uses affiche_les_plugins_verrouilles()
 * 
 * @pipeline_appel affiche_gauche
 * @pipeline_appel affiche_droit
 * @pipeline_appel affiche_milieu
 * 
 * @param string $quoi
 *     Quels plugins afficher ? actifs, ou autre
 * @param string $erreur
 *     Erreur éventuelle à afficher
 * @param string $format
 *     Format d'affichage (liste ou arborescence)
**/
function admin_plug_args($quoi, $erreur, $format)
{
    if (!$quoi) {
        $quoi = 'actifs';
    }
    // empecher l'affichage des erreurs dans le bandeau, on le donne ensuite
    // format brut par plugin
    $GLOBALS['erreurs_activation_raw'] = plugin_donne_erreurs(true, false);
    // format resume mis en forme
    $erreur_activation = plugin_donne_erreurs();
    $commencer_page = charger_fonction('commencer_page', 'inc');
    echo $commencer_page(_T('icone_admin_plugin'), "configuration", "plugin");
    echo debut_gauche('plugin', true);
    echo recuperer_fond('prive/squelettes/navigation/configurer', array('exec' => 'admin_plugin'));
    echo pipeline('affiche_gauche', array('args' => array('exec' => 'admin_plugin'), 'data' => afficher_librairies()));
    echo debut_droite('plugin', true);
    echo gros_titre(_T('icone_admin_plugin'), '', false);
    // Barre d'onglets de premier niveau
    echo barre_onglets("plugins", "plugins_actifs");
    // Barre d'onglets de second niveau
    $onglet2 = $quoi == 'actifs' ? 'plugins_actifs' : 'admin_plugin';
    echo debut_onglet('onglets_simple second');
    echo onglet(_T('plugins_tous_liste'), generer_url_ecrire("admin_plugin", "voir=tous"), 'admin_plugin', $onglet2);
    echo onglet(_T('plugins_actifs_liste'), generer_url_ecrire("admin_plugin"), 'plugins_actifs', $onglet2);
    echo fin_onglet();
    // message d'erreur au retour d'une operation
    if ($erreur) {
        echo "<div class='error'>{$erreur}</div>";
    }
    if ($erreur_activation) {
        echo "<div class='error'>{$erreur_activation}</div>";
    }
    // la mise a jour de cette meta a ete faite par ecrire_plugin_actifs
    $actifs = unserialize($GLOBALS['meta']['plugin']);
    $lcpa = $actifs + unserialize($GLOBALS['meta']['plugin_attente']);
    // Les affichages se basent sur le repertoire, pas sur le nom
    $actifs = liste_chemin_plugin($actifs, '');
    if (defined('_DIR_PLUGINS_SUPPL')) {
        $lcpas = liste_chemin_plugin($lcpa, _DIR_PLUGINS_SUPPL);
    }
    $lcpa = liste_chemin_plugin($lcpa);
    // on installe les plugins maintenant,
    // cela permet aux scripts d'install de faire des affichages (moches...)
    plugin_installes_meta();
    echo "<div class='liste-plugins formulaire_spip'>";
    echo debut_cadre_trait_couleur('plugin-24.png', true, '', _T('plugins_liste'), 'plugins');
    if ($quoi !== 'actifs') {
        $lpf = liste_plugin_files();
        if ($lpf) {
            echo "<p>" . _T('texte_presente_plugin') . "</p>";
        } else {
            if (!@is_dir(_DIR_PLUGINS)) {
                echo "<p>" . _T('plugin_info_automatique_ftp', array('rep' => joli_repertoire(_DIR_PLUGINS))) . " &mdash; " . _T('plugin_info_automatique_creer') . "</p>";
            }
        }
        $lcpaffiche = $lpf;
        if (defined('_DIR_PLUGINS_SUPPL')) {
            $lcpaffichesup = liste_plugin_files(_DIR_PLUGINS_SUPPL);
        }
    } else {
        // la liste
        // $quoi=='actifs'
        $lcpaffiche = $lcpa;
        if (defined('_DIR_PLUGINS_SUPPL')) {
            $lcpaffichesup = $lcpas;
        }
    }
    if ($quoi == 'actifs' or $lpf) {
        $nb = count($lcpa);
        if (defined('_DIR_PLUGINS_SUPPL')) {
            $nb += count($lcpas);
        }
        echo "<h3>" . sinon(singulier_ou_pluriel($nb, 'plugins_actif_un', 'plugins_actifs', 'count'), _T('plugins_actif_aucun')) . "</h3>";
    }
    if (empty($format)) {
        $format = 'liste';
    } elseif (!in_array($format, array('liste', 'repertoires'))) {
        $format = 'repertoires';
    }
    $afficher = charger_fonction("afficher_{$format}", 'plugins');
    $corps = $afficher(self(), $lcpaffiche, $lcpa, $actifs);
    if (defined('_DIR_PLUGINS_SUPPL')) {
        $corps .= $afficher(self(), $lcpaffichesup, $lcpas, $actifs, _DIR_PLUGINS_SUPPL);
    }
    if ($corps) {
        $corps .= "\n<div class='boutons' style='display:none;'>" . "<input type='submit' class='submit save' value='" . _T('bouton_enregistrer') . "' />" . "</div>";
    }
    echo redirige_action_post('activer_plugins', 'activer', 'admin_plugin', '', $corps);
    echo fin_cadre_trait_couleur(true);
    if ($quoi == 'actifs') {
        echo affiche_les_plugins_verrouilles($actifs);
    }
    echo "</div>";
    echo http_script("\n\tjQuery(function(){\n\t\tjQuery('.plugins li.item a[rel=info]').click(function(){\n\t\t\tvar li = jQuery(this).parents('li').eq(0);\n\t\t\tvar prefix = li.find('input.checkbox').attr('name');\n\t\t\tif (!jQuery('div.details',li).html()) {\n\t\t\t\tjQuery('div.details',li).prepend(ajax_image_searching).load(\n\t\t\t\t\tjQuery(this).attr('href').replace(/admin_plugin|plugins/, 'info_plugin'), function(){\n\t\t\t\t\t\tli.addClass('on');\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (jQuery('div.details',li).toggle().is(':visible'))\n\t\t\t\t\tli.addClass('on');\n\t\t\t\telse\n\t\t\t\t\tli.removeClass('on');\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\tjQuery('.plugins li.item input.checkbox').change(function(){\n\t\t\tjQuery(this).parents('form').eq(0).find('.boutons').slideDown();\n\t\t});\n\t});\n\t");
    echo pipeline('affiche_milieu', array('args' => array('exec' => 'admin_plugin'), 'data' => ''));
    echo fin_gauche(), fin_page();
}
Exemplo n.º 3
0
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;
}