SVP Typologie gère maintenant toute la typologie des plugins, soit les catégories et les tags. Aussi, contrairement à ce qui a été prévu dans les commits précédents on supprime toute manipulation des catégories et des tags dans SVP :

- les colonnes tags et categorie sont supprimées de spip_plugins
- le chargement du XML considère encore l'attribut ou la balise categorie par souci de compatibilité mais ne le renvoie pas.
- il ne reste plus que les API d'affichage qui utilisent la catégorie comme filtre mais qui fonctionnent très bien sans et ne sont utilisés que par Plugins SPIP. Ces API seront revus dans un prochain commit.

Cette version de SVP qui inaugure une branche 2.0 est totalement compatible avec les sites de production fonctionnant en mode runtime mais est incomptaible avec Plugins SPIP.
master v2.0.0
eric@smellup.net 4 years ago
parent 95000c2c95
commit 165adbad68

1
.gitattributes vendored

@ -12,7 +12,6 @@ formulaires/inc-admin_plugin_fonctions.php -text
formulaires/inc-confirmer_actions.html -text
inc/svp_actionner.php -text
inc/svp_depoter_local.php -text
inc/svp_typologie.php -text
lang/paquet-svp.xml -text
lang/paquet-svp_ar.php -text
lang/paquet-svp_br.php -text

@ -91,8 +91,6 @@ function svp_declarer_tables_objets_sql($tables) {
"prefixe" => "varchar(30) DEFAULT '' NOT NULL",
"nom" => "text DEFAULT '' NOT NULL",
"slogan" => "text DEFAULT '' NOT NULL",
"categorie" => "varchar(100) DEFAULT '' NOT NULL",
"tags" => "text DEFAULT '' NOT NULL",
"vmax" => "varchar(24) DEFAULT '' NOT NULL", // version la plus elevee des paquets du plugin
"date_crea" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // la plus ancienne des paquets du plugin
"date_modif" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // la plus recente des paquets du plugin

@ -92,11 +92,9 @@ function exec_admin_plugin_dist() {
include_spip('exec/fond');
*/
// liste des erreurs mises en forme
// liste des erreurs mises en forme
$erreur_activation = plugin_donne_erreurs();
$commencer_page = charger_fonction('commencer_page', 'inc');
echo $commencer_page(_T('icone_admin_plugin'), "configuration", "plugin");

@ -26,31 +26,6 @@
</div>
</fieldset>
<fieldset>
<legend><:svp:fieldset_typologie:></legend>
<div class="editer-groupe">
#SET{name,utilisation_categorie}#SET{obli,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
[<span class="erreur_message">(#GET{erreurs})</span>
]<div class="choix">
<input type="checkbox" name="#GET{name}" id="champ_#GET{name}" value="on"
[(#ENV{#GET{name}}|oui)checked="checked"] />
<label><:svp:config_utiliser_categorie:></label>
</div>
</div>
#SET{name,utilisation_tag}#SET{obli,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
[<span class="erreur_message">(#GET{erreurs})</span>
]<div class="choix">
<input type="checkbox" name="#GET{name}" id="champ_#GET{name}" value="on"
[(#ENV{#GET{name}}|oui)checked="checked"] />
<label><:svp:config_utiliser_tag:></label>
</div>
</div>
</div>
</fieldset>
<fieldset>
<legend><:svp:fieldset_debug:></legend>
<div class="editer-groupe">

@ -1,7 +1,7 @@
<?php
/**
* Gestion du formulaire de t<EFBFBD>l<EFBFBD>chargement de plugin via une URL
* Gestion du formulaire de téléchargement de plugin via une URL
*
* @plugin SVP pour SPIP
* @license GPL
@ -15,11 +15,11 @@ if (!defined("_ECRIRE_INC_VERSION")) {
include_spip("inc/plugin");
/**
* Cr<EFBFBD>e une valeur d'action pour l'attribut 'name' d'une saisie de formulaire
* Crée une valeur d'action pour l'attribut 'name' d'une saisie de formulaire
*
* @example
* [(#ID_PAQUET|svp_nom_action{on})]
* <EFBFBD>crit : actions[on][24]
* écrit : actions[on][24]
* @param int $id_paquet
* Identifiant du paquet
* @param string $action
@ -28,3 +28,4 @@ include_spip("inc/plugin");
function filtre_svp_nom_action($id_paquet, $action) {
return "actions[$action][$id_paquet]";
}

@ -1,6 +1,6 @@
[(#SET{plugins,#ARRAY})]
[(#ENV{phrase}|ou{#ENV{depot}}|ou{#ENV{categorie}}|ou{#ENV{etat}}|ou{#ENV{exclusion}}|ou{#ENV{doublon}}|oui)
[(#SET{plugins,[(#ENV{phrase}|construire_recherche_plugins{#ENV{categorie}, #ENV{etat}, #ENV{depot}, #ENV{exclusion}, #ENV{doublon}})]})]
[(#ENV{phrase}|ou{#ENV{depot}}|ou{#ENV{etat}}|ou{#ENV{exclusion}}|ou{#ENV{doublon}}|oui)
[(#SET{plugins,[(#ENV{phrase}|construire_recherche_plugins{'', #ENV{etat}, #ENV{depot}, #ENV{exclusion}, #ENV{doublon}})]})]
[(#SET{nb,[(#GET{plugins}|count)]})]
[(#SET{tri,[(#GET{phrase}|?{score,nom})]})]
[(#GET{nb}|oui)<p class="explication"><:svp:message_ok_plugins_trouves{nb_plugins=#GET{nb},tri=#GET{tri}}:></p>]

@ -448,11 +448,6 @@ function svp_actualiser_paquets($id_depot, $paquets, &$nb_paquets, &$nb_plugins,
$insert_contribs = array();
$prefixes = array(); // prefixe => id_plugin
// Initialisation de la configuration de l'utilisation des champs categorie et tags
include_spip('inc/config');
$utiliser_categorie = lire_config('svp/utilisation_categorie', false);
$utiliser_tag = lire_config('svp/utilisation_tag', false);
// On met a jour ou on cree chaque paquet a partir du contenu du fichier xml
// On ne fait pas cas de la compatibilite avec la version de SPIP installee
// car l'operation doit permettre de collecter tous les paquets
@ -492,20 +487,6 @@ function svp_actualiser_paquets($id_depot, $paquets, &$nb_paquets, &$nb_plugins,
. basename($insert_paquet['nom_archive'], '.zip') . '.'
. pathinfo($insert_paquet['logo'], PATHINFO_EXTENSION);
}
// Si la configuration requiert l'utilisation de la catégorie de plugins on la récupère à partir
// du serveur de référentiel de plugins. Sinon, on la force à vide.
$insert_plugin['categorie'] = '';
if ($utiliser_categorie) {
$insert_plugin['categorie'] = plugin_acquerir_type($insert_plugin['prefixe'], 'categorie');
}
// Si la configuration requiert l'utilisation des tags de plugins on les récupère à partir
// du serveur de référentiel de plugins. Sinon, on force le champ à vide.
$insert_plugin['tags'] = '';
if ($utiliser_tag) {
$insert_plugin['tags'] = plugin_acquerir_type($insert_plugin['prefixe'], 'tag');
}
} else {
$paquet_plugin = false;
}
@ -883,9 +864,7 @@ function eclater_plugin_paquet($champs_aplat) {
'plugin' => array(
'prefixe' => $champs_aplat['prefixe'],
'nom' => $champs_aplat['nom'],
'slogan' => $champs_aplat['slogan'],
'categorie' => $champs_aplat['categorie'],
'tags' => $champs_aplat['tags'],
'slogan' => $champs_aplat['slogan']
),
'paquet' => array(
'logo' => $champs_aplat['logo'],
@ -904,7 +883,7 @@ function eclater_plugin_paquet($champs_aplat) {
'lien_demo' => $champs_aplat['lien_demo'],
'lien_dev' => $champs_aplat['lien_dev'],
'dependances' => $champs_aplat['dependances'],
'procure' => $champs_aplat['procure'],
'procure' => $champs_aplat['procure']
)
);
}

@ -237,10 +237,6 @@ function svp_base_inserer_paquets_locaux($paquets_locaux) {
$actifs = lire_config('plugin');
$attentes = lire_config('plugin_attente');
// Initialisation de la configuration de l'utilisation des champs categorie et tags
$utiliser_categorie = lire_config('svp/utilisation_categorie', false);
$utiliser_tag = lire_config('svp/utilisation_tag', false);
foreach ($paquets_locaux as $const_dir => $paquets) {
foreach ($paquets as $chemin => $paquet) {
// Si on est en presence d'un plugin dont la dtd est "paquet" on compile en multi
@ -278,20 +274,6 @@ function svp_base_inserer_paquets_locaux($paquets_locaux) {
// Mettre le préfixe en majuscule si besoin
$prefixe = strtoupper($le_plugin['prefixe']);
// Si la configuration requiert l'utilisation de la catégorie de plugins on la récupère à partir
// du serveur de référentiel de plugins. Sinon, on la force à vide.
$le_plugin['categorie'] = '';
if ($utiliser_categorie) {
$le_plugin['categorie'] = plugin_acquerir_type($prefixe, 'categorie');
}
// Si la configuration requiert l'utilisation des tags de plugins on les récupère à partir
// du serveur de référentiel de plugins. Sinon, on force le champ à vide.
$le_plugin['tags'] = '';
if ($utiliser_tag) {
$le_plugin['tags'] = plugin_acquerir_type($prefixe, 'tag');
}
// creation du plugin...
// on fait attention lorqu'on cherche ou ajoute un plugin
// le nom et slogan est TOUJOURS celui de la plus haute version

@ -300,6 +300,12 @@ function svp_phraser_plugin($dtd, $contenu) {
$plugin = $fusionner($plugins[0]);
}
// Durant la période où les XML contiennent encore l'attribut ou la balise categorie il faut la traiter
// lors du phrasage mais la supprimer après la fusion afin d'éviter une erreur SQL lors de l'insertion.
if (isset($plugin['categorie'])) {
unset($plugin['categorie']);
}
// Pour la DTD paquet, les traductions du nom, slogan et description sont compilees dans une balise
// du fichier archives.xml. Il faut donc completer les informations precedentes avec cette balise
if (($dtd == _SVP_DTD_PAQUET) and (preg_match(_SVP_REGEXP_BALISE_MULTIS, $contenu, $matches))) {
@ -311,7 +317,7 @@ function svp_phraser_plugin($dtd, $contenu) {
if ($multis['nom']) {
$plugin['nom'] = $multis['nom'];
}
// Slogan et description sont forcement des items de langue
// Slogan et description sont forcement des items de langue
$plugin['slogan'] = $multis['slogan'];
$plugin['description'] = $multis['description'];
}
@ -377,12 +383,12 @@ function svp_phraser_traductions($contenu) {
// On continue par les balises <langue> qui donnent le code en attribut
// et les balises <traducteur> qui donnent uniquement le nom en attribut
if (is_array($_langues[0])) {
foreach ($_langues[0] as $_tag => $_traducteurs) {
list($tag, $attributs_langue) = spip_xml_decompose_tag($_tag);
foreach ($_langues[0] as $_tag_trad => $_traducteurs) {
list($tag, $attributs_langue) = spip_xml_decompose_tag($_tag_trad);
$traducteurs = array();
if (is_array($_traducteurs[0])) {
foreach ($_traducteurs[0] as $_tag => $_vide) {
list($tag, $attributs_traducteur) = spip_xml_decompose_tag($_tag);
foreach ($_traducteurs[0] as $_tag_lang => $_vide) {
list($tag, $attributs_traducteur) = spip_xml_decompose_tag($_tag_lang);
$traducteurs[] = $attributs_traducteur;
}
}

@ -31,7 +31,7 @@ include_spip('inc/plugin');
* @param string $phrase
* Texte de la recherche
* @param string $categorie
* Type de catégorie de plugin (auteur, date...)
* Type de catégorie de plugin (auteur, date...) : depréciée !!!
* @param string $etat
* État de plugin (stable, test...)
* @param string|int $depot
@ -123,7 +123,7 @@ function svp_rechercher_plugins_spip(
}
// Maintenant, on continue la recherche en appliquant, sur la liste des id de paquets,
// les filtres complementaires : categorie, etat, exclusions et compatibilite spip
// les filtres complementaires : etat, exclusions et compatibilite spip
// si on a bien trouve des resultats precedemment ou si aucune phrase n'a ete saisie
// -- Preparation de la requete
if ($ids_paquets) {
@ -149,9 +149,6 @@ function svp_rechercher_plugins_spip(
if ($ids_paquets) {
$where[] = sql_in('t2.id_paquet', $ids_paquets);
}
if ($categorie) {
$where[] = 't1.categorie=' . sql_quote($categorie);
}
if (($etat) and ($etat != 'tout_etat')) {
$where[] = 't2.etat=' . sql_quote($etat);
}

@ -1,93 +0,0 @@
<?php
/**
* Ce fichier contient le complément pour SVP de l'API de gestion des différentes typologie de plugin.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
if (!defined('_SVP_URL_SERVEUR_TYPOLOGIE')) {
define('_SVP_URL_SERVEUR_TYPOLOGIE', 'https://demopot.smellup.net/http.api/svp/');
}
/**
* Renvoie, pour le plugin demandé et en fonction de la typologie, le ou les types associés au plugin.
* La typologie est acquise vi l'API REST des modules complémentaires de SVP (SVP Typologie, SVP API) et
* stockée dans un cache mis à jour toutes les 6 heures.
*
* @param string $prefixe
* Préfixe du plugin concerné en majuscules.
* @param string $typologie
* Typologie concernée : categorie ou tag.
*
* @return string
* Identifiant de la catégorie ou chaine vide sinon.
*/
function plugin_acquerir_type($prefixe, $typologie) {
// Utilisation d'une statique pour éviter les requêtes multiples sur le même hit.
static $types = array();
if (!isset($types[$typologie][$prefixe])) {
// On lit le cache des affectations plugin-type.
// strpos(_SPIPERIPSUM_EVANGILE_ENDPOINT, $GLOBALS['meta']['adresse_site']) === false)
$affectations = array();
// Si échut on requete le serveur
// On stocke les affectations en statique pour la typologie concernée.
$types[$typologie] = $affectations;
}
return $types[$typologie][$prefixe];
}
/**
* Renvoie les affectations aux plugins pour une typologie donnée.
*
* @param string $typologie
* Typologie concernée : categorie ou tag.
* @param string $type
* Valeur d'un type donné pour la typologie concernée.
*
* @return array
*/
function type_plugin_lister_affectation($typologie, $type = '') {
// Utilisation d'une statique pour éviter les requêtes multiples sur le même hit.
static $affectations = array();
if (!isset($affectations[$typologie])) {
// On récupère l'id du groupe pour le type précisé (categorie, tag).
include_spip('inc/config');
$id_groupe = lire_config("svptype/typologies/${typologie}/id_groupe", 0);
// On récupère la description complète de toutes les catégories de plugin
$from = array('spip_plugins_typologies');
$where = array('id_groupe=' . $id_groupe);
$order_by = array('id_mot', 'prefixe');
$affectations[$typologie] = sql_allfetsel('*', $from, $where, '', $order_by);
}
// Filtrer sur le type souhaité si il existe.
if (!$type) {
$affectations_filtrees = $affectations[$typologie];
} else {
// Récupération de l'id du type
include_spip('inc/svptype_mot');
$id_type = mot_lire_id($type);
// Extraction des seules affectations au type.
$affectations_filtrees = array();
foreach ($affectations[$typologie] as $_affectation) {
if ($_affectation['id_mot'] == $id_type) {
$affectations_filtrees[] = $_affectation;
}
}
}
return $affectations_filtrees;
}

@ -1,11 +1,11 @@
<paquet
prefix="svp"
categorie="maintenance"
version="1.6.2"
version="2.0.0"
etat="stable"
compatibilite="[3.3.0-dev;3.3.*]"
logo="svp-64.png"
schema="0.5.1"
schema="0.6.0"
documentation="http://blog.smellup.net/spip.php?rubrique1"
>

@ -35,7 +35,6 @@ function plugins_preparer_sql_paquet($plugin) {
// On initialise les champs ne necessitant aucune transformation
foreach (array(
'categorie' => 'categorie',
'etat' => 'etat',
'version_base' => 'schema',
'logo' => 'logo',
@ -77,7 +76,6 @@ function plugins_preparer_sql_paquet($plugin) {
// Tags : liste de mots-cles
// Traitement des auteurs, credits, licences et copyright
foreach (array(
'tags' => 'tags',
'auteur' => 'auteur',
'credit' => 'credit',
'licence' => 'licence',

@ -35,7 +35,6 @@ function plugins_preparer_sql_plugin($plugin) {
}
// 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'] : '';
@ -51,9 +50,6 @@ function plugins_preparer_sql_plugin($plugin) {
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');

@ -11,12 +11,6 @@
<div class='label'><:info_descriptif:></div>
<div dir='#LANG_DIR' class='texte'>[(#SLOGAN|sinon{#DESCRIPTION|couper{80}})]</div>
</div>
<div class="champ contenu_ps">
<div class='label'><:svp:label_categorie:>&nbsp;:</div>
<div dir='#LANG_DIR' class='ps'><p>[(#CATEGORIE|svp_traduire_categorie)]</p></div>
[<div class='label'><:svp:label_tags:>&nbsp;:</div>
<div dir='#LANG_DIR' class='ps'><p>(#TAGS)</p></div>]
</div>
<div class="champ contenu_ps">
<B_branches>
<div class='label'><:svp:label_branches_spip:>&nbsp;:</div>

@ -6,7 +6,6 @@
- titre : le titre de la liste
- par : le champ tri principal
- pas : le pas de pagination
- categorie : filtrer la liste sur categorie
- id_depot : filtrer la liste sur un depot
- recherche : critere de recherche
- where : condition supplementaire construire par l'appelant (non utilisee)
@ -16,7 +15,6 @@
nom, 1,
date_modif, -1,
prefixe, 1,
categorie, 1,
id_depot, 1}})]
<B_liste_plugins>
@ -34,7 +32,7 @@
</tr>
</thead>
<tbody>
<BOUCLE_liste_plugins(PLUGINS) {id_plugin?}{where?}{id_depot?}{categorie?}{recherche?}{tri #ENV{par, nom}, #GET{defaut_tri}}{pagination #ENV{pas, 25}}>
<BOUCLE_liste_plugins(PLUGINS) {id_plugin?}{where?}{id_depot?}{recherche?}{tri #ENV{par, nom}, #GET{defaut_tri}}{pagination #ENV{pas, 25}}>
<tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]">
<td class="titre principale">
<a[ href="(#ID_PLUGIN|generer_url_entite{plugin})"] title="<:svp:bulle_aller_plugin:>">

@ -42,8 +42,12 @@ function svp_upgrade($nom_meta_base_version, $version_cible) {
// on force le recalcul des infos des paquets locaux.
$maj['0.5.0'][] = array('maj_tables', 'spip_paquets');
$maj['0.5.1'][] = array('svp_actualiser_paquets_locaux', true);
$maj['0.6.0'][] = array('svp_vider_categories');
// suppression des colonnes tags et categorie car c'est le plugin SVP Typologie différent qui s'en occupe totalement.
$maj['0.6.0'] = array(
array('maj_tables',array('spip_plugins')),
array('sql_alter','TABLE spip_plugins DROP COLUMN categorie'),
array('sql_alter','TABLE spip_plugins DROP COLUMN tags'),
);
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
@ -99,18 +103,3 @@ function svp_synchroniser_prefixe() {
}
}
}
/**
* Vider le champ categorie de tous les enregistrement de la table spip_plugins.
* En effet, à partir du schéma 0.6 ce champ n'est plus alimenté par le XML des plugins mais par une API REST
* fournie par le plugin SVP Typologie. L'utilisation de champ sur les sites de production devient optionnelle et
* est désactivée par défaut.
*
* @return void
*/
function svp_vider_categories() {
// On vide le champ catégorie de tous les plugins de la base.
// La fonction d'actualisation de la base des plugins ne le remplira que si demandé, sinon il restera vide
// ce qui n'a aucune incidence sur le fonctionnment de SVP.
sql_update('spip_plugins', array('categorie' => ''));
}

Loading…
Cancel
Save