Browse Source

Mise au point des 3 actions d'installation de la nouvelle organisation.

master
Eric Lupinacci 3 years ago
parent
commit
d552aaa849
  1. 120
      action/rubrique_categorie_synchroniser_texte.php
  2. 15
      action/rubrique_plugin_generer_prefixe.php
  3. 90
      action/rubrique_plugin_synchroniser_texte.php
  4. 37
      contrib_autorisations.php
  5. 77
      inc/contrib_rubrique.php
  6. 25
      lang/contrib_fr.php
  7. 2
      paquet.xml
  8. 11
      prive/squelettes/navigation/dashboard.html

120
action/rubrique_categorie_synchroniser_texte.php

@ -0,0 +1,120 @@
<?php
/**
* Ce fichier contient l'action `rubrique_categorie_synchroniser_texte` utilisée lors de la migration
* pour synchroniser le titre et la description d'une rubrique-catégorie avec sa catégorie.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Cette action permet de copier le titre et la description d'une catégorie dans les champs idoines
* de la rubrique-catégorie associée si elle existe. Seuls les textes non vides sont copiés.
*
* Cette action est réservée aux webmestres. Elle ne nécessite aucun argument.
*
* @return void
*/
function action_rubrique_categorie_synchroniser_texte_dist($arguments = null) {
// Récupération des arguments de façon sécurisée.
if (is_null($arguments)) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arguments = $securiser_action();
}
// Le seul argument accepté est l'indicateur de forçage.
$forcer = false;
if ($arguments) {
$forcer = true;
}
// Verification des autorisations
if (!autoriser('webmestre')) {
include_spip('inc/minipres');
echo minipres();
exit();
}
// Pour permettre de ranger les rubriques selon le classement alphabétique basé sur l'identifiant et donc
// ajouter un numéro adéquat dans le titre, il faut synchroniser par niveau :
// - les catégories de regroupement d'abord,
// - et ensuite, pour chaque catégorie de regroupement, les catégories filles.
// Récupération des catégories de regroupement (profondeur = 0). Les catégories sont déjà fournies avec
// un tri alphabétique sur l'identifiant.
include_spip('inc/svptype_type_plugin');
$categories_meres = type_plugin_repertorier('categorie', array('profondeur' => 0));
// On synchronise les rubriques mère et filles dans la même boucle.
$rang_mere = 0;
foreach ($categories_meres as $_categorie_mere) {
// On synchronise la rubrique de regroupement. Le rang de la catégorie est toujours incrémenté que la rubrique
$rang_mere++;
rubrique_categorie_synchroniser($_categorie_mere, $rang_mere, $forcer);
// Récupération des catégories filles
$categories_filles = type_plugin_repertorier('categorie', array('id_parent' => $_categorie_mere['id_mot']));
// On synchronise les rubriques de filles selon la même heuristique.
$rang_fille = 0;
foreach ($categories_filles as $_categorie_fille) {
$rang_fille++;
rubrique_categorie_synchroniser($_categorie_fille, $rang_fille, $forcer);
}
}
// TODO : ajouter le déblocage de toutes les éditions de l'auteur
include_spip('inc/contrib_rubrique');
rubrique_debloquer_edition($GLOBALS['visiteur_session']['id_auteur']);
}
function rubrique_categorie_synchroniser($categorie, $rang, $forcer = false) {
// Initialiser la sortie de la fonction à false qui indique qu'aucune mise à jour n'a été faite.
$rubrique_synchronisee = false;
// On récupère la rubrique-catégorie correspondante, si elle existe.
$select = array('id_rubrique', 'titre', 'descriptif');
$from = 'spip_rubriques';
$where = array('categorie=' . sql_quote($categorie['identifiant']));
if ($rubrique = sql_fetsel($select, $from, $where)) {
// La rubrique existe :
// - On traite le titre. Si la catégorie possède un titre différent de l'identifiant
// il est systématiquement utilisé.
$set = array();
if ($categorie['titre'] and ($categorie['titre'] != $categorie['identifiant'])) {
$numero = 10 * $rang;
$set['titre'] = "${numero}. {$categorie['titre']}";
}
// -- On traite le descriptif et le texte:
// - Si le descriptif existe dans la rubrique et que le texte est vide on recopie le descriptif dans le texte
// - Ensuite, on ne le remplace le descriptif que si l'option de forçage est active ou que celui-ci est vide.
if ($rubrique['descriptif']) {
// Recopie du descriptif
if (!$rubrique['texte']) {
$set['texte'] = $rubrique['descriptif'];
}
// Forçage du descriptif
if ($forcer) {
if ($categorie['descriptif']) {
$set['descriptif'] = $categorie['descriptif'];
}
}
} else {
if ($categorie['descriptif']) {
$set['descriptif'] = $categorie['descriptif'];
}
}
// Si il y a un champ à modifier, on met à jour la rubrique.
if ($set) {
include_spip('action/editer_objet');
objet_modifier('rubrique', intval($rubrique['id_rubrique']), $set);
$rubrique_synchronisee = true;
}
}
return $rubrique_synchronisee;
}

