Commit 531a87c3 authored by Matthieu Marcillaud's avatar Matthieu Marcillaud
Browse files

Début de plugin pour stocker des propositions de modifications diverses sur...

Début de plugin pour stocker des propositions de modifications diverses sur les objets éditoriaux de SPIP.
- On stocke dans la table 'spip_propositions_modifications' chaque proposition.
- Une proposition peut contenir différentes données, stockées dans le champ 'data' au format json.
- Un champ 'suivi' tient un journal pour savoir qui/quand a intégré / traité / refusé ou pas la proposition.
parents
Pipeline #92 failed with stages
<?php
/**
* Déclarations relatives à la base de données
*
* @plugin Propositions de modifications
* @copyright 2019
* @author Matthieu Marcillaud
* @licence GNU/GPL
* @package SPIP\Propositions_modifications\Pipelines
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Déclaration des alias de tables et filtres automatiques de champs
*
* @pipeline declarer_tables_interfaces
* @param array $interfaces
* Déclarations d'interface pour le compilateur
* @return array
* Déclarations d'interface pour le compilateur
*/
function propositions_modifications_declarer_tables_interfaces($interfaces) {
$interfaces['table_des_tables']['propositions_modifications'] = 'propositions_modifications';
return $interfaces;
}
/**
* Déclaration des tables principales
*
* @pipeline declarer_tables_principales
* @param array $tables
* Description des tables
* @return array
* Description complétée des tables
*/
function propositions_modifications_declarer_tables_principales($tables) {
$tables['spip_propositions_modifications'] = array(
'field'=> array(
'id_propositions_modification' => 'bigint(21) NOT NULL',
'objet' => 'varchar(255) NOT NULL DEFAULT ""',
'id_objet' => 'bigint(21) NOT NULL DEFAULT 0',
'source' => 'varchar(255) NOT NULL DEFAULT ""',
'data' => 'longtext NOT NULL DEFAULT ""',
'suivi' => 'mediumtext NOT NULL DEFAULT ""',
'date' => 'datetime NOT NULL DEFAULT "0000-00-00 00:00:00"',
'statut' => 'varchar(20) DEFAULT "0" NOT NULL',
'maj' => 'TIMESTAMP'
),
'key' => array(
'PRIMARY KEY' => 'id_propositions_modification',
'KEY objet' => 'objet',
'KEY id_objet' => 'id_objet',
'KEY statut' => 'statut',
),
);
return $tables;
}
<?php
/**
* Enregistre une proposition de modification pour l’élément indiqué
*
* @api
* @param string $objet Type d’objet éditorial (auteur, article)
* @param int $id_objet Identifiant de l’objet
* @param string $source Source des données (twitter, facebook, linkedin, ...)
* @param mixed $data Données (sera enregistré en json)
* @return false|int
* - false : erreur,
* - int : identifiant de la proposition de modification
* @example
* $proposer_modifications = charger_fonction('proposer_modifications', 'inc');
* $ok = $proposer_modifications('auteur', 3, 'events', [
* 'name' => 'Alexander Flemming',
* 'address' => 'New York',
* // ...
* ]);
* @throws Exception
*/
function inc_proposer_modifications_dist(string $objet, int $id_objet, string $source, $data) {
$objet = objet_type($objet);
if (!$objet or !$id_objet or !$data) {
return false;
}
if (!is_string($data)) {
$data = json_encode($data, JSON_PRETTY_PRINT | JSON_OBJECT_AS_ARRAY);
}
include_spip('base/abstract_sql');
$id = sql_insertq('spip_propositions_modifications', [
'objet' => $objet,
'id_objet' => $id_objet,
'source' => $source,
'data' => $data,
'date' => (new DateTime())->format('Y-m-d H:i:s'),
'statut' => 'propose',
]);
if (!$id) {
return false;
}
ajouter_suivi_propositions_modifications($id, [
'auteur' => 'Script',
'id_auteur' => 0,
'statut' => 'propose',
]);
return $id ?: false;
}
/**
* Ajoute une information de suivi (auteur, date, statut) de la modification
*
* @param int $id_propositions_modification
* @param array $data
* @return bool true si OK, false sinon.
* @throws Exception
*/
function ajouter_suivi_propositions_modifications(int $id_propositions_modification, $data = []) {
$suivi = sql_getfetsel(
'suivi',
'spip_propositions_modifications',
'id_propositions_modification = ' . $id_propositions_modification
);
if ($suivi) {
$suivi = json_decode($suivi, true);
}
if (!is_array($suivi)) {
$suivi = [];
}
if (!isset($data['id_auteur'])) {
include_spip('inc/session');
$data['id_auteur'] = session_get('id_auteur');
$data['auteur'] = session_get('nom');
}
if (empty($data['date'])) {
$data['date'] = (new DateTime())->format('Y-m-d H:i:s');
}
$suivi[] = $data;
$suivi = json_encode($suivi, JSON_PRETTY_PRINT | JSON_OBJECT_AS_ARRAY);
return sql_updateq(
'spip_propositions_modifications',
['suivi' => $suivi],
'id_propositions_modification = ' . $id_propositions_modification
);
}
\ No newline at end of file
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// P
'propositions_modifications_description' => 'Offre une API pour stocker des propositions de modifications sur les objets éditoriaux de SPIP, avec une interface pour les lister, les prendre en compte ou invalider ; les traitements des modifications sont à réaliser manuellement par les administrateurs (par défaut) mais peuvent être semi-automatisés avec des fonctions dédiées.',
'propositions_modifications_nom' => 'Propositions de modifications',
'propositions_modifications_slogan' => 'Propositions de modifications sur les contenus',
);
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// A
'ajouter_lien_propositions_modification' => 'Ajouter cette proposition de modification',
// C
'champ_data_explication' => 'Données proposées (format JSON)',
'champ_data_label' => 'Données',
'champ_id_propositions_modification_label' => 'Id Objet',
'champ_propositions_modification_label' => 'Objet',
'champ_source_label' => 'Source',
'champ_suivi_label' => 'Suivi',
'confirmer_supprimer_propositions_modification' => 'Confirmez-vous la suppression de cette proposition de modification ?',
// I
'icone_creer_propositions_modification' => 'Créer une proposition de modification',
'icone_modifier_propositions_modification' => 'Modifier cette proposition de modification',
'info_1_propositions_modification' => 'Une proposition de modification',
'info_aucun_propositions_modification' => 'Aucune proposition de modification',
'info_nb_propositions_modifications' => '@nb@ propositions de modification',
'info_propositions_modifications_auteur' => 'Les propositions de modification de cet auteur',
// R
'retirer_lien_propositions_modification' => 'Retirer cette proposition de modification',
'retirer_tous_liens_propositions_modifications' => 'Retirer toutes les propositions de modification',
// S
'supprimer_propositions_modification' => 'Supprimer cette proposition de modification',
// T
'texte_ajouter_propositions_modification' => 'Ajouter une proposition de modification',
'texte_changer_statut_propositions_modification' => 'Cette proposition de modification est :',
'texte_creer_associer_propositions_modification' => 'Créer et associer une proposition de modification',
'texte_definir_comme_traduction_propositions_modification' => 'Cette proposition de modification est une traduction de la proposition de modification numéro :',
'titre_langue_propositions_modification' => 'Langue de cette proposition de modification',
'titre_logo_propositions_modification' => 'Logo de cette proposition de modification',
'titre_objets_lies_propositions_modification' => 'Liés à cette proposition de modification',
'titre_propositions_modification' => 'Proposition de modification',
'titre_propositions_modifications' => 'Propositions de modification',
'titre_propositions_modifications_rubrique' => 'Propositions de modification de la rubrique',
);
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// P
'propositions_modifications_titre' => 'Propositions de modifications',
);
<paquet
prefix="propositions_modifications"
categorie="edition"
version="1.0.0"
etat="dev"
compatibilite="[3.2.0;3.2.*]"
logo="prive/themes/spip/images/propositions_modifications-64.png"
documentation=""
schema="1.0.0"
>
<nom>Propositions de modifications</nom>
<!-- Propositions de modifications sur les contenus -->
<auteur>Matthieu Marcillaud</auteur>
<credit lien="https://www.flaticon.com/authors/gregor-cresnar">Logo by Gregor Cresnar from Flaticon</credit>
<licence>GNU/GPL</licence>
<necessite nom="saisies" compatibilite="[2.28.0;]" />
<pipeline nom="autoriser" inclure="propositions_modifications_autorisations.php" />
<pipeline nom="declarer_tables_principales" inclure="base/propositions_modifications.php" />
<pipeline nom="declarer_tables_interfaces" inclure="base/propositions_modifications.php" />
<pipeline nom="optimiser_base_disparus" inclure="propositions_modifications_pipelines.php" />
</paquet>
<BOUCLE_propositions_modification(PROPOSITIONS_MODIFICATIONS){id_propositions_modification}{statut?}>
[<div class="champ contenu_objet[ (#OBJET*|strlen|?{'',vide})]">
<div class="label"><:propositions_modification:champ_objet_label:> : </div>
<span dir="#LANG_DIR" class="#EDIT{objet} objet">(#OBJET)</span>
</div>]
[<div class="champ contenu_id_objet[ (#ID_OBJET*|strlen|?{'',vide})]">
<div class="label"><:propositions_modification:champ_id_objet_label:> : </div>
<span dir="#LANG_DIR" class="#EDIT{id_objet} id_objet">(#ID_OBJET)</span>
</div>]
[<div class="champ contenu_source[ (#SOURCE*|strlen|?{'',vide})]">
<div class="label"><:propositions_modification:champ_source_label:> : </div>
<span dir="#LANG_DIR" class="#EDIT{source} source">(#SOURCE)</span>
</div>]
[<div class="champ contenu_data[ (#DATA*|strlen|?{'',vide})]">
<div class="label"><:propositions_modification:champ_data_label:> : </div>
<span dir="#LANG_DIR" class="#EDIT{data} data">(#DATA)</span>
</div>]
[<div class="champ contenu_suivi[ (#SUIVI*|strlen|?{'',vide})]">
<div class="label"><:propositions_modification:champ_suivi_label:> : </div>
<span dir="#LANG_DIR" class="#EDIT{suivi} suivi">(#SUIVI)</span>
</div>]
</BOUCLE_propositions_modification>
[(#SET{defaut_tri,#ARRAY{
date,-1,
id_propositions_modification,1,
points,-1
}})]<B_liste_propositions_modifications>
#ANCRE_PAGINATION
<div class="liste-objets propositions_modifications">
<table class="spip liste">
[<caption><strong class="caption">(#ENV*{titre,#GRAND_TOTAL|singulier_ou_pluriel{propositions_modification:info_1_propositions_modification,propositions_modification:info_nb_propositions_modifications}})</strong></caption>]
<thead>
<tr class="first_row">
<th class="picto" scope="col"></th>
<th class="statut" scope="col">[(#TRI{statut,<span title="<:lien_trier_statut|attribut_html:>">#</span>,ajax})]</th>
<th class="" scope="col">[(#TRI{,<:propositions_modification:champ__label:>,ajax})]</th>
<th class="date" scope="col">[(#TRI{date,<:date:>,ajax})]</th>
<th class="id" scope="col">[(#TRI{id_propositions_modification,<:info_numero_abbreviation:>,ajax})]</th>
</tr>
</thead>
<tbody>
<BOUCLE_liste_propositions_modifications(PROPOSITIONS_MODIFICATIONS){id_objet?}{id_mot?}{id_auteur?}{where?}{statut?}{recherche?}{tri #ENV{par,num },#GET{defaut_tri}}{par }{pagination #ENV{nb,10}}>
<tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]">
<td class="picto">[(#CHEMIN_IMAGE{propositions_modification-16.png}|balise_img)]</td>
<td class="statut">[(#STATUT|puce_statut{propositions_modification,#ID_PROPOSITIONS_MODIFICATION})]</td>
<td class=" principale">[(#LOGO_PROPOSITIONS_MODIFICATION|image_reduire{20,26})]<a href="[(#ID_PROPOSITIONS_MODIFICATION|generer_url_entite{propositions_modification})]" title="<:info_numero_abbreviation|attribut_html:> #ID_PROPOSITIONS_MODIFICATION">[(#RANG). ]#</a></td>
<td class="date secondaire">[(#DATE|affdate_jourcourt)]</td>
<td class="id">[(#AUTORISER{modifier,propositions_modification,#ID_PROPOSITIONS_MODIFICATION}|?{
<a href="[(#URL_ECRIRE{propositions_modification_edit,id_propositions_modification=#ID_PROPOSITIONS_MODIFICATION})]">#ID_PROPOSITIONS_MODIFICATION</a>,
#ID_PROPOSITIONS_MODIFICATION
})]</td>
</tr>
</BOUCLE_liste_propositions_modifications>
</tbody>
</table>
[<p class="pagination">(#PAGINATION{prive})</p>]
</div>
</B_liste_propositions_modifications>[
<div class="liste-objets propositions_modifications caption-wrap"><strong class="caption">(#ENV*{sinon,''})</strong></div>
]<//B_liste_propositions_modifications>
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment