Accrobranche : en fait on déplace le plugin Abonnements nouvelle génération dans un dossier du même nom que son préfixe, qui n'est plus le même que l'ancienne version. Tout ça n'est en effet pas compatible même si c'est inspiré et à la suite de ce qui existait avant. Le préfixe et le dossier du nouveau suive un nommage plus habituel, avec le nom au pluriel, et les fonctionnalités ne sont pas du tout implémentée pareille, pas la même architecture, etc.

v2
rastapopoulos@spip.org 9 years ago
commit b6cc82c746

71
.gitattributes vendored

@ -0,0 +1,71 @@
* text=auto !eol
/abonnements_administrations.php -text
/abonnements_autorisations.php -text
/abonnements_pipelines.php -text
action/modifier_echeance_abonnement.php -text
action/renouveler_abonnement.php -text
base/abonnements.php -text
formulaires/editer_abonnement.html -text
formulaires/editer_abonnement.php -text
formulaires/editer_abonnements_offre.html -text
formulaires/editer_abonnements_offre.php -text
formulaires/editer_abonnements_offre_notifications.html -text
formulaires/editer_abonnements_offre_notifications.php -text
genie/abonnements_verifier_desactivation.php -text
genie/abonnements_verifier_notifications.php -text
inc/abonnements.php -text
lang/abonnement_fr.php -text
lang/abonnementsoffre_fr.php -text
lang/paquet-abonnements_fr.php -text
notifications/abonnement_echeance.html -text
/paquet.xml -text
prive/objets/contenu/abonnement.html -text
prive/objets/contenu/abonnements_offre-enfants.html -text
prive/objets/contenu/abonnements_offre.html -text
prive/objets/liste/abonnements.html -text
prive/objets/liste/abonnements_offres.html -text
prive/squelettes/contenu/abonnement.html -text
prive/squelettes/contenu/abonnement_edit.html -text
prive/squelettes/contenu/abonnements.html -text
prive/squelettes/hierarchie/abonnement.html -text
prive/squelettes/hierarchie/abonnement_edit.html -text
prive/squelettes/inclure/abonnements_auteur.html -text
prive/squelettes/navigation/inc-abonnements_notifications.html -text
prive/themes/spip/images/abonnement-16.png -text
prive/themes/spip/images/abonnement-24.png -text
prive/themes/spip/images/abonnement-32.png -text
prive/themes/spip/images/abonnement-add-16.png -text
prive/themes/spip/images/abonnement-add-24.png -text
prive/themes/spip/images/abonnement-add-32.png -text
prive/themes/spip/images/abonnement-del-16.png -text
prive/themes/spip/images/abonnement-del-24.png -text
prive/themes/spip/images/abonnement-del-32.png -text
prive/themes/spip/images/abonnement-edit-16.png -text
prive/themes/spip/images/abonnement-edit-24.png -text
prive/themes/spip/images/abonnement-edit-32.png -text
prive/themes/spip/images/abonnement-new-16.png -text
prive/themes/spip/images/abonnement-new-24.png -text
prive/themes/spip/images/abonnement-new-32.png -text
prive/themes/spip/images/abonnements-128.png -text
prive/themes/spip/images/abonnements-32.png -text
prive/themes/spip/images/abonnements-64.png -text
prive/themes/spip/images/abonnements_offre-16.png -text
prive/themes/spip/images/abonnements_offre-24.png -text
prive/themes/spip/images/abonnements_offre-32.png -text
prive/themes/spip/images/abonnements_offre-add-16.png -text
prive/themes/spip/images/abonnements_offre-add-24.png -text
prive/themes/spip/images/abonnements_offre-add-32.png -text
prive/themes/spip/images/abonnements_offre-del-16.png -text
prive/themes/spip/images/abonnements_offre-del-24.png -text
prive/themes/spip/images/abonnements_offre-del-32.png -text
prive/themes/spip/images/abonnements_offre-edit-16.png -text
prive/themes/spip/images/abonnements_offre-edit-24.png -text
prive/themes/spip/images/abonnements_offre-edit-32.png -text
prive/themes/spip/images/abonnements_offre-new-16.png -text
prive/themes/spip/images/abonnements_offre-new-24.png -text
prive/themes/spip/images/abonnements_offre-new-32.png -text
prive/themes/spip/images/arrow_refresh-16.png -text
prive/themes/spip/images/arrow_refresh-24.png -text
prive/themes/spip/images/arrow_refresh-32.png -text
saisies-vues/abonnements_offres.html -text
saisies/abonnements_offres.html -text

@ -0,0 +1,46 @@
<?php
/**
* Plugin Abonnements
* (c) 2012 Les Développements Durables
* Licence GNU/GPL v3
*/
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Fonction d'installation du plugin et de mise à jour.
**/
function abonnements_upgrade($nom_meta_base_version, $version_cible) {
$maj = array();
$maj['create'] = array(array('maj_tables', array('spip_abonnements_offres', 'spip_abonnements_offres_liens', 'spip_abonnements', 'spip_abonnements_offres_notifications')));
// Ajout de la config des notifications
$maj['2.1.0'] = array(
array('maj_tables', array('spip_abonnements_offres_notifications'))
);
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
}
/**
* Fonction de désinstallation du plugin.
**/
function abonnements_vider_tables($nom_meta_base_version) {
sql_drop_table("spip_abonnements_offres");
sql_drop_table("spip_abonnements_offres_liens");
sql_drop_table("spip_abonnements");
# Nettoyer les versionnages et forums
sql_delete("spip_versions", sql_in("objet", array('abonnements_offre', 'abonnement')));
sql_delete("spip_versions_fragments", sql_in("objet", array('abonnements_offre', 'abonnement')));
sql_delete("spip_forum", sql_in("objet", array('abonnements_offre', 'abonnement')));
effacer_meta($nom_meta_base_version);
}
?>

@ -0,0 +1,75 @@
<?php
/**
* Plugin Abonnements
* (c) 2012 Les Développements Durables
* Licence GNU/GPL v3
*/
if (!defined('_ECRIRE_INC_VERSION')) return;
// declaration vide pour ce pipeline.
function abonnements_autoriser(){}
// -----------------
// Objet abonnements_offres
// bouton de menu
function autoriser_abonnementsoffres_menu_dist($faire, $type, $id, $qui, $opts){
return true;
}
// creer
function autoriser_abonnementsoffre_creer_dist($faire, $type, $id, $qui, $opt) {
return $qui['statut'] == '0minirezo' AND !$qui['restreint'];
}
// voir les fiches completes
function autoriser_abonnementsoffre_voir_dist($faire, $type, $id, $qui, $opt) {
return true;
}
// modifier
function autoriser_abonnementsoffre_modifier_dist($faire, $type, $id, $qui, $opt) {
return $qui['statut'] == '0minirezo' AND !$qui['restreint'];
}
// supprimer
function autoriser_abonnementsoffre_supprimer_dist($faire, $type, $id, $qui, $opt) {
return $qui['statut'] == '0minirezo' AND !$qui['restreint'];
}
// associer (lier / delier)
function autoriser_associerabonnementsoffres_dist($faire, $type, $id, $qui, $opt) {
return $qui['statut'] == '0minirezo' AND !$qui['restreint'];
}
// -----------------
// Objet abonnements
// creer
function autoriser_abonnement_creer_dist($faire, $type, $id, $qui, $opt) {
return $qui['statut'] == '0minirezo' AND !$qui['restreint'];
}
// voir les fiches completes
function autoriser_abonnement_voir_dist($faire, $type, $id, $qui, $opt) {
return true;
}
// modifier
function autoriser_abonnement_modifier_dist($faire, $type, $id, $qui, $opt) {
return $qui['statut'] == '0minirezo' AND !$qui['restreint'];
}
// supprimer
function autoriser_abonnement_supprimer_dist($faire, $type, $id, $qui, $opt) {
return $qui['statut'] == '0minirezo' AND !$qui['restreint'];
}
?>

@ -0,0 +1,139 @@
<?php
/**
* Plugin Abonnements
* (c) 2012 Les Développements Durables
* Licence GNU/GPL v3
*/
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Optimiser la base de donnees des abonnements
*
* @param int $n
* @return int
*/
function abonnements_optimiser_base_disparus($flux){
//Offres d'abonnement à la poubelle
sql_delete("spip_abonnements_offres", "statut='poubelle' AND maj < ".$flux['args']['date']);
//Supprimer les abonnements lies à une offre d'abonnement inexistante
$res = sql_select("DISTINCT abonnements.id_abonnements_offre","spip_abonnements AS abonnements
LEFT JOIN spip_abonnements_offres AS offres
ON abonnements.id_abonnements_offre=offres.id_abonnements_offre","offres.id_abonnements_offre IS NULL");
while ($row = sql_fetch($res))
sql_delete("spip_abonnements", "id_abonnements_offre=".$row['id_abonnements_offre']);
//Abonnements à la poubelle
sql_delete("spip_abonnements", "statut='poubelle' AND maj < ".$flux['args']['date']);
include_spip('action/editer_liens');
$flux['data'] += objet_optimiser_liens(array('abonnement'=>'*'),'*');
return $flux;
}
/*
* Des modifs supplémentaires après édition
*/
function abonnements_post_edition($flux){
// Si on modifie un abonnement
if ($flux['args']['table'] == 'spip_abonnements') {
$abonnement = sql_fetsel('*', 'spip_abonnements', 'id_abonnement = '.$flux['args']['id_objet']);
$offre = sql_fetsel('*', 'spip_abonnements_offres', 'id_abonnements_offre = '.$abonnement['id_abonnements_offre']);
$modifs = array();
// Si l'échéance est VIDE, et que pourtant l'offre parente A BIEN une durée
// alors c'est qu'il faut initialiser l'échéance !
if ($abonnement['date_fin'] == '0000-00-00 00:00:00' and ($duree = $offre['duree']) > 0){
// De combien doit-on augmenter la date
switch ($offre['periode']){
case 'heures':
$ajout = " + ${duree} hours";
break;
case 'jours':
$ajout = " + ${duree} days";
break;
case 'mois':
$ajout = " + ${duree} months";
break;
default:
$ajout ='';
break;
}
// Calcul de la date de fin
$modifs['date_fin'] = date('Y-m-d H:i:s', strtotime($abonnement['date_debut'].$ajout));
}
// S'il le statut est "prepa" c'est une création et on doit changer ça
// car pour l'instant SPIP ne permet pas de déclarer le statut par défaut !
if ($abonnement['statut'] == 'prepa'){
$modifs['statut'] = 'actif';
}
// S'il y a des modifs à faire on appelle l'API de modif
if (!empty($modifs)){
include_spip('action/editer_objet');
objet_modifier('abonnement', $flux['args']['id_objet'], $modifs);
}
// Si dans les modifications demandées au départ, il y a la date de fin, on reprogramme la désactivation
if (isset($flux['data']['date_fin'])) {
include_spip('inc/abonnements');
abonnements_programmer_desactivation($flux['args']['id_objet'], $flux['data']['date_fin']);
}
}
return $flux;
}
/*
* Ajout d'une tache CRON pour vérifier toutes les heures si les abonnements actifs ont une tâche de désactivation
*/
function abonnements_taches_generales_cron($taches){
$taches['abonnements_verifier_desactivation'] = 60 * 60; // toutes les heures
$taches['abonnements_verifier_notifications'] = 24 * 3600; // une fois par jour
return $taches;
}
/*
* Ajouter la config des notifications
*/
function abonnements_affiche_gauche($flux){
if ($flux['args']['exec'] == 'abonnements_offre'){
$flux['data'] .= recuperer_fond(
'prive/squelettes/navigation/inc-abonnements_notifications',
array('id_abonnements_offre' => $flux['args']['id_abonnements_offre'])
);
}
return $flux;
}
/*
* Ajouter la boite des abonnements sur la fiche auteur
*/
function abonnements_affiche_milieu($flux){
if ($e = trouver_objet_exec($flux['args']['exec'])
AND $e['type'] == 'auteur'
AND $e['edition'] == false) {
$id_auteur = $flux['args']['id_auteur'];
$ins = recuperer_fond('prive/squelettes/inclure/abonnements_auteur',array('id_auteur'=>$id_auteur));
if (($p = strpos($flux['data'],"<!--affiche_milieu-->")) !== false)
$flux['data'] = substr_replace($flux['data'],$ins,$p,0);
else
$flux['data'] .= $ins;
}
return $flux;
}
?>

@ -0,0 +1,69 @@
<?php
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Action de modif de l'échéance d'un abonnement
* @param unknown_type $arg
* @return unknown_type
*/
function action_modifier_echeance_abonnement_dist($arg=null) {
if (is_null($arg)){
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
list($id_abonnement, $duree, $periode) = explode('/', $arg);
// Si on a bien un abonnement et qu'on a le droit de le modifier et qu'on a une durée != 0
if (
$duree = intval($duree)
and $id_abonnement = intval($id_abonnement)
and autoriser('modifier', 'abonnement', $id_abonnement)
and $abonnement = sql_fetsel('date_debut, date_fin', 'spip_abonnements', 'id_abonnement = '.$id_abonnement)
) {
$date_depart = $abonnement['date_fin'];
if ($date_depart == '0000-00-00 00:00:00'){
$date_depart = $abonnement['date_debut'];
}
// De combien doit-on modifier la date
switch ($periode){
case 'heures':
$ajout = " ${duree} hours";
break;
case 'jours':
$ajout = " ${duree} days";
break;
case 'mois':
$ajout = " ${duree} months";
break;
default:
$ajout ='';
break;
}
// Si la période existe
if ($ajout){
// Si la durée est positive, on ajoute un + devant (le - est déjà là pour les négatives)
if ($duree > 0){
$ajout = ' +'.$ajout;
}
// Calcul de la date de fin
$nouvelle_echeance = date('Y-m-d H:i:s', strtotime($date_depart.$ajout));
// On lance la modification
include_spip('action/editer_objet');
$erreur = objet_modifier('abonnement', $id_abonnement, array('date_fin' => $nouvelle_echeance));
return array($id_abonnement, $erreur);
}
}
return false;
}
?>

@ -0,0 +1,69 @@
<?php
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Action de renouveler un abonnement
* @param int $arg
* @return unknown_type
*/
function action_renouveler_abonnement_dist($arg=null) {
if (is_null($arg)){
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
// Si on a bien un abonnement et qu'on a le droit de le modifier
if (
$id_abonnement = intval($arg)
and autoriser('modifier', 'abonnement', $id_abonnement)
and $abonnement = sql_fetsel('id_abonnements_offre, date_debut, date_fin', 'spip_abonnements', 'id_abonnement = '.$id_abonnement)
) {
$offre = sql_fetsel('duree, periode', 'spip_abonnements_offres', 'id_abonnements_offre = '.$abonnement['id_abonnements_offre']);
// Si l'offre parente A BIEN une durée
if (($duree = $offre['duree']) > 0){
// De combien doit-on augmenter la date ?
switch ($offre['periode']){
case 'heures':
$ajout = " + ${duree} hours";
break;
case 'jours':
$ajout = " + ${duree} days";
break;
case 'mois':
$ajout = " + ${duree} months";
break;
default:
$ajout = NULL;
break;
}
}
$date_depart = $abonnement['date_fin'];
if ($date_depart == '0000-00-00 00:00:00'){
$date_depart = $abonnement['date_debut'];
}
// Si la période existe
if (isset($ajout)){
// Calcul de la date de fin
$nouvelle_echeance = date('Y-m-d H:i:s', strtotime($date_depart.$ajout));
// On lance la modification
include_spip('action/editer_objet');
$erreur = objet_modifier('abonnement', $id_abonnement, array('date_fin' => $nouvelle_echeance, 'statut' => 'actif'));
return array($id_abonnement, $erreur);
}
}
return false;
}
?>

@ -0,0 +1,169 @@
<?php
/**
* Plugin Abonnements
* (c) 2012 Les Développements Durables
* Licence GNU/GPL v3
*/
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Déclaration des alias de tables et filtres automatiques de champs
*/
function abonnements_declarer_tables_interfaces($interfaces) {
$interfaces['table_des_tables']['abonnements_offres'] = 'abonnements_offres';
$interfaces['table_des_tables']['abonnements'] = 'abonnements';
$interfaces['table_des_tables']['abonnements_offres_notifications'] = 'abonnements_offres_notifications';
return $interfaces;
}
/**
* Déclaration des objets éditoriaux
*/
function abonnements_declarer_tables_objets_sql($tables) {
$tables['spip_abonnements_offres'] = array(
'type' => 'abonnements_offre',
'principale' => "oui",
'table_objet_surnoms' => array('abonnementsoffre'), // table_objet('abonnement') => 'abonnements_offres'
'field'=> array(
"id_abonnements_offre" => "bigint(21) NOT NULL",
"titre" => "text NOT NULL DEFAULT ''",
"descriptif" => "text NOT NULL DEFAULT ''",
"duree" => "int(11) NOT NULL DEFAULT 0",
"periode" => "varchar(25) NOT NULL DEFAULT ''",
'prix' => 'float(10,2) not null default 0',
"statut" => "varchar(20) DEFAULT '0' NOT NULL",
"maj" => "TIMESTAMP"
),
'key' => array(
"PRIMARY KEY" => "id_abonnements_offre",
"KEY statut" => "statut",
),
'titre' => "titre AS titre, '' AS lang",
#'date' => "",
'champs_editables' => array('titre', 'descriptif', 'duree', 'periode', 'prix'),
'champs_versionnes' => array('titre', 'descriptif', 'duree', 'periode', 'prix'),
'rechercher_champs' => array("titre" => 10, "descriptif" => 5),
'tables_jointures' => array('spip_abonnements_offres_liens'),
'statut_textes_instituer' => array(
'prepa' => 'texte_statut_en_cours_redaction',
'publie' => 'texte_statut_publie',
'poubelle' => 'texte_statut_poubelle',
),
'statut'=> array(
array(
'champ' => 'statut',
'publie' => 'publie',
'previsu' => 'publie,prepa',
'exception' => array('statut','tout')
)
),
'texte_modifier' => 'abonnementsoffre:icone_modifier_abonnementsoffre',
'texte_creer' => 'abonnementsoffre:icone_creer_abonnementsoffre',
'texte_creer_associer' => 'abonnementsoffre:texte_creer_associer_abonnementsoffre',
'texte_ajouter' => 'abonnementsoffre:texte_ajouter_abonnementsoffre',
'texte_objets' => 'abonnementsoffre:titre_abonnementsoffres',
'texte_objet' => 'abonnementsoffre:titre_abonnementsoffre',
'texte_logo_objet' => 'abonnementsoffre:titre_logo_abonnementsoffre',
'texte_langue_objet' => 'abonnementsoffre:titre_langue_abonnementsoffre',
'info_aucun_objet' => 'abonnementsoffre:info_aucun_abonnementsoffre',
'info_1_objet' => 'abonnementsoffre:info_1_abonnementsoffre',
'info_nb_objets' => 'abonnementsoffre:info_nb_abonnementsoffres',
'texte_changer_statut' => 'abonnementsoffre:texte_changer_statut_abonnementsoffre',
);
$tables['spip_abonnements'] = array(
'type' => 'abonnement',
'principale' => "oui",
# 'url_voir' => false,
# 'url_edit' => false,
'field'=> array(
"id_abonnement" => "bigint(21) NOT NULL",
"id_abonnements_offre" => "bigint(21) NOT NULL DEFAULT 0",
"id_auteur" => "bigint(21) NOT NULL DEFAULT 0",
"date_debut" => "datetime NOT NULL DEFAULT '0000-00-00 00:00:00'",
"date_fin" => "datetime NOT NULL DEFAULT '0000-00-00 00:00:00'",
"statut" => "varchar(20) DEFAULT '0' NOT NULL",
"maj" => "TIMESTAMP"
),
'key' => array(
"PRIMARY KEY" => "id_abonnement",
"KEY statut" => "statut",
"KEY id_abonnements_offre" => "id_abonnements_offre",
"KEY id_auteur" => "id_auteur",
),
'titre' => "'' AS titre, '' AS lang",
'date' => "date_debut",
'champs_editables' => array('id_abonnements_offre', 'id_auteur', 'date_debut', 'date_fin'),
'champs_versionnes' => array('id_abonnements_offre', 'id_auteur', 'date_debut', 'date_fin'),
'rechercher_champs' => array(),
'tables_jointures' => array(),
'statut_textes_instituer' => array(
'actif' => 'abonnement:statut_actif',
'inactif' => 'abonnement:statut_inactif',
'poubelle' => 'texte_statut_poubelle',
),
'statut_images' => array(
'prepa' => 'puce-preparer-8.png',
'actif' => 'puce-publier-8.png',
'inactif' => 'puce-refuser-8.png',
'poubelle' => 'puce-supprimer-8.png',
),
'statut'=> array(
array(
'champ' => 'statut',
'publie' => 'actif',
'previsu' => 'actif,inactif',
'exception' => array('statut','tout')
)
),
'texte_changer_statut' => 'abonnement:texte_changer_statut_abonnement',
);
return $tables;
}
/*
* Déclaration des tables principales non objet
*/
function abonnements_declarer_tables_principales($tables) {
$tables['spip_abonnements_offres_notifications'] = array(
'field' => array(
'id_abonnements_offres_notification' => 'bigint(21) not null',
'id_abonnements_offre' => 'bigint(21) DEFAULT 0 NOT NULL',
'duree' => 'int(11) NOT NULL DEFAULT 0',
'periode' => 'varchar(25) NOT NULL DEFAULT ""',
),
'key' => array(
'PRIMARY KEY' => 'id_abonnements_offres_notification',
'KEY id_abonnements_offre' => 'id_abonnements_offre',
),
);
return $tables;
}
/**
* Déclaration des tables secondaires (liaisons)
*/
function abonnements_declarer_tables_auxiliaires($tables) {
$tables['spip_abonnements_offres_liens'] = array(
'field' => array(
"id_abonnements_offre" => "bigint(21) DEFAULT '0' NOT NULL",
"id_objet" => "bigint(21) DEFAULT '0' NOT NULL",
"objet" => "VARCHAR(25) DEFAULT '' NOT NULL",
"vu" => "VARCHAR(6) DEFAULT 'non' NOT NULL"
),
'key' => array(
"PRIMARY KEY" => "id_abonnements_offre,id_objet,objet",
"KEY id_abonnements_offre" => "id_abonnements_offre"
)
);
return $tables;
}
?>

@ -0,0 +1,192 @@
<?php
/**
* Plugin Abonnements
* (c) 2012 Les Développements Durables
* Licence GNU/GPL v3
*/
if (!defined('_ECRIRE_INC_VERSION')) return;
include_spip('inc/actions');
include_spip('inc/editer');
/*
* Déclaration des champs du formulaire
*/
function formulaires_editer_abonnement_saisies_dist($id_abonnement='new', $retour='', $lier_trad=0, $config_fonc='', $row=array(), $hidden=''){
$id_abonnement = intval($id_abonnement);
// Si c'est une demande de création et qu'on trouve une offre, on ne doit donner que l'utilisateur et l'abonnement est défini caché
if ($id_abonnement == 0 and $id_abonnements_offre = _request('id_abonnements_offre')) {
$saisies = array(
array(
'saisie' => 'hidden',
'options' => array(
'nom' => 'id_abonnements_offre',
'defaut' => $id_abonnements_offre,
),
),
array(
'saisie' => 'auteurs',
'options' => array(
'nom' => 'id_auteur',
'label' => _T('abonnement:champ_id_auteur_label'),
'obligatoire' => 'oui',
'cacher_option_intro' => 'oui',
),
),
);
}
// Sinon si c'est une demande de création et qu'on trouve un auteur, on ne doit donner que les offres et l'utilisateur est défini caché
elseif ($id_abonnement == 0 and $id_auteur = _request('id_auteur')) {
$saisies = array(
array(
'saisie' => 'hidden',
'options' => array(
'nom' => 'id_auteur',
'defaut' => $id_auteur,
),
),
array(
'saisie' => 'abonnements_offres',
'options' => array(
'nom' => 'id_abonnements_offre',
'label' => _T('abonnement:champ_id_abonnements_offre_label'),
'obligatoire' => 'oui',
'cacher_option_intro' => 'oui',
),
),
);
}
// Sinon si c'est une demande de modification, on ne peut modifier que l'échéance
// Et uniquement en ajoutant avec durée et période
elseif ($id_abonnement > 0) {
$saisies = array(
array(
'saisie' => 'date',
'options' => array(
'nom' => 'date_debut',
'label' => _T('abonnement:champ_date_debut_label'),
'horaire' => 'on',
'heure_pas' => 5,
),
'verifier' => array(
'type' => 'date',
'options' => array(
'normaliser' => 'datetime',
),
),
),
array(
'saisie' => 'date',
'options' => array(
'nom' => 'date_fin',
'label' => _T('abonnement:champ_date_fin_label'),
'horaire' => 'on',
'heure_pas' => 5,
),
'verifier' => array(
'type' => 'date',
'options' => array(
'normaliser' => 'datetime',
),
),
),
);
# $saisies = array(
# array(
# 'saisie' => 'fieldset',
# 'options' => array(
# 'nom' => 'date_fin_allonger',
# 'label' => _T('abonnement:champ_date_fin_allonger_label'),
# ),
# 'saisies' => array(
# array(
# 'saisie' => 'input',
# 'options' => array(
# 'nom' => 'duree',
# 'label' => _T('abonnementsoffre:champ_duree_label'),
# 'defaut' => 0,
# ),
# 'verifier' => array(
# 'type' => 'entier',
# ),
# ),
# array(
# 'saisie' => 'selection',
# 'options' => array(
# 'nom' => 'periode',
# 'label' => _T('abonnementsoffre:champ_periode_label'),
# 'cacher_option_intro' => 'oui',
# 'datas' => array(
# 'mois' => _T('abonnementsoffre:champ_periode_choix_mois'),
# 'jours' => _T('abonnementsoffre:champ_periode_choix_jours'),
# 'heures' => _T('abonnementsoffre:champ_periode_choix_heures'),
# ),
# ),
# ),
# ),
# ),
# );
}
return $saisies;
}
/**
* Identifier le formulaire en faisant abstraction des parametres qui ne representent pas l'objet edite
*/
function formulaires_editer_abonnement_identifier_dist($id_abonnement='new', $retour='', $lier_trad=0, $config_fonc='', $row=array(), $hidden=''){
return serialize(array(intval($id_abonnement)));
}
/**
* Declarer les champs postes et y integrer les valeurs par defaut
*/
function formulaires_editer_abonnement_charger_dist($id_abonnement='new', $retour='', $lier_trad=0, $config_fonc='', $row=array(), $hidden=''){
$valeurs = formulaires_editer_objet_charger('abonnement',$id_abonnement,'',$lier_trad,$retour,$config_fonc,$row,$hidden);
unset($valeurs['id_abonnement']);
return $valeurs;
}
/**
* Verifier les champs postes et signaler d'eventuelles erreurs
*/
function formulaires_editer_abonnement_verifier_dist($id_abonnement='new', $retour='', $lier_trad=0, $config_fonc='', $row=array(), $hidden=''){
$erreurs = array();//formulaires_editer_objet_verifier('abonnement',$id_abonnement);
// Pour une création on vérifie l'offre
if (
!intval($id_abonnement)
and (
!$id_abonnements_offre = _request('id_abonnements_offre')
or !sql_getfetsel('id_abonnements_offre', 'spip_abonnements_offres', 'id_abonnements_offre = '.intval($id_abonnements_offre))
)
) {
$erreurs['message_erreur'] = _T('abonnement:erreur_id_abonnements_offre');
}
return $erreurs;
}
/**
* Traiter les champs postes
*/
function formulaires_editer_abonnement_traiter_dist($id_abonnement='new', $retour='', $lier_trad=0, $config_fonc='', $row=array(), $hidden=''){
# // Si c'est pour une modif on appelle l'allongement
# if (intval($id_abonnement) > 0) {
# // On récupère les champs qui ne font pas partie de la table
# $duree = _request('duree');
# $periode = _request('periode');
# // On appelle l'action de modif d'échéance
# $modifier_echeance = charger_fonction('modifier_echeance_abonnement', 'action/');
# $modifier_echeance("$id_abonnement/$duree/$periode");
# }
$retours = formulaires_editer_objet_traiter('abonnement',$id_abonnement,'',$lier_trad,$retour,$config_fonc,$row,$hidden);
return $retours;
}
?>

@ -0,0 +1,113 @@
<?php
/**
* Plugin Abonnements
* (c) 2012 Les Développements Durables
* Licence GNU/GPL v3
*/
if (!defined('_ECRIRE_INC_VERSION')) return;
include_spip('inc/actions');
include_spip('inc/editer');
/*
* Déclaration des champs du formulaire
*/
function formulaires_editer_abonnements_offre_saisies_dist($id_abonnements_offre='new', $retour='', $lier_trad=0, $config_fonc='', $row=array(), $hidden=''){
return array(
array(
'saisie' => 'input',
'options' => array(
'nom' => 'titre',
'label' => _T('abonnementsoffre:champ_titre_label'),
'obligatoire' => 'oui',
),
),
array(
'saisie' => 'textarea',
'options' => array(
'nom' => 'descriptif',
'label' => _T('abonnementsoffre:champ_descriptif_label'),
'rows' => 10,
),
),
array(
'saisie' => 'input',
'options' => array(
'nom' => 'duree',
'label' => _T('abonnementsoffre:champ_duree_label'),
'obligatoire' => 'oui',
'defaut' => 0,
),
'verifier' => array(
'type' => 'entier',
'options' => array(
'min' => 0,
),
),
),
array(
'saisie' => 'selection',
'options' => array(
'nom' => 'periode',
'label' => _T('abonnementsoffre:champ_periode_label'),
'obligatoire' => 'oui',
'cacher_option_intro' => 'oui',
'datas' => array(
'mois' => _T('abonnementsoffre:champ_periode_choix_mois'),
'jours' => _T('abonnementsoffre:champ_periode_choix_jours'),
'heures' => _T('abonnementsoffre:champ_periode_choix_heures'),
),
'defaut' => 'mois',
),
),
array(
'saisie' => 'input',
'options' => array(
'nom' => 'prix',
'label' => _T('abonnementsoffre:champ_prix_label'),
'obligatoire' => 'oui',
'defaut' => 0,
),
'verifier' => array(
'type' => 'decimal',
'options' => array(
'min' => 0,
),
),
),
);
}
/**
* Identifier le formulaire en faisant abstraction des parametres qui ne representent pas l'objet edite
*/
function formulaires_editer_abonnements_offre_identifier_dist($id_abonnements_offre='new', $retour='', $lier_trad=0, $config_fonc='', $row=array(), $hidden=''){
return serialize(array(intval($id_abonnements_offre)));
}
/**
* Declarer les champs postes et y integrer les valeurs par defaut
*/
function formulaires_editer_abonnements_offre_charger_dist($id_abonnements_offre='new', $retour='', $lier_trad=0, $config_fonc='', $row=array(), $hidden=''){
$valeurs = formulaires_editer_objet_charger('abonnements_offre',$id_abonnements_offre,'',$lier_trad,$retour,$config_fonc,$row,$hidden);
unset($valeurs['id_abonnements_offre']);
return $valeurs;
}
/**
* Verifier les champs postes et signaler d'eventuelles erreurs
*/
function formulaires_editer_abonnements_offre_verifier_dist($id_abonnements_offre='new', $retour='', $lier_trad=0, $config_fonc='', $row=array(), $hidden=''){
return formulaires_editer_objet_verifier('abonnements_offre',$id_abonnements_offre, array('titre'));
}
/**
* Traiter les champs postes
*/
function formulaires_editer_abonnements_offre_traiter_dist($id_abonnements_offre='new', $retour='', $lier_trad=0, $config_fonc='', $row=array(), $hidden=''){
return formulaires_editer_objet_traiter('abonnements_offre',$id_abonnements_offre,'',$lier_trad,$retour,$config_fonc,$row,$hidden);
}
?>

@ -0,0 +1,53 @@
<div class="formulaire_spip formulaire_editer formulaire_#ENV{form}[ formulaire_#ENV{form}-(#ENV{id,nouveau})]">
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
<form method="post" action="#ENV{action}" enctype="multipart/form-data"><div>
[(#REM) declarer les hidden qui declencheront le service du formulaire
parametre : url d'action ]
#ACTION_FORMULAIRE{#ENV{action}}
<div class="liste-objets liste-objets-lies abonnements_offres_notifications">
<table class="spip liste">
<caption><strong class="caption"><:abonnementsoffre:configurer_notifications:></strong></caption>
<thead>
<tr class="first_row">
<th class="duree principale" scope="col'"><:abonnementsoffre:configurer_notifications_quand:></th>
<th class="supprimer" scope="col'"><:lien_supprimer|ucfirst:></th>
</tr>
</thead>
<tbody>
<BOUCLE_notifications(ABONNEMENTS_OFFRES_NOTIFICATIONS){id_abonnements_offre}{!par periode}{!par duree}>
<tr>
<td class="duree principale">
[(#VAL{abonnementsoffre:champ_periode_nb_}|concat{#PERIODE}|_T{#ARRAY{nb,#DUREE}})]
</td>
<td class="supprimer">
<button class="button link delete" name="supprimer[#ID_ABONNEMENTS_OFFRES_NOTIFICATION]" value="X">
<img src="#CHEMIN_IMAGE{supprimer-12.png}" width="12" height="12" alt="X" />
<:lien_supprimer|ucfirst:>
</button>
</td>
</tr>
</BOUCLE_notifications>
<tr>
<td colspan="2">Aucune notification</td>
</tr>
<//B_notifications>
</tbody>
</table>
</div>
<ul>
#GENERER_SAISIES{#ENV{_saisies}}
</ul>
[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
<!--extra-->
<p class="boutons">
<span class="image_loading"></span>
<input type="submit" class="submit" value="<:bouton_enregistrer:>" />
</p>
</div></form>
</div>

@ -0,0 +1,80 @@
<?php
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) return;
function formulaires_editer_abonnements_offre_notifications_saisies_dist($id_abonnements_offre, $retour=''){
return array(
array(
'saisie' => 'input',
'options' => array(
'nom' => 'duree',
'label' => _T('abonnementsoffre:champ_duree_label'),
'defaut' => '',
),
'verifier' => array(
'type' => 'entier',
'options' => array(
'min' => 1,
),
),
),
array(
'saisie' => 'selection',
'options' => array(
'nom' => 'periode',
'label' => _T('abonnementsoffre:champ_periode_label'),
'cacher_option_intro' => 'oui',
'datas' => array(
'mois' => _T('abonnementsoffre:champ_periode_choix_mois'),
'jours' => _T('abonnementsoffre:champ_periode_choix_jours'),
),
'defaut' => 'mois',
),
),
);
}
function formulaires_editer_abonnements_offre_notifications_charger_dist($id_abonnements_offre, $retour=''){
if (!$id_abonnements_offre or !autoriser('configurer')){
return false;
}
$contexte = array(
'supprimer' => array(),
'id_abonnements_offre' => $id_abonnements_offre,
'_hidden' => '<input type="hidden" name="id_abonnements_offre" value="'.$id_abonnements_offre.'" />',
);
return $contexte;
}
function formulaires_editer_abonnements_offre_notifications_verifier_dist($id_abonnements_offre, $retour=''){
$erreurs = array();
if (!$supprimer = _request('supprimer')){
if (!_request('duree')){
$erreurs['duree'] = _T('info_obligatoire');
}
}
return $erreurs;
}
function formulaires_editer_abonnements_offre_notifications_traiter_dist($id_abonnements_offre, $retour=''){
// Si on demande à enregistrer une nouvelle notif
if (!$supprimer = _request('supprimer')){
include_spip('inc/editer');
$retours = formulaires_editer_objet_traiter('abonnements_offres_notification','new','','',$retour,'','','');
}
// Sinon c'est pour en supprimer
elseif (is_array($supprimer)){
foreach ($supprimer as $id_notification=>$valeur){
if ($id_notification = intval($id_notification)){
sql_delete('spip_abonnements_offres_notifications', 'id_abonnements_offres_notification = '.$id_notification);
$retours = array('redirect' => $retour);
}
}
}
return $retours;
}

@ -0,0 +1,32 @@
<?php
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) return;
/*
* Vérifie si les abonnements actifs ont bien une tâche précise de désactivation
*/
function genie_abonnements_verifier_desactivation_dist($time){
include_spip('base/abstract_sql');
$jourdhui = date('Y-m-d H:I:s');
// On va chercher tous les abonnements actifs + ayant une date de fin future + sans job lié
if ($a_changer = sql_allfetsel(
'id_abonnement, date_fin',
'spip_abonnements as a left join spip_jobs_liens as l on l.objet="abonnement" and l.id_objet=a.id_abonnement left join spip_jobs as j on j.fonction="abonnements_desactiver" and j.id_job=l.id_job',
array(
'a.statut = "actif"',
'a.date_fin > '.sql_quote($jourdhui),
'l.id_job is null',
)
) and is_array($a_changer)) {
include_spip('inc/abonnements');
foreach ($a_changer as $abonnement){
abonnements_programmer_desactivation($abonnement['id_abonnement'], $abonnement['date_fin']);
}
}
return 1;
}
?>

@ -0,0 +1,66 @@
<?php
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) return;
/*
* Vérifie si aujourd'hui on a des notifications à envoyer à certains abonnés
*/
function genie_abonnements_verifier_notifications_dist($time){
include_spip('base/abstract_sql');
$jourdhui = date('Y-m-d H:I:s');
// On va chercher toutes les notifications
if (
$notifications = sql_allfetsel('*', 'spip_abonnements_offres_notifications')
and is_array($notifications)
){
// Pour chaque notification on va chercher les abonnés dont c'est le moment
foreach ($notifications as $notification){
// De combien doit-on modifier la date
switch ($notification['periode']){
case 'jours':
$ajout = " + ${notification['duree']} days";
break;
case 'mois':
$ajout = " + ${notification['duree']} months";
break;
default:
$ajout ='';
break;
}
// S'il y a de quoi ajouter, alors on va calculer l'échéance à chercher
if ($ajout){
$echeance = date('Y-m-d', strtotime($jourdhui.$ajout));
}
// Pour cette notification on cherche donc tous les abonnés ayant cet échéance avec la même offre
if ($a_notifier = sql_allfetsel(
'id_abonnement, nom, email',
'spip_abonnements as a left join spip_auteurs as u on a.id_auteur=u.id_auteur',
array(
'DATE_FORMAT(date_fin, "%Y-%m-%d") = '.sql_quote($echeance),
'id_abonnements_offre = '.intval($notification['id_abonnements_offre']),
'email is not null'
)
)){
// Pour chacun on programme un envoi de mail
foreach ($a_notifier as $abonne){
$id_job = job_queue_add(
'abonnements_notifier_echeance',
"Notifier ${abonne['nom']} ${notification['duree']} ${notification['periode']} avant la fin de son abonnement ${abonne['id_abonnement']}",
array($abonne['id_abonnement'], $abonne['nom'], $abonne['email'], $notification['duree'], $notification['periode']),
'inc/abonnements',
true
);
job_queue_link($id_job, array('objet'=>'abonnement', 'id_objet'=>$abonne['id_abonnement']));
}
}
}
}
return 1;
}
?>

@ -0,0 +1,88 @@
<?php
/**
* Plugin Abonnements
* (c) 2012 Les Développements Durables
* Licence GNU/GPL v3
*/
if (!defined('_ECRIRE_INC_VERSION')) return;
/*
* Programmer la désactivation d'un abonnement lors de sa date de fin
*
* @param int $id_abonnement
* L'identifiant de l'abonnement
* @param datetime $date_fin
* Optionnellement la date de fin si on la connait déjà, ce qui évite une requête
*/
function abonnements_programmer_desactivation($id_abonnement, $date_fin=null){
include_spip('action/editer_liens');
$id_abonnement = intval($id_abonnement);
// Si on a pas de date, on va chercher
if (!$date_fin){
$date_fin = sql_getfetsel('date_fin', 'spip_abonnements', 'id_abonnement = '.$id_abonnement);
}
// Dans tous les cas on cherche s'il y des tâches liées à cet abonnement
$liens = objet_trouver_liens(array('job' => '*'), array('abonnement' => $id_abonnement));
if ($liens and is_array($liens)){
// Et on les supprime toutes !
foreach ($liens as $lien){
job_queue_remove($lien['id_job']);
}
}
// Seulement si on a bien une date de fin, on reprogramme, sans duplication possible
if ($date_fin and $date_fin != '0000-00-00 00:00:00'){
$id_job = job_queue_add(
'abonnements_desactiver',
_T('abonnement:job_desactivation', array('id'=>$id_abonnement)),
array($id_abonnement),
'inc/abonnements',
true,
strtotime($date_fin)
);
job_queue_link($id_job, array('objet'=>'abonnement', 'id_objet'=>$id_abonnement));
}
}
/*
* Désactiver un abonnement en utilisant l'API et sans autorisation
*/
function abonnements_desactiver($id_abonnement){
include_spip('inc/autoriser');
include_spip('action/editer_objet');
// On inhibe les autorisations
autoriser_exception('modifier', 'abonnement', $id_abonnement);
autoriser_exception('instituer', 'abonnement', $id_abonnement);
// On désactive l'abonnement
objet_modifier('abonnement', $id_abonnement, array('statut' => 'inactif'));
// On remet les autorisations
autoriser_exception('instituer', 'abonnement', $id_abonnement, false);
autoriser_exception('modifier', 'abonnement', $id_abonnement, false);
}
/*
* Envoyer un courriel à l'abonné pour lui rappeler combien de temps il lui reste
*/
function abonnements_notifier_echeance($id_abonnement, $nom, $email, $duree, $periode){
$envoyer_mail = charger_fonction('envoyer_mail', 'inc/');
$envoyer_mail(
$email,
_T('abonnement:notification_echeance_sujet_'.$periode, array('duree'=>$duree)),
recuperer_fond(
'notifications/abonnement_echeance',
array(
'id_abonnement' => $id_abonnement,
'nom' => $nom,
'email' => $email,
'duree' => $duree,
'periode' => $periode
)
)
);
}
?>

@ -0,0 +1,70 @@
<?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_abonnement' => 'Ajouter cet abonnement',
// C
'champ_date_debut_label' => 'Début',
'champ_date_fin_allonger_label' => 'Vous pouvez modifier la date déchéance',
'champ_date_fin_label' => 'Échéance',
'champ_id_abonnements_offre_label' => 'Offre d\'abonnement',
'champ_id_auteur_label' => 'Utilisateur',
// E
'erreur_id_abonnements_offre' => 'Vous devez créer un abonnement pour une offre existante.',
// I
'icone_creer_abonnement' => 'Créer un abonnement',
'icone_modifier_abonnement' => 'Modifier cet abonnement',
'icone_renouveler_abonnement' => 'Renouveler cet abonnement',
'info_1_abonnement' => 'Un abonnement',
'info_1_abonnement_actif' => 'Un abonnement actif',
'info_1_abonnement_inactif' => 'Un abonnement inactif',
'info_abonnements_auteur' => 'Les abonnements de cet auteur',
'info_aucun_abonnement' => 'Aucun abonnement',
'info_aucun_abonnement_actif' => 'Aucun abonnement actif',
'info_aucun_abonnement_inactif' => 'Aucun abonnement inactif',
'info_nb_abonnements' => '@nb@ abonnements',
'info_nb_abonnements_actifs' => '@nb@ abonnements actifs',
'info_nb_abonnements_inactifs' => '@nb@ abonnements inactifs',
'info_numero_abbr' => 'n°',
'info_numero_abbr_maj' => 'N°',
// J
'job_desactivation' => 'Désactivation de labonnement @id@',
// N
'notification_echeance_sujet_jours' => 'Votre abonnement se termine dans @duree@ jour(s) !',
'notification_echeance_sujet_mois' => 'Votre abonnement se termine dans @duree@ mois !',
'notification_echeance_corps' => '<p>Bonjour @nom@,</p>
<p>Vous recevez ce courriel car vous êtes abonné au site @nom_site_spip@ avec loffre "@offre@".</p>
<p>Votre abonnement arrive à échéance dans : <strong>@echeance@</strong>.<br/>
Nous vous invitons donc à le renouveler avant son expiration.</p>
<p>Merci de votre confiance, et nhésitez pas à nous contacter pour toute information complémentaire.</p>',
// R
'retirer_lien_abonnement' => 'Retirer cet abonnement',
'retirer_tous_liens_abonnements' => 'Retirer tous les abonnements',
// S
'statut_actif' => 'actif',
'statut_inactif' => 'désactivé',
// T
'texte_ajouter_abonnement' => 'Ajouter un abonnement',
'texte_changer_statut_abonnement' => 'Cet abonnement est :',
'texte_creer_associer_abonnement' => 'Créer et associer un abonnement',
'titre_abonnement' => 'Abonnement',
'titre_abonnements' => 'Abonnements',
'titre_abonnements_suivre' => 'Suivre les abonnements',
'titre_abonnements_rubrique' => 'Abonnements de la rubrique',
'titre_langue_abonnement' => 'Langue de cet abonnement',
'titre_logo_abonnement' => 'Logo de cet abonnement',
);
?>

@ -0,0 +1,51 @@
<?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_abonnementsoffre' => 'Ajouter cette offre dabonnement',
// C
'champ_descriptif_label' => 'Descriptif',
'champ_duree_0' => 'Sans limite',
'champ_duree_label' => 'Durée',
'champ_periode_choix_heures' => 'Heures',
'champ_periode_choix_jours' => 'Jours',
'champ_periode_choix_mois' => 'Mois',
'champ_periode_label' => 'Type de période',
'champ_periode_nb_heures' => '@nb@ heure(s)',
'champ_periode_nb_jours' => '@nb@ jour(s)',
'champ_periode_nb_mois' => '@nb@ mois',
'champ_prix_0' => 'Gratuit',
'champ_prix_label' => 'Prix',
'champ_titre_label' => 'Titre',
'configurer_notifications' => 'Configurer les notifications',
'configurer_notifications_quand' => 'Quand ?',
// I
'icone_creer_abonnementsoffre' => 'Créer une offre dabonnement',
'icone_modifier_abonnementsoffre' => 'Modifier cette offre dabonnement',
'info_1_abonnementsoffre' => 'Une offre dabonnement',
'info_abonnementsoffres_auteur' => 'Les offres dabonnement de cet auteur',
'info_aucun_abonnementsoffre' => 'Aucune offre dabonnement',
'info_nb_abonnementsoffres' => '@nb@ offres dabonnement',
// R
'retirer_lien_abonnementsoffre' => 'Retirer cette offre dabonnement',
'retirer_tous_liens_abonnementsoffres' => 'Retirer toutes les offres dabonnement',
// T
'texte_ajouter_abonnementsoffre' => 'Ajouter une offre dabonnement',
'texte_changer_statut_abonnementsoffre' => 'Cette offre dabonnement est :',
'texte_creer_associer_abonnementsoffre' => 'Créer et associer une offre dabonnement',
'titre_abonnementsoffre' => 'Offre dabonnement',
'titre_abonnementsoffres' => 'Offres dabonnement',
'titre_abonnementsoffres_rubrique' => 'Offres dabonnement de la rubrique',
'titre_langue_abonnementsoffre' => 'Langue de cette offre dabonnement',
'titre_logo_abonnementsoffre' => 'Logo de cette offre dabonnement',
);
?>

@ -0,0 +1,18 @@
<?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
'abonnements_description' => 'Ce plugin a pour but de regrouper tout ce qui est commun aux différents types d\'abonnements possibles (à des zones restreintes, à des contenus précis, à une version papier pourquoi pas aussi...).
Il permet de définir les abonnements proposés par le site, et gère les personnes qui y sont abonnés, désactivant l\'abonnement au bout d\'un temps donné.
Comme il peut y avoir toute sorte de cas, ce n\'est pas ce plugin qui décide quels droits sont donnés lors d\'un abonnement. C\'est à d\'autres plugins d\'implémenter cela, par exemple pour lier alors automatiquement un utilisateur à une zone restreinte.',
'abonnements_nom' => 'Abonnements',
'abonnements_slogan' => 'Donner des droits pendant un certain temps',
);
?>

@ -0,0 +1,10 @@
<BOUCLE_abonnement(ABONNEMENTS){id_abonnement}>
#SET{nom,#ENV{nom}}
#SET{offre,#INFO_TITRE{abonnements_offre,#ID_ABONNEMENTS_OFFRE}}
#SET{echeance, #VAL{abonnementsoffre:champ_periode_nb_}|concat{#ENV{periode}}|_T{#ARRAY{nb,#ENV{duree}}}}
<body>
<:abonnement:notification_echeance_corps{nom=#GET{nom}, nom_site_spip=#NOM_SITE_SPIP, offre=#GET{offre}, echeance=#GET{echeance}}:>
</body>
</BOUCLE_abonnement>
#FILTRE{facteur_email_wrap_to_html}

@ -0,0 +1,40 @@
<paquet
prefix="abonnements"
categorie="auteur"
version="2.2.0"
schema="2.1.0"
etat="stable"
compatibilite="[3.0.5;3.0.*]"
logo="prive/themes/spip/images/abonnements-64.png"
documentation=""
>
<nom>Abonnements</nom>
<credit lien="http://contrib.spip.net/BoOz,502">BoOz</credit>
<credit lien="http://www.elastick.net">Anne-lise Martenot</credit>
<credit lien="http://www.magraine.net/">Matthieu Marcillaud</credit>
<credit lien="http://www.cym.net">Ateliers Cym</credit>
<credit lien="http://www.latribunedelart.com">La tribune de l'art</credit>
<auteur lien="http://www.ldd.fr">Les Développements Durables</auteur>
<licence>GNU/GPL v3</licence>
<necessite nom="saisies" compatibilite="[1.28.1;]" />
<necessite nom="verifier" compatibilite="[1.0.0;]" />
<necessite nom="yaml" compatibilite="[1.5.0;]" />
<necessite nom="facteur" compatibilite="[3.0.1;]" />
<pipeline nom="autoriser" inclure="abonnements_autorisations.php" />
<pipeline nom="declarer_tables_objets_sql" inclure="base/abonnements.php" />
<pipeline nom="declarer_tables_interfaces" inclure="base/abonnements.php" />
<pipeline nom="declarer_tables_principales" inclure="base/abonnements.php" />
<pipeline nom="declarer_tables_auxiliaires" inclure="base/abonnements.php" />
<pipeline nom="optimiser_base_disparus" inclure="abonnements_pipelines.php" />
<pipeline nom="post_edition" inclure="abonnements_pipelines.php" />
<pipeline nom="taches_generales_cron" inclure="abonnements_pipelines.php" />
<pipeline nom="affiche_gauche" inclure="abonnements_pipelines.php" />
<pipeline nom="affiche_milieu" inclure="abonnements_pipelines.php" />
<menu nom="abonnements_offres" titre="abonnementsoffre:titre_abonnementsoffres" parent="menu_publication" icone="images/abonnement-16.png" action="abonnements_offres" />
<menu nom="abonnements" titre="abonnement:titre_abonnements_suivre" parent="menu_activite" icone="images/abonnement-16.png" action="abonnements" />
</paquet>

@ -0,0 +1,26 @@
<BOUCLE_abonnement(ABONNEMENTS auteurs){id_abonnement}{statut?}>
[<div class="champ contenu_id_abonnements_offre[ (#ID_ABONNEMENTS_OFFRE*|strlen|?{'',vide})]">
<label><:abonnement:champ_id_abonnements_offre_label:> : </label>
<span dir='#LANG_DIR' class='#EDIT{id_abonnements_offre} id_abonnements_offre'>(#INFO_TITRE{abonnements_offre,#ID_ABONNEMENTS_OFFRE})</span>
</div>]
[<div class="champ contenu_id_auteur[ (#ID_AUTEUR*|strlen|?{'',vide})]">
<label><:abonnement:champ_id_auteur_label:> : </label>
<a href="[(#ID_AUTEUR|generer_url_entite{auteur})]"><span dir='#LANG_DIR' class='#EDIT{id_auteur} id_auteur'>(#NOM)</span></a>
[(<a href="mailto:#EMAIL">(#EMAIL)</a>)]
</div>]
#SET{horaires, #INFO_PERIODE{abonnements_offre, #ID_ABONNEMENTS_OFFRE}|=={heures}|?{' ',''}}
[<div class="champ contenu_date_debut[ (#DATE_DEBUT*|!={0000-00-00 00:00:00}|?{'',vide})]">
<label><:abonnement:champ_date_debut_label:> : </label>
<span dir='#LANG_DIR' class='#EDIT{date_debut} date_debut'>(#DATE_DEBUT|!={0000-00-00 00:00:00}|?{[(#GET{horaires}|?{[(#DATE_DEBUT|affdate_heure)], [(#DATE_DEBUT|affdate_jourcourt)]})]})</span>
</div>]
[<div class="champ contenu_date_fin[ (#DATE_FIN*|!={0000-00-00 00:00:00}|?{'',vide})]">
<label><:abonnement:champ_date_fin_label:> : </label>
<span dir='#LANG_DIR' class='#EDIT{date_fin} date_fin'>(#DATE_FIN|!={0000-00-00 00:00:00}|?{[(#GET{horaires}|?{[(#DATE_FIN|affdate_heure)], [(#DATE_FIN|affdate_jourcourt)]})]})</span>
</div>]
</BOUCLE_abonnement>

@ -0,0 +1,6 @@
<INCLURE{fond=prive/objets/liste/abonnements, masquer_offre=oui, par=date_debut, env, ajax, sinon=<:abonnement:info_aucun_abonnement:>, id_abonnements_offre=#ENV{id_abonnements_offre}}>
[(#AUTORISER{creer,abonnement})
[(#URL_ECRIRE{abonnement_edit,new=oui&id_abonnements_offre=#ENV{id_abonnements_offre}}|icone_verticale{<:abonnement:icone_creer_abonnement:>,abonnement,new,right})]
]
<div class="nettoyeur"></div>

@ -0,0 +1,23 @@
<BOUCLE_abonnements_offre(ABONNEMENTS_OFFRES){id_abonnements_offre}{statut?}>
[<div class="champ contenu_titre[ (#TITRE*|strlen|?{'',vide})]">
<label><:abonnementsoffre:champ_titre_label:> : </label>
<span dir='#LANG_DIR' class='#EDIT{titre} titre'>(#TITRE)</span>
</div>]
[<div class="champ contenu_descriptif[ (#DESCRIPTIF*|strlen|?{'',vide})]">
<label><:abonnementsoffre:champ_descriptif_label:> : </label>
<span dir='#LANG_DIR' class='#EDIT{descriptif} descriptif'>(#DESCRIPTIF)</span>
</div>]
<div class="champ contenu_duree">
<label><:abonnementsoffre:champ_duree_label:> : </label>
<span dir='#LANG_DIR' class='#EDIT{duree} duree'>[(#DUREE|=={0}|?{<:abonnementsoffre:champ_duree_0:>,#VAL{abonnementsoffre:champ_periode_nb_}|concat{#PERIODE}|_T{#ARRAY{nb,#DUREE}}})]</span>
</div>
<div class="champ contenu_prix">
<label><:abonnementsoffre:champ_prix_label:> : </label>
<span dir='#LANG_DIR' class='#EDIT{prix} prix'>[(#PRIX|=={0}|?{<:abonnementsoffre:champ_prix_0:>,#PRIX €})]</span>
</div>
</BOUCLE_abonnements_offre>

@ -0,0 +1,63 @@
[(#SET{defaut_tri,#ARRAY{
date_debut,#ENV{date_debut_sens,-1},
date_fin,#ENV{date_fin_sens,-1},
id_abonnement,1,
id_auteur,1,
nom,1,
points,-1
}})]<B_liste_abonnements>
#ANCRE_PAGINATION
<div class="liste-objets abonnements">
<table class="spip liste">
[<caption><strong class="caption">(#ENV*{titre,#GRAND_TOTAL|singulier_ou_pluriel{#ENV{titre_singulier,abonnement:info_1_abonnement},#ENV{titre_pluriel,abonnement:info_nb_abonnements}}})</strong></caption>]
<thead>
<tr class="first_row">
<th class="statut" scope="col">[(#TRI{statut,<span title="<:lien_trier_statut|attribut_html:>">#</span>,ajax})]</th>
[(#ENV{masquer_offre}|non)
<th class="id_abonnements_offre" scope="col">[(#TRI{id_abonnements_offre,<:abonnement:champ_id_abonnements_offre_label:>,ajax})]</th>
]
[(#ENV{masquer_auteur}|non)
<th class="nom" scope="col">[(#TRI{nom,<:abonnement:champ_id_auteur_label:>,ajax})]</th>
]
<th class="date date_debut" scope="col">[(#TRI{date_debut,<:abonnement:champ_date_debut_label:>,ajax})]</th>
<th class="date date_fin" scope="col">[(#TRI{date_fin,<:abonnement:champ_date_fin_label:>,ajax})]</th>
<th class="id" scope="col">[(#TRI{id_abonnement,<:abonnement:info_numero_abbr_maj|attribut_html:>,ajax})]</th>
<th class="action" scope="col"></th>
</tr>
</thead>
<tbody>
<BOUCLE_liste_abonnements(ABONNEMENTS auteurs)
{where?}
{id_abonnements_offre?}
{id_auteur?}
{statut?}
{recherche?}
{tri #ENV{par,date_debut},#GET{defaut_tri}}{pagination #ENV{nb,10}}
>
<tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]">
<td class="statut">[(#STATUT|puce_statut{abonnement,#ID_ABONNEMENT})]</td>
[(#ENV{masquer_offre}|non)
<td class="id_abonnements_offre principale"><a href="[(#ID_ABONNEMENT|generer_url_entite{abonnement})]" title="<:abonnement:titre_abonnement|attribut_html:> <:abonnement:info_numero_abbr|attribut_html:>#ID_ABONNEMENT">#INFO_TITRE{abonnements_offre,#ID_ABONNEMENTS_OFFRE}</a></td>
]
[(#ENV{masquer_auteur}|non)
<td class="nom principale"><a href="[(#ID_ABONNEMENT|generer_url_entite{abonnement})]" title="<:abonnement:titre_abonnement|attribut_html:> <:abonnement:info_numero_abbr|attribut_html:>#ID_ABONNEMENT">#NOM</a></td>
]
#SET{horaires, #INFO_PERIODE{abonnements_offre, #ID_ABONNEMENTS_OFFRE}|=={heures}|?{' ',''}}
<td class="date date_debut secondaire">[(#DATE_DEBUT|!={0000-00-00 00:00:00}|?{[(#GET{horaires}|?{[(#DATE_DEBUT|affdate_heure)], [(#DATE_DEBUT|affdate_jourcourt)]})]})]</td>
<td class="date date_fin secondaire">[(#DATE_FIN|!={0000-00-00 00:00:00}|?{[(#GET{horaires}|?{[(#DATE_FIN|affdate_heure)], [(#DATE_FIN|affdate_jourcourt)]})]})]</td>
<td class="id">[(#AUTORISER{modifier,abonnement,#ID_ABONNEMENT}|?{
<a href="[(#URL_ECRIRE{abonnement_edit,id_abonnement=#ID_ABONNEMENT})]" title="<:abonnement:icone_modifier_abonnement|attribut_html:>">#ID_ABONNEMENT</a>,
#ID_ABONNEMENT
})]</td>
<td class="action">[(#AUTORISER{modifier,abonnement,#ID_ABONNEMENT}|et{#INFO_DUREE{abonnements_offre, #ID_ABONNEMENTS_OFFRE}}|?{
<a href="[(#URL_ACTION_AUTEUR{renouveler_abonnement,#ID_ABONNEMENT,#SELF})]" title="<:abonnement:icone_renouveler_abonnement|attribut_html:> <:abonnement:info_numero_abbr|attribut_html:>#ID_ABONNEMENT">[(#CHEMIN_IMAGE{arrow_refresh-16.png}|balise_img{<:abonnement:icone_renouveler_abonnement:>,''})]</a>
})]</td>
</tr>
</BOUCLE_liste_abonnements>
</tbody>
</table>
[<p class="pagination">(#PAGINATION{prive})</p>]
</div>
</B_liste_abonnements>[
<div class="liste-objets abonnements caption-wrap"><strong class="caption">(#ENV*{sinon,''})</strong></div>
]<//B_liste_abonnements>

@ -0,0 +1,48 @@
[(#SET{defaut_tri,#ARRAY{
num titre,1,
titre,1,
id_abonnement,1,
points,-1
}})]<B_liste_abonnements_offres>
#ANCRE_PAGINATION
<div class="liste-objets abonnements_offres">
<table class="spip liste">
[<caption><strong class="caption">(#ENV*{titre,#GRAND_TOTAL|singulier_ou_pluriel{abonnementsoffre:info_1_abonnementsoffre,abonnementsoffre:info_nb_abonnementsoffres}})</strong></caption>]
<thead>
<tr class='first_row'>
<th class="statut" scope="col'">[(#TRI{statut,<span title="<:lien_trier_statut|attribut_html:>">#</span>,ajax})]</th>
<th class="titre" scope="col'">[(#TRI{titre,<:abonnementsoffre:champ_titre_label:>,ajax})]</th>
<th class="duree" scope="col'">[(#TRI{periode,<:abonnementsoffre:champ_duree_label:>,ajax})]</th>
<th class="prix">[(#TRI{prix,<:abonnementsoffre:champ_prix_label:>,ajax})]</th>
<th class="abonnements"><:abonnement:titre_abonnements:></th>
<th class="id" scope="col'">[(#TRI{id_abonnements_offre,<:info_numero_abbreviation:>,ajax})]</th>
</tr>
</thead>
<tbody>
<BOUCLE_liste_abonnements_offres(ABONNEMENTS_OFFRES)
{where?}
{id_auteur?}
{statut?}
{recherche?}
{tri #ENV{par,num titre},#GET{defaut_tri}}
{pagination #ENV{nb,10}}
>
<tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]">
<td class="statut">[(#STATUT|puce_statut{abonnements_offre,#ID_ABONNEMENTS_OFFRE})]</td>
<td class="titre principale">[(#LOGO_ABONNEMENTS_OFFRE|image_reduire{20,26})]<a href="[(#ID_ABONNEMENTS_OFFRE|generer_url_entite{abonnements_offre})]" title="<:info_numero_abbreviation|attribut_html:> #ID_ABONNEMENTS_OFFRE">[(#RANG). ]#TITRE</a></td>
<td class="duree secondaire">[(#DUREE|=={0}|?{<:abonnementsoffre:champ_duree_0:>,#VAL{abonnementsoffre:champ_periode_nb_}|concat{#PERIODE}|_T{#ARRAY{nb,#DUREE}}})]</td>
<td class="prix">[(#PRIX|=={0}|?{<:abonnementsoffre:champ_prix_0:>,#PRIX €})]</td>
<td class="abonnements"><BOUCLE_abonnements(ABONNEMENTS){id_abonnements_offre}/>#TOTAL_BOUCLE<//B_abonnements></td>
<td class="id">[(#AUTORISER{modifier,abonnements_offre,#ID_ABONNEMENTS_OFFRE}|?{
<a href="[(#URL_ECRIRE{abonnements_offre_edit,id_abonnements_offre=#ID_ABONNEMENTS_OFFRE})]">#ID_ABONNEMENTS_OFFRE</a>,
#ID_ABONNEMENTS_OFFRE
})]</td>
</tr>
</BOUCLE_liste_abonnements_offres>
</tbody>
</table>
[<p class="pagination">(#PAGINATION{prive})</p>]
</div>
</B_liste_abonnements_offres>[
<div class="liste-objets abonnements_offres caption-wrap"><strong class="caption">(#ENV*{sinon,''})</strong></div>
]<//B_liste_abonnements_offres>

@ -0,0 +1,45 @@
[(#AUTORISER{voir,abonnement,#ID_ABONNEMENT}|sinon_interdire_acces)]
<BOUCLE_abonnement(ABONNEMENTS){id_abonnement}{statut==.*}{si #ENV{exec}|=={abonnement}}>
[(#BOITE_OUVRIR{[
[(#AUTORISER{modifier,abonnement,#ID_ABONNEMENT})
[(#ID_ABONNEMENT|afficher_qui_edite{abonnement}|non)
[(#URL_ECRIRE{abonnement_edit,id_abonnement=#ID_ABONNEMENT}|icone_verticale{<:abonnement:icone_modifier_abonnement:>,abonnement,edit,right ajax preload})]
]
[(#ID_ABONNEMENT|afficher_qui_edite{abonnement}|oui)
[(#URL_ECRIRE{abonnement_edit,id_abonnement=#ID_ABONNEMENT}|icone_verticale{#ID_ABONNEMENT|afficher_qui_edite{abonnement},warning-24,'',right edition_deja ajax preload})]
]
]
<h1>(#INFO_TITRE{auteur,#ID_AUTEUR}|concat{" \(", [(#DATE_DEBUT|affdate_jourcourt)], "\) "})[(#CHEMIN_IMAGE{abonnement-24.png}|balise_img{abonnement,cadre-icone})]</h1>
],simple fiche_objet})]
<