15
action/rubrique_prefixe_generer.php → action/rubrique_plugin_generer_prefixe.php

@ -1,6 +1,6 @@
<?php
/**
* Ce fichier contient l'action `rubrique_prefixe_generer` utilisée lors de la migration
* Ce fichier contient l'action `rubrique_plugin_generer_prefixe` utilisée lors de la migration
* pour actualiser le préfixe des rubrique-plugin à partir de l'url sur Plugins SPIP si elle existe.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
@ -15,7 +15,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* @return void
*/
function action_rubrique_prefixe_generer_dist() {
function action_rubrique_plugin_generer_prefixe_dist() {
// Securisation: aucun argument attendu.
@ -41,20 +41,25 @@ function action_rubrique_prefixe_generer_dist() {
if ($rubriques_plugin) {
// Pour chaque rubrique-plugin on identifie si il existe un article possédant une url_site
// pointant vers plugins spip car le basename est égal au préfixe (http[s]://plugins.spip.net/prefixe[.html]).
include_spip('action/editer_objet');
foreach ($rubriques_plugin as $_rubrique) {
$from = 'spip_articles';
$where = array('id_rubrique=' . intval($_rubrique['id_rubrique']));
if ($urls = sql_allfetsel('url_site, id_article', $from, $where)) {
if ($urls = sql_allfetsel(array('url_site', 'id_article'), $from, $where)) {
foreach ($urls as $_url) {
$set = array();
if ($_url['url_site']
and ((stripos($_url['url_site'], 'https://plugins.spip.net/') === 0)
or (stripos($_url['url_site'], 'http://plugins.spip.net/') === 0))) {
$maj['prefixe'] = basename($_url['url_site'], '.html');
sql_updateq('spip_rubriques', $maj, $where);
$set['prefixe'] = basename($_url['url_site'], '.html');
objet_modifier('rubrique', intval($_rubrique['id_rubrique']), $set);
}
}
}
}
}
}
// TODO : ajouter le déblocage de toutes les éditions de l'auteur
rubrique_debloquer_edition($GLOBALS['visiteur_session']['id_auteur']);
}

90
action/rubrique_plugin_synchroniser_texte.php

@ -0,0 +1,90 @@
<?php
/**
* Ce fichier contient l'action `rubrique_textes_synchroniser` utilisée lors de la migration
* pour synchroniser le titre et la description d'une rubrique-catégorie avec sa catégorie.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Cette action permet de copier le titre et la description d'une catégorie dans les champs idoines
* de la rubrique-catégorie associée si elle existe. Seuls les textes non vides sont copiés.
*
* Cette action est réservée aux webmestres. Elle ne nécessite aucun argument.
*
* @return void
*/
function action_rubrique_plugin_synchroniser_texte_dist($arguments = null) {
// Récupération des arguments de façon sécurisée.
if (is_null($arguments)) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arguments = $securiser_action();
}
// Le seul argument accepté est l'indicateur de forçage.
$forcer = false;
if ($arguments) {
$forcer = true;
}
// Verification des autorisations
if (!autoriser('webmestre')) {
include_spip('inc/minipres');
echo minipres();
exit();
}
// Récupération des rubriques-plugin idenfiées parce que leur préfixe est initialisé.
include_spip('inc/contrib_rubrique');
$filtres = array(
'categorie' => '',
'prefixe' => '!'
);
$rubriques_plugin = rubrique_repertorier($filtres);
// Pour chaque rubrique on recherche le titre et le slogan du plugin associé pour remplir respectivement
// le titre, le descriptif et le texte de la rubrique.
include_spip('inc/svp_plugin');
include_spip('action/editer_objet');
foreach ($rubriques_plugin as $_rubrique) {
// Récupération des champs du plugin
if ($plugin = plugin_lire($_rubrique['prefixe'])) {
// Identification des modifications
$set = array();
// -- On traite le titre. Si le plugin possède un nom il est systématiquement utilisé.
if ($plugin['nom']) {
$set['titre'] = $plugin['nom'];
}
// -- On traite le descriptif et le texte:
// - Si le descriptif existe dans la rubrique et que le texte est vide on recopie le descriptif dans le texte
// - Ensuite, on ne le remplace le descriptif que si l'option de forçage est active ou que celui-ci est vide.
if ($_rubrique['descriptif']) {
// Recopie du descriptif
if (!$_rubrique['texte']) {
$set['texte'] = $_rubrique['descriptif'];
}
// Forçage du descriptif
if ($forcer) {
if ($plugin['slogan']) {
$set['descriptif'] = $plugin['slogan'];
}
}
} else {
if ($plugin['slogan']) {
$set['descriptif'] = $plugin['slogan'];
}
}
// Si il y a un champ à modifier, on met à jour la rubrique.
if ($set) {
objet_modifier('rubrique', intval($_rubrique['id_rubrique']), $set);
}
}
}
// TODO : ajouter le déblocage de toutes les éditions de l'auteur
rubrique_debloquer_edition($GLOBALS['visiteur_session']['id_auteur']);
}

37
contrib_autorisations.php

@ -7,6 +7,23 @@ if (!defined('_ECRIRE_INC_VERSION')) {
function contrib_autoriser() {
}
/**
* Autorisation minimale d'accès à toutes les pages du plugin Contrib.
* Par défaut, seuls les administrateurs complets sont autorisés à utiliser le plugin.
* Cette autorisation est à la base de la plupart des autres autorisations du plugin.
*
* @param $faire
* @param $type
* @param $id
* @param $qui
* @param $options
*
* @return bool
*/
function autoriser_contrib_dist($faire, $type, $id, $qui, $options) {
return autoriser('defaut');
}
/**
* Autorisation de modifier le champ extra catégorie d'une rubrique.
* Il faut :
@ -113,3 +130,23 @@ function autoriser_rubrique_modifierextra_prefixe($faire, $type, $id, $qui, $opt
return $autoriser;
}
/**
* Autorisation d'affichage du menu d'accès à gestion des typologies de plugin (page=svptype_typologie).
* Il faut être autorisé à utiliser le plugin.
*
* @param $faire
* @param $type
* @param $id
* @param $qui
* @param $options
*
* @return bool
*/
function autoriser_contrib_menu_dist($faire, $type, $id, $qui, $options) {
// Initialisation de l'autorisation
$autoriser = autoriser('contrib');
return $autoriser;
}

77
inc/contrib_rubrique.php

@ -60,6 +60,83 @@ function rubrique_lire($id_rubrique, $informations = array()) {
return $description;
}
/**
* Renvoie l'information brute demandée pour l'ensemble des types de plugins d'une typologie donnée
* ou toute les descriptions si aucune information n'est explicitement demandée.
*
* @api
*
* @param string $typologie Typologie concernée : categorie, tag...
* @param array $filtres Liste des couples (champ, valeur) ou tableau vide.
* @param array $informations Identifiant d'un champ ou de plusieurs champs de la description d'un type de plugin.
* Si l'argument est vide, la fonction renvoie les descriptions complètes.
*
* @return array Description complète ou information précise pour chaque type de plugin de la typologie concernée.
*/
function rubrique_repertorier($filtres = array(), $informations = array()) {
// On récupère la description complète de toutes les rubriques
// -- Table, colonnes et tri
$from = array('spip_rubriques');
$select = '*';
$order_by = array('id_rubrique');
// -- Calcul du where à partir des filtres.
$where = array();
if ($filtres) {
foreach ($filtres as $_champ => $_critere) {
$operateur = '=';
$valeur = $_critere;
if (substr($_critere, 0, 1) == '!') {
$operateur = '!=';
$valeur = ltrim($_critere, '!');
}
$where[] = $_champ . $operateur . (intval($valeur) ? intval($valeur) : sql_quote($valeur));
}
}
// -- Appel SQL
$rubriques_description = sql_allfetsel($select, $from, $where, '', $order_by);
// Refactoring du tableau suivant les champs demandés.
if (!$informations) {
$rubriques = $rubriques_description;
} else {
$rubriques = array();
$informations = array_flip($informations);
foreach ($rubriques_description as $_cle => $_rubrique) {
$rubriques[] = array_intersect_key($rubriques_description[$_cle], $informations);
}
}
return $rubriques;
}
/**
* Libère, pour l'auteur l'ayant demandé, les éditions sur les rubriques.
*
* @uses lire_tableau_edition()
* @uses ecrire_tableau_edition()
*
* @param int $id_auteur Identifiant de l'auteur
*
* @return void
*/
function rubrique_debloquer_edition($id_auteur) {
$edition = lire_tableau_edition();
foreach ($edition as $_objet => $_data) {
if ($_objet == 'rubrique') {
foreach ($_data as $_id => $_auteurs) {
if (isset($_auteurs[$id_auteur])) {
unset($edition[$_objet][$_id][$id_auteur]);
ecrire_tableau_edition($edition);
}
}
}
}
}
function rubrique_lire_profondeur($id_rubrique) {
static $profondeurs = array();

25
lang/contrib_fr.php

@ -6,28 +6,31 @@ if (!defined('_ECRIRE_INC_VERSION')) {
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// A
'article_accueil_titre' => 'Article principal :',
// B
'boite_info_explication' => 'Cette page permet aux administrateurs de SPIP-Contrib de contrôler la nouvelle organisation du site et de gérer les workflows initiés par les utilisateurs.',
// C
'categorie_vide_label' => 'Pas de catégorie',
'configuration_page_titre' => 'Configuration du plugin Contrib',
'configuration_secteur_galaxie_label' => 'Secteurs disponibles',
'categorie_vide_label' => 'Pas de catégorie',
'configuration_page_titre' => 'Configuration du plugin Contrib',
'configuration_secteur_galaxie_label' => 'Secteurs disponibles',
'configuration_secteur_galaxie_explication' => 'Choisir parmi les secteurs disponibles (hors secteur-carnet, secteur-apropos et secteurs-plugin) le ou les secteurs qui composeront la partie Galaxie du site.',
// D
'dashboard_page_titre' => 'Dashboard de SPIP-Contrib',
'dashboard_menu' => 'Dashboard SPIP-Contrib',
'dashboard_menu' => 'Dashboard SPIP-Contrib',
// L
'type_article_label' => 'Type d\'article',
'type_article_label' => 'Type d\'article',
'type_article_utilisation_label' => 'documentation générale',
'type_article_conception_label' => 'documentation de conception',
'type_article_actualite_label' => 'article d\'actualité',
'type_article_conception_label' => 'documentation de conception',
'type_article_actualite_label' => 'article d\'actualité',
// R
'rubrique_prefixe_generer_label' => 'Générer les préfixes',
'rubrique_couleur_label' => 'Couleur de la rubrique',
'plugin_categorie_changer_label' => 'Passer les catégories en v2',
'rubrique_plugin_generer_prefixe_label' => 'Générer les préfixes des rubriques-plugin',
'rubrique_couleur_label' => 'Couleur de la rubrique',
'rubrique_categorie_synchroniser_texte_label' => 'Synchroniser les rubriques-catégorie',
'rubrique_plugin_synchroniser_texte_label' => 'Synchroniser les rubriques-plugin',
);

2
paquet.xml

@ -26,5 +26,5 @@
<pipeline nom="formulaire_charger" inclure="contrib_pipelines.php" />
<pipeline nom="affiche_droite" inclure="contrib_pipelines.php" />
<menu nom="contrib_dashboard" titre="contrib:dashboard_menu" parent="menu_administration" icone="images/dashboard-16.png" action="dashboard" />
<menu nom="contrib" titre="contrib:dashboard_menu" parent="menu_administration" icone="images/dashboard-16.png" action="dashboard" />
</paquet>

11
prive/squelettes/navigation/dashboard.html

@ -1,12 +1,15 @@
[(#REM) <!-- Boite d'information sur le dashboard et boutons de raccourcis --> ]
#BOITE_OUVRIR{#CHEMIN_IMAGE{boussole_gerer-24.png}|balise_img{'',cadre-icone}, info}
<:contrib:boite_info_explication:>
#BOITE_FERMER
[(#AUTORISER{webmestre}|oui)
#BOITE_OUVRIR{'', raccourcis}
[(#URL_ACTION_AUTEUR{rubrique_prefixe_generer, '', #SELF}
|icone_horizontale{<:contrib:rubrique_prefixe_generer_label:>, rubrique_plugin-24.png})]
[(#URL_ACTION_AUTEUR{plugin_categorie_changer, '', #SELF}
|icone_horizontale{<:contrib:plugin_categorie_changer_label:>, plugin_categorie-24.png})]
[(#URL_ACTION_AUTEUR{rubrique_categorie_synchroniser_texte, '', #SELF}
|icone_horizontale{<:contrib:rubrique_categorie_synchroniser_texte_label:>, rubrique_plugin-24.png})]
[(#URL_ACTION_AUTEUR{rubrique_plugin_generer_prefixe, '', #SELF}
|icone_horizontale{<:contrib:rubrique_plugin_generer_prefixe_label:>, rubrique_plugin-24.png})]
[(#URL_ACTION_AUTEUR{rubrique_plugin_synchroniser_texte, '', #SELF}
|icone_horizontale{<:contrib:rubrique_plugin_synchroniser_texte_label:>, rubrique_plugin-24.png})]
#BOITE_FERMER
]

Loading…
Cancel
Save