/**
 * Pour une description de plugin donnée (issue de la dtd de paquet.xml),
 * prépare les données à installer en bdd
 *
 * Les données sont parfois sérialisées, parfois compilées
 * pour tenir compte des spécificités de cette DTD et du stockage en bdd.
 *
 * @param array $plugin
 *     Description de plugin
 * @return array
 *     Couples clés => valeurs de description du paquet
 **/
function plugins_preparer_sql_paquet($plugin)
{
    include_spip('inc/svp_outiller');
    $champs = array();
    if (!$plugin) {
        return $champs;
    }
    // On initialise les champs ne necessitant aucune transformation
    foreach (array('categorie' => 'categorie', 'etat' => 'etat', 'version_base' => 'schema', 'logo' => 'logo', 'lien_doc' => 'documentation', 'lien_demo' => 'demonstration', 'lien_dev' => 'developpement') as $cle_champ => $cle_plugin) {
        $champs[$cle_champ] = (isset($plugin[$cle_plugin]) and $plugin[$cle_plugin]) ? $plugin[$cle_plugin] : '';
    }
    // on normalise la version 1.3.12 => 001.003.012
    $champs['version'] = (isset($plugin['version']) and $plugin['version']) ? normaliser_version($plugin['version']) : '';
    // On passe le prefixe en lettres majuscules comme ce qui est fait dans SPIP
    // Ainsi les valeurs dans la table spip_plugins coincideront avec celles de la meta plugin
    $champs['prefixe'] = strtoupper($plugin['prefix']);
    // Indicateurs d'etat numerique (pour simplifier la recherche des maj de STP)
    static $num = array('stable' => 4, 'test' => 3, 'dev' => 2, 'experimental' => 1);
    $champs['etatnum'] = isset($num[$plugin['etat']]) ? $num[$plugin['etat']] : 0;
    // On passe en utf-8 avec le bon charset les champs pouvant contenir des entites html
    foreach (array('nom' => 'nom', 'description' => 'description', 'slogan' => 'slogan') as $cle_champ => $cle_plugin) {
        $champs[$cle_champ] = (isset($plugin[$cle_plugin]) and $plugin[$cle_plugin]) ? entite2charset($plugin[$cle_plugin], 'utf-8') : '';
    }
    // Cles necessitant d'etre serialisees
    // Tags : liste de mots-cles
    // Traitement des auteurs, credits, licences et copyright
    foreach (array('tags' => 'tags', 'auteur' => 'auteur', 'credit' => 'credit', 'licence' => 'licence', 'copyright' => 'copyright') as $cle_champ => $cle_plugin) {
        $champs[$cle_champ] = (isset($plugin[$cle_plugin]) and $plugin[$cle_plugin]) ? serialize($plugin[$cle_plugin]) : '';
    }
    // Extraction de la compatibilite SPIP et construction de la liste des branches spip supportees
    $champs['compatibilite_spip'] = (isset($plugin['compatibilite']) and $plugin['compatibilite']) ? $plugin['compatibilite'] : '';
    $champs['branches_spip'] = (isset($plugin['compatibilite']) and $plugin['compatibilite']) ? compiler_branches_spip($plugin['compatibilite']) : '';
    // Construction du tableau des dependances necessite, lib et utilise
    $dependances['necessite'] = $plugin['necessite'];
    $dependances['librairie'] = $plugin['lib'];
    $dependances['utilise'] = $plugin['utilise'];
    $champs['dependances'] = serialize($dependances);
    // Calculer le champ 'procure' (tableau sérialisé prefixe => version)
    $champs['procure'] = '';
    if (!empty($plugin['procure'][0])) {
        $champs['procure'] = array();
        foreach ($plugin['procure'][0] as $procure) {
            $p = strtoupper($procure['nom']);
            if (!isset($champs['procure'][$p]) or spip_version_compare($procure['version'], $champs['procure'][$p], '>')) {
                $champs['procure'][$p] = $procure['version'];
            }
        }
        $champs['procure'] = serialize($champs['procure']);
    }
    return $champs;
}
Ejemplo n.º 2
0
/**  
 * Complète les informations des plugins, d'une liste de plugins donnés,
 * en compilant certaines informations (compatibilités, dates,  branches)
 *
 * @param array $ids_plugin
 *     Liste d'identifiants de plugins
 * @return bool
 *     false si rien à faire, true sinon
**/
function svp_completer_plugins($ids_plugin)
{
    if (!$ids_plugin) {
        return false;
    }
    include_spip('inc/svp_outiller');
    // -- on recupere tous les paquets associes aux plugins indiques et on compile les infos
    if ($resultats = sql_allfetsel('id_plugin, compatibilite_spip, date_crea, date_modif', 'spip_paquets', array(sql_in('id_plugin', $ids_plugin), 'id_depot>' . intval(0)), '', 'id_plugin')) {
        $plugin_en_cours = 0;
        $inserts = array();
        foreach ($resultats as $paquet) {
            // On finalise le plugin en cours et on passe au suivant
            if ($plugin_en_cours != $paquet['id_plugin']) {
                // On met a jour le plugin en cours
                if ($plugin_en_cours) {
                    // On deduit maintenant les branches de la compatibilite globale
                    $complements['branches_spip'] = compiler_branches_spip($complements['compatibilite_spip']);
                    $inserts[$plugin_en_cours] = $complements;
                }
                // On passe au plugin suivant
                $plugin_en_cours = $paquet['id_plugin'];
                $complements = array('compatibilite_spip' => '', 'branches_spip' => '', 'date_crea' => 0, 'date_modif' => 0);
            }
            // On compile les compléments du plugin avec le paquet courant sauf les branches
            // qui sont deduites en fin de compilation de la compatibilite
            if ($paquet['date_modif'] > $complements['date_modif']) {
                $complements['date_modif'] = $paquet['date_modif'];
            }
            if ($complements['date_crea'] === 0 or $paquet['date_crea'] < $complements['date_crea']) {
                $complements['date_crea'] = $paquet['date_crea'];
            }
            if ($paquet['compatibilite_spip']) {
                if (!$complements['compatibilite_spip']) {
                    $complements['compatibilite_spip'] = $paquet['compatibilite_spip'];
                } else {
                    $complements['compatibilite_spip'] = fusionner_intervalles($paquet['compatibilite_spip'], $complements['compatibilite_spip']);
                }
            }
        }
        // On finalise le dernier plugin en cours
        $complements['branches_spip'] = compiler_branches_spip($complements['compatibilite_spip']);
        $inserts[$plugin_en_cours] = $complements;
        // On insere, en encapsulant pour sqlite...
        if (sql_preferer_transaction()) {
            sql_demarrer_transaction();
        }
        foreach ($inserts as $id_plugin => $complements) {
            sql_updateq('spip_plugins', $complements, 'id_plugin=' . intval($id_plugin));
        }
        if (sql_preferer_transaction()) {
            sql_terminer_transaction();
        }
    }
    return true;
}
/**
 * Pour une description de plugin donnée (issue de la dtd de plugin.xml),
 * prépare les données à installer en bdd
 *
 * Les données sont parfois sérialisées, parfois transcodées, parfois compilées
 * pour tenir compte des spécificités de cette DTD et du stockage en bdd.
 *
 * @uses  compiler_branches_spip()
 * @param array $plugin
 *     Description de plugin
 * @return array
 *     Couples clés => valeurs de description du paquet
 **/
function plugins_preparer_sql_plugin($plugin)
{
    include_spip('inc/svp_outiller');
    $champs = array();
    if (!$plugin) {
        return $champs;
    }
    // On initialise les champs ne necessitant aucune transformation
    $champs['categorie'] = (isset($plugin['categorie']) and $plugin['categorie']) ? $plugin['categorie'] : '';
    $champs['etat'] = (isset($plugin['etat']) and $plugin['etat']) ? $plugin['etat'] : '';
    $champs['version'] = $plugin['version'] ? normaliser_version($plugin['version']) : '';
    $champs['version_base'] = (isset($plugin['schema']) and $plugin['schema']) ? $plugin['schema'] : '';
    // Renommage de certains champs
    $champs['logo'] = (isset($plugin['logo']) and $plugin['logo']) ? $plugin['logo'] : '';
    $champs['lien_doc'] = (isset($plugin['documentation']) and $plugin['documentation']) ? normaliser_lien($plugin['documentation']) : '';
    // On passe le prefixe en lettres majuscules comme ce qui est fait dans SPIP
    // Ainsi les valeurs dans la table spip_plugins coincideront avec celles de la meta plugin
    $champs['prefixe'] = strtoupper($plugin['prefix']);
    // Indicateurs d'etat numerique (pour simplifier la recherche des maj de STP)
    static $num = array('stable' => 4, 'test' => 3, 'dev' => 2, 'experimental' => 1);
    $champs['etatnum'] = (isset($plugin['etat']) and isset($num[$plugin['etat']])) ? $num[$plugin['etat']] : 0;
    // Tags : liste de mots-cles
    $champs['tags'] = (isset($plugin['tags']) and $plugin['tags']) ? serialize($plugin['tags']) : '';
    // On passe en utf-8 avec le bon charset les champs pouvant contenir des entites html
    $champs['description'] = entite2charset($plugin['description'], 'utf-8');
    // Traitement des auteurs, credits, licences et copyright
    // -- on extrait les auteurs, licences et copyrights sous forme de tableaux
    // -- depuis le commit 18294 du core la balise auteur est renvoyee sous forme de tableau mais
    //    contient toujours qu'un seul index
    $balise_auteur = entite2charset($plugin['auteur'][0], 'utf-8');
    $auteurs = normaliser_auteur_licence($balise_auteur, 'auteur');
    $balise_licence = isset($plugin['licence'][0]) ? entite2charset($plugin['licence'][0], 'utf-8') : '';
    $licences = normaliser_auteur_licence($balise_licence, 'licence');
    // -- on merge les tableaux recuperes dans auteur et licence
    $champs['auteur'] = $champs['licence'] = $champs['copyright'] = '';
    if ($t = array_merge($auteurs['auteur'], $licences['auteur'])) {
        $champs['auteur'] = serialize($t);
    }
    if ($t = array_merge($auteurs['licence'], $licences['licence'])) {
        $champs['licence'] = serialize($t);
    }
    if ($t = array_merge($auteurs['copyright'], $licences['copyright'])) {
        $champs['copyright'] = serialize($t);
    }
    // Extrait d'un nom et un slogan normalises
    // Slogan : si vide on ne fait plus rien de special, on traitera ça a l'affichage
    $champs['slogan'] = $plugin['slogan'] ? entite2charset($plugin['slogan'], 'utf-8') : '';
    // Nom :	on repere dans le nom du plugin un chiffre en fin de nom
    //			et on l'ampute de ce numero pour le normaliser
    //			et on passe tout en unicode avec le charset du site
    $champs['nom'] = trim(entite2charset($plugin['nom'], 'utf-8'));
    // Extraction de la compatibilite SPIP et construction de la liste des branches spip supportees
    $champs['compatibilite_spip'] = $plugin['compatibilite'] ? $plugin['compatibilite'] : '';
    $champs['branches_spip'] = $plugin['compatibilite'] ? compiler_branches_spip($plugin['compatibilite']) : '';
    // Construction du tableau des dependances necessite, lib et utilise
    $dependances['necessite'] = $plugin['necessite'];
    $dependances['librairie'] = $plugin['lib'];
    $dependances['utilise'] = $plugin['utilise'];
    $champs['dependances'] = serialize($dependances);
    // Calculer le champ 'procure' (tableau sérialisé prefixe => version)
    $champs['procure'] = '';
    if (!empty($plugin['procure'][0])) {
        $champs['procure'] = array();
        foreach ($plugin['procure'][0] as $procure) {
            $p = strtoupper($procure['nom']);
            if (!isset($champs['procure'][$p]) or spip_version_compare($procure['version'], $champs['procure'][$p], '>')) {
                $champs['procure'][$p] = $procure['version'];
            }
        }
        $champs['procure'] = serialize($champs['procure']);
    }
    // Champs non supportes par la DTD plugin et ne pouvant etre deduits d'autres balises
    $champs['lien_demo'] = '';
    $champs['lien_dev'] = '';
    $champs['credit'] = '';
    return $champs;
}