Nouvelle version de Bouquinerie

svn/root/tags/v1.3.9
peetdu@gmail.com 7 years ago
parent 88af4d43d9
commit 78e0c34b53

78
.gitattributes vendored

@ -1 +1,79 @@
* text=auto !eol
/bouq_administrations.php -text
/bouq_autorisations.php -text
/bouq_fonctions.php -text
/bouq_options.php -text
/bouq_pipelines.php -text
formulaires/configurer_bouquinerie.html -text
formulaires/dater_livre.html -text
formulaires/dater_livre.php -text
formulaires/editer_livre.html -text
formulaires/editer_livre.php -text
formulaires/editer_livres_auteur.html -text
formulaires/editer_livres_auteur.php -text
head/livre.html -text
head/livres_auteur.html -text
inc/precharger_livre.php -text
lang/bouq_fr.php -text
lang/livre_fr.php -text
lang/livres_auteur_fr.php -text
lang/paquet-bouq_fr.php -text
/paquet.xml -text
prive/ajax_item_pick.html -text
prive/objets/contenu/livre.html -text
prive/objets/contenu/livres_auteur.html -text
prive/objets/infos/livre.html -text
prive/objets/infos/livres_auteur.html -text
prive/objets/liste/livres.html -text
prive/objets/liste/livres_associer.html -text
prive/objets/liste/livres_associer_fonctions.php -text
prive/objets/liste/livres_auteurs.html -text
prive/objets/liste/livres_auteurs_associer.html -text
prive/objets/liste/livres_auteurs_associer_fonctions.php -text
prive/objets/liste/livres_auteurs_lies.html -text
prive/objets/liste/livres_auteurs_lies_fonctions.php -text
prive/objets/liste/livres_auteurs_roles_associer.html -text
prive/objets/liste/livres_auteurs_roles_associer_fonctions.php -text
prive/objets/liste/livres_auteurs_roles_lies.html -text
prive/objets/liste/livres_auteurs_roles_lies_fonctions.php -text
prive/objets/liste/livres_lies.html -text
prive/objets/liste/livres_lies_fonctions.php -text
prive/objets/liste/livres_roles_associer.html -text
prive/objets/liste/livres_roles_associer_fonctions.php -text
prive/objets/liste/livres_roles_lies.html -text
prive/objets/liste/livres_roles_lies_fonctions.php -text
prive/objets/liste/objets_lies_livres_auteur.html -text
prive/squelettes/contenu/accueil.html -text
prive/squelettes/contenu/configurer_bouquinerie.html -text
prive/squelettes/contenu/livre.html -text
prive/squelettes/contenu/livre_edit.html -text
prive/squelettes/contenu/livres.html -text
prive/squelettes/contenu/livres_auteur.html -text
prive/squelettes/contenu/livres_auteur_edit.html -text
prive/squelettes/contenu/livres_auteurs.html -text
prive/squelettes/extra/livres_auteur.html -text
prive/squelettes/inclure/plan-livres.html -text
prive/themes/spip/images/bouq-128.png -text
prive/themes/spip/images/bouq-32.png -text
prive/themes/spip/images/bouq-64.png -text
prive/themes/spip/images/livre-12.png -text
prive/themes/spip/images/livre-16.png -text
prive/themes/spip/images/livre-24.png -text
prive/themes/spip/images/livre-32.png -text
prive/themes/spip/images/livre-new-16.png -text
prive/themes/spip/images/livres_auteur-12.png -text
prive/themes/spip/images/livres_auteur-16.png -text
prive/themes/spip/images/livres_auteur-24.png -text
prive/themes/spip/images/livres_auteur-32.png -text
prive/themes/spip/images/livres_auteur-add-16.png -text
prive/themes/spip/images/livres_auteur-add-24.png -text
prive/themes/spip/images/livres_auteur-add-32.png -text
prive/themes/spip/images/livres_auteur-del-16.png -text
prive/themes/spip/images/livres_auteur-del-24.png -text
prive/themes/spip/images/livres_auteur-del-32.png -text
prive/themes/spip/images/livres_auteur-edit-16.png -text
prive/themes/spip/images/livres_auteur-edit-24.png -text
prive/themes/spip/images/livres_auteur-edit-32.png -text
prive/themes/spip/images/livres_auteur-new-16.png -text
prive/themes/spip/images/livres_auteur-new-24.png -text
prive/themes/spip/images/livres_auteur-new-32.png -text

@ -0,0 +1,66 @@
<?php
/**
* Fichier gérant l'installation et désinstallation du plugin Bouquinerie
*
* @plugin Bouquinerie
* @copyright 2017
* @author Peetdu
* @licence GNU/GPL
* @package SPIP\Bouquinerie\Installation
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Fonction d'installation et de mise à jour du plugin Bouquinerie.
*
* @param string $nom_meta_base_version
* Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
* @param string $version_cible
* Version du schéma de données dans ce plugin (déclaré dans paquet.xml)
* @return void
**/
function bouq_upgrade($nom_meta_base_version, $version_cible) {
$maj = array();
$maj['create'] = array(array('maj_tables', array('spip_livres', 'spip_livres_liens', 'spip_livres_auteurs', 'spip_livres_auteurs_liens')));
$maj['1.0.1'] = array(
array('sql_alter',"TABLE spip_livres CHANGE `hauteur` `hauteur` VARCHAR(10) NOT NULL DEFAULT ''"),
array('sql_alter',"TABLE spip_livres CHANGE `largeur` `largeur` VARCHAR(10) NOT NULL DEFAULT ''"),
array('sql_alter',"TABLE spip_livres CHANGE `prix` `prix` FLOAT(6,2) NOT NULL DEFAULT 0"),
);
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
}
/**
* Fonction de désinstallation du plugin Bouquinerie.
*
* @param string $nom_meta_base_version
* Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
* @return void
**/
function bouq_vider_tables($nom_meta_base_version) {
sql_drop_table('spip_livres');
sql_drop_table('spip_livres_liens');
sql_drop_table('spip_livres_auteurs');
sql_drop_table('spip_livres_auteurs_liens');
# Nettoyer les liens courants (le génie optimiser_base_disparus se chargera de nettoyer toutes les tables de liens)
sql_delete('spip_documents_liens', sql_in('objet', array('livre', 'livres_auteur')));
sql_delete('spip_mots_liens', sql_in('objet', array('livre', 'livres_auteur')));
sql_delete('spip_auteurs_liens', sql_in('objet', array('livre', 'livres_auteur')));
# Nettoyer les versionnages et forums
sql_delete('spip_versions', sql_in('objet', array('livre', 'livres_auteur')));
sql_delete('spip_versions_fragments', sql_in('objet', array('livre', 'livres_auteur')));
sql_delete('spip_forum', sql_in('objet', array('livre', 'livres_auteur')));
effacer_meta($nom_meta_base_version);
}

@ -0,0 +1,255 @@
<?php
/**
* Définit les autorisations du plugin Bouquinerie
*
* @plugin Bouquinerie
* @copyright 2017
* @author Peetdu
* @licence GNU/GPL
* @package SPIP\Bouquinerie\Autorisations
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Fonction d'appel pour le pipeline
* @pipeline autoriser */
function bouq_autoriser() {
}
// -----------------
// Objet livres
/**
* Autorisation de voir un élément de menu (livres)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_livres_menu_dist($faire, $type, $id, $qui, $opt) {
return true;
}
/**
* Autorisation de voir le bouton d'accès rapide de création (livre)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_livrecreer_menu_dist($faire, $type, $id, $qui, $opt) {
return autoriser('creer', 'livre', '', $qui, $opt);
}
/**
* Autorisation de créer (livre)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_livre_creer_dist($faire, $type, $id, $qui, $opt) {
return ($qui['statut'] == '0minirezo' and !$qui['restreint'] and sql_countsel('spip_rubriques')>0);
}
/**
* Autorisation de voir (livre)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_livre_voir_dist($faire, $type, $id, $qui, $opt) {
return true;
}
/**
* Autorisation de modifier (livre)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_livre_modifier_dist($faire, $type, $id, $qui, $opt) {
return $qui['statut'] == '0minirezo' and !$qui['restreint'];
}
/**
* Autorisation de supprimer (livre)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_livre_supprimer_dist($faire, $type, $id, $qui, $opt) {
return $qui['statut'] == '0minirezo' and !$qui['restreint'];
}
/**
* Autorisation de créer l'élément (livre) dans une rubrique
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_rubrique_creerlivredans_dist($faire, $type, $id, $qui, $opt) {
return ($id and autoriser('voir', 'rubrique', $id) and autoriser('creer', 'livre', $id));
}
/**
* Autorisation de lier/délier l'élément (livres)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_associerlivres_dist($faire, $type, $id, $qui, $opt) {
return $qui['statut'] == '0minirezo' and !$qui['restreint'];
}// -----------------
// Objet livres_auteurs
/**
* Autorisation de voir un élément de menu (livresauteurs)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_livresauteurs_menu_dist($faire, $type, $id, $qui, $opt) {
return true;
}
/**
* Autorisation de voir le bouton d'accès rapide de création (livresauteur)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_livresauteurcreer_menu_dist($faire, $type, $id, $qui, $opt) {
return autoriser('creer', 'livres_auteur', '', $qui, $opt);
}
/**
* Autorisation de créer (livresauteur)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_livresauteur_creer_dist($faire, $type, $id, $qui, $opt) {
return $qui['statut'] == '0minirezo' and !$qui['restreint'];
}
/**
* Autorisation de voir (livresauteur)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_livresauteur_voir_dist($faire, $type, $id, $qui, $opt) {
return true;
}
/**
* Autorisation de modifier (livresauteur)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_livresauteur_modifier_dist($faire, $type, $id, $qui, $opt) {
return $qui['statut'] == '0minirezo' and !$qui['restreint'];
}
/**
* Autorisation de supprimer (livresauteur)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_livresauteur_supprimer_dist($faire, $type, $id, $qui, $opt) {
return autoriser('webmestre', '', '', $qui);
}
/**
* Autorisation de lier/délier l'élément (livresauteurs)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_associerlivresauteurs_dist($faire, $type, $id, $qui, $opt) {
return $qui['statut'] == '0minirezo' and !$qui['restreint'];
}
/* compatibilité plugin LIM */
if (!function_exists('autoriser_rubrique_creerlivredans')) {
function autoriser_rubrique_creerlivredans($faire, $type, $id, $qui, $opt) {
$quelles_rubriques = lire_config('lim_rubriques/livre');
is_null($quelles_rubriques) ? $lim_rub = true : $lim_rub = !in_array($id,$quelles_rubriques);
return
$lim_rub
AND autoriser_rubrique_creerlivredans_dist($faire, $type, $id, $qui, $opt);
}
}

@ -0,0 +1,27 @@
<?php
/**
* Fonctions utiles au plugin Bouquinerie
*
* @plugin Bouquinerie
* @copyright 2017
* @author Peetdu
* @licence GNU/GPL
* @package SPIP\Bouquinerie\Fonctions
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Afficher le prix avec une virgule plutôt qu'un point
*
* @param float $prix
* Saisie à protéger
* @return string
**/
function bouq_prix_virgule($prix) {
$prix = str_replace('.', ',', $prix);
return $prix;
}

@ -0,0 +1,14 @@
<?php
/**
* Options au chargement du plugin Bouquinerie
*
* @plugin Bouquinerie
* @copyright 2017
* @author Peetdu
* @licence GNU/GPL
* @package SPIP\Bouquinerie\Options
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}

@ -0,0 +1,235 @@
<?php
/**
* Utilisations de pipelines par Bouquinerie
*
* @plugin Bouquinerie
* @copyright 2017
* @author Peetdu
* @licence GNU/GPL
* @package SPIP\Bouquinerie\Pipelines
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Ajouter les objets sur les vues des parents directs
*
* @pipeline affiche_enfants
* @param array $flux Données du pipeline
* @return array Données du pipeline
**/
function bouq_affiche_enfants($flux) {
if ($e = trouver_objet_exec($flux['args']['exec']) and $e['edition'] == false) {
$id_objet = $flux['args']['id_objet'];
if ($e['type'] == 'rubrique') {
$flux['data'] .= recuperer_fond(
'prive/objets/liste/livres',
array(
'titre' => _T('livre:titre_livres_rubrique'),
'id_rubrique' => $id_objet
)
);
if (autoriser('creerlivredans', 'rubrique', $id_objet)) {
include_spip('inc/presentation');
$flux['data'] .= icone_verticale(
_T('livre:icone_creer_livre'),
generer_url_ecrire('livre_edit', "id_rubrique=$id_objet"),
'livre-24.png',
'new',
'right'
) . "<br class='nettoyeur' />";
}
}
}
return $flux;
}
/**
* Ajout de contenu sur certaines pages,
* notamment des formulaires de liaisons entre objets
*
* @pipeline affiche_milieu
* @param array $flux Données du pipeline
* @return array Données du pipeline
*/
function bouq_affiche_milieu($flux) {
$texte = '';
$e = trouver_objet_exec($flux['args']['exec']);
// livres sur les livres
// if (!$e['edition'] and in_array($e['type'], array('livre'))) {
// $texte .= recuperer_fond('prive/objets/editer/liens', array(
// 'table_source' => 'livres',
// 'objet' => $e['type'],
// 'id_objet' => $flux['args'][$e['id_table_objet']]
// ));
// }
// livres_auteurs sur les livres
if (!$e['edition'] and in_array($e['type'], array('livre'))) {
$texte .= recuperer_fond('prive/objets/editer/liens', array(
'table_source' => 'livres_auteurs',
'objet' => $e['type'],
'id_objet' => $flux['args'][$e['id_table_objet']]
));
}
if ($texte) {
if ($p = strpos($flux['data'], '<!--affiche_milieu-->')) {
$flux['data'] = substr_replace($flux['data'], $texte, $p, 0);
} else {
$flux['data'] .= $texte;
}
}
return $flux;
}
/**
* Ajout de liste sur la vue d'un auteur
*
* @pipeline affiche_auteurs_interventions
* @param array $flux Données du pipeline
* @return array Données du pipeline
*/
function bouq_affiche_auteurs_interventions($flux) {
if ($id_auteur = intval($flux['args']['id_auteur'])) {
$flux['data'] .= recuperer_fond('prive/objets/liste/livres', array(
'id_auteur' => $id_auteur,
'titre' => _T('livre:info_livres_auteur')
), array('ajax' => true));
}
return $flux;
}
/**
* Afficher le nombre d'éléments dans les parents
*
* @pipeline boite_infos
* @param array $flux Données du pipeline
* @return array Données du pipeline
**/
function bouq_boite_infos($flux) {
if (isset($flux['args']['type']) and isset($flux['args']['id']) and $id = intval($flux['args']['id'])) {
$texte = '';
if ($flux['args']['type'] == 'rubrique' and $nb = sql_countsel('spip_livres', array("statut='publie'", 'id_rubrique=' . $id))) {
$texte .= '<div>' . singulier_ou_pluriel($nb, 'livre:info_1_livre', 'livre:info_nb_livres') . "</div>\n";
}
if ($texte and $p = strpos($flux['data'], '<!--nb_elements-->')) {
$flux['data'] = substr_replace($flux['data'], $texte, $p, 0);
}
}
return $flux;
}
/**
* Compter les enfants d'un objet
*
* @pipeline objets_compte_enfants
* @param array $flux Données du pipeline
* @return array Données du pipeline
**/
function bouq_objet_compte_enfants($flux) {
if ($flux['args']['objet'] == 'rubrique' and $id_rubrique = intval($flux['args']['id_objet'])) {
// juste les publiés ?
if (array_key_exists('statut', $flux['args']) and ($flux['args']['statut'] == 'publie')) {
$flux['data']['livres'] = sql_countsel('spip_livres', 'id_rubrique= ' . intval($id_rubrique) . " AND (statut = 'publie')");
} else {
$flux['data']['livres'] = sql_countsel('spip_livres', 'id_rubrique= ' . intval($id_rubrique) . " AND (statut <> 'poubelle')");
}
}
return $flux;
}
/**
* Optimiser la base de données
*
* Supprime les liens orphelins de l'objet vers quelqu'un et de quelqu'un vers l'objet.
* Supprime les liens orphelins de l'objet vers quelqu'un et de quelqu'un vers l'objet.
* Supprime les objets à la poubelle.
* Supprime les objets à la poubelle.
*
* @pipeline optimiser_base_disparus
* @param array $flux Données du pipeline
* @return array Données du pipeline
*/
function bouq_optimiser_base_disparus($flux) {
include_spip('action/editer_liens');
$flux['data'] += objet_optimiser_liens(array('livre'=>'*', 'livres_auteur'=>'*'), '*');
sql_delete('spip_livres', "statut='poubelle' AND maj < " . $flux['args']['date']);
sql_delete('spip_livres_auteurs', "statut='poubelle' AND maj < " . $flux['args']['date']);
return $flux;
}
/**
* Synchroniser la valeur de id secteur
*
* @pipeline trig_propager_les_secteurs
* @param string $flux Données du pipeline
* @return string Données du pipeline
**/
function bouq_trig_propager_les_secteurs($flux) {
// synchroniser spip_livres
$r = sql_select(
'A.id_livre AS id, R.id_secteur AS secteur',
'spip_livres AS A, spip_rubriques AS R',
'A.id_rubrique = R.id_rubrique AND A.id_secteur <> R.id_secteur'
);
while ($row = sql_fetch($r)) {
sql_update('spip_livres', array('id_secteur' => $row['secteur']), 'id_livre=' . $row['id']);
}
return $flux;
}
function bouq_accueil_informations($texte){
$nbr_livre = sql_countsel('spip_livres', "statut='publie'");
$texte = "<div class='accueil_informations livre liste'>";
$texte .= "<h4><a href='".generer_url_ecrire('livres')."'>"._T("livre:titre_livres")."</a></h4>";
$texte .= "<ul class='liste-items'>";
$texte .= "<li class='item'>" . _T("texte_statut_publies") . ": " . $nbr_livre . '</li>';
$texte .= "</ul>";
$texte .= "</div>";
return $texte;
}
/**
* 1- Ne pas jamais changer la date de parution du livre
* 2- Pour les fiches Auteurs de livre, le statut après création est 'Publié'
*
* @pipeline pre_edition
* @param array $flux Données du pipeline
* @return array Données du pipeline
*/
function bouq_pre_edition($flux) {
if ($flux['args']['table'] == 'spip_livres'
and $flux['args']['action'] == 'instituer'
and isset($flux['data']['statut'])) {
$new_date = $flux['args']['date_ancienne'];
$flux['data']['date_parution'] = $new_date;
}
if ($flux['args']['table'] == 'spip_livres_auteurs') {
$flux['data']['statut'] = 'publie';
}
return $flux;
}

@ -0,0 +1,16 @@
<div class="formulaire_spip formulaire_configurer formulaire_#FORM">
<h3 class="titrem"><:bouq:cfg_titre_parametrages:></h3>
[<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}">
<div>
#ACTION_FORMULAIRE{#ENV{action}}
<input type="hidden" name="_meta_casier" value="bouq" />
<p class="boutons"><span class="image_loading">&nbsp;</span><input type="submit" class="submit" value="<:bouton_enregistrer:>" /></p>
</div>
</form>
</div>

@ -0,0 +1,62 @@
<div class="formulaire_spip formulaire_dater formulaire_#FORM-#ENV{objet}-#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>]
[(#ENV{editable})
<form method='post' action='#ENV{action}'><div>
[(#REM) declarer les hidden qui declencheront le service du formulaire
parametre : url d'action ]
#ACTION_FORMULAIRE{#ENV{action}}
]
<div class="editer-groupe">
#SET{name,date}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label for="#GET{name}"><:livre:champ_date_parution_label:></label>[
<span class='erreur_message'>(#GET{erreurs})</span>
]
<span class="affiche"[(#ENV{_saisie_en_cours}|et{#ENV{_editer_date}}|oui)style="display:none;"]>[(#ENV*{afficher_#GET{name}}|affdate)]</span>
[(#ENV{editable})
<span class="toggle_box_link"[(#ENV{_saisie_en_cours}|oui)style="display:none;"]>&#91;<button
class="link"
name="_saisie_en_cours" value="X"
onclick="var f=jQuery(this).parents('form').eq(0);f.find('.editer .input.editable').show('fast').siblings('span').add(jQuery(this).parent()).hide('fast');f.find('.boutons').show('fast');f.find('input.date').eq(0).focus();return false;"
><:bouton_changer:><i class="over"> \(#ENV{_label_date}\)</i></button>&#93;</span>
<span class="input[(#ENV{_editer_date}|oui)editable]"[(#ENV{_saisie_en_cours}|et{#ENV{_editer_date}}|non)style="display:none;"]>
<input type="text" class="text date" name="#GET{name}_jour" id="#GET{name}_jour" value="#ENV{#GET{name}_jour}" size="10"/>
</span>
]
</div>
#SET{name,date_nouvelle_edition}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label for="#GET{name}"><:livre:champ_date_nouvelle_edition_label:></label>[
<span class='erreur_message'>(#GET{erreurs})</span>
]
<span class="affiche"[(#ENV{_saisie_en_cours}|oui)style="display:none;"]>[(#ENV*{afficher_#GET{name}}|affdate|sinon{<:jour_non_connu_nc:>})]</span>
[(#ENV{editable})
<span class="input editable"[(#ENV{_saisie_en_cours}|non)style="display:none;"]>
<span class="saisie_redac"[(#ENV{sans_nouvelle_edition}|oui)style="display:none;"]>
<input type="text" class="text date" name="#GET{name}_jour" id="#GET{name}_jour" value="#ENV{#GET{name}_jour}" size="10"/>
<br />
</span>
<span class="choix">
<input type="checkbox" name="sans_nouvelle_edition" value="1"[(#ENV{sans_nouvelle_edition}|oui)checked="checked"] id="sans_nouvelle_edition"
onclick="jQuery(this).blur();"
onchange="if (jQuery(this).prop('checked')) jQuery(this).parent().siblings().hide('fast'); else jQuery(this).parent().siblings().show('fast');"
/><label for="sans_nouvelle_edition"><:livre:texte_date_nouvelle_edition_nonaffichee:></label>
</span>
]
</span>
</div>
</div>
[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
<!--extra-->
[(#ENV{editable})
<p class='boutons'[(#ENV{_saisie_en_cours}|non)style="display:none;"]>
<span class='image_loading'>&nbsp;</span>
<input type='submit' class='over' name='changer' value='<:bouton_changer:>' />
<input type='submit' class='submit' name='annuler' value='<:bouton_annuler:>' />
<input type='submit' class='submit' name='changer' value='<:bouton_changer:>' />
</p>
</div></form>
]
</div>
<INCLURE{fond=formulaires/dateur/inc-dateur,heure_pas} />

@ -0,0 +1,358 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
/**
* Gestion du formulaire de date
*
* @package SPIP\Core\Formulaires
**/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Chargement du formulaire d'édition d'une date
*
* @param string $objet
* Type d'objet
* @param int $id_objet
* Identifiant de l'objet
* @param string $retour
* URL de redirection après le traitement
* @param array|string $options
* Options. Si string, unserialize pour obtenir un tableau.
*
* - date_nouvelle_edition : Permet de modifier en plus la date de rédaction antérieure
* @return array
* Environnement du formulaire
**/
function formulaires_dater_livre_charger_dist($objet, $id_objet, $retour = '', $options = array()) {
$objet = objet_type($objet);
if (!$objet or !intval($id_objet)) {
return false;
}
if (!is_array($options)) {
$options = unserialize($options);
}
$_id_objet = id_table_objet($objet);
$table = table_objet($objet);
$trouver_table = charger_fonction('trouver_table', 'base');
$desc = $trouver_table($table);
if (!$desc) {
return false;
}
$champ_date = $desc['date'] ? $desc['date'] : 'date';
if (!isset($desc['field'][$champ_date])) {
return false;
}
$valeurs = array(
'objet' => $objet,
'id_objet' => $id_objet,
'id' => $id_objet,
);
$select = "$champ_date as date ,date_nouvelle_edition";
if (isset($desc['field']['statut'])) {
$select .= ",statut";
}
$row = sql_fetsel($select, $desc['table'], "$_id_objet=" . intval($id_objet));
$statut = isset($row['statut']) ? $row['statut'] : 'publie'; // pas de statut => publie
$valeurs['editable'] = autoriser('dater', $objet, $id_objet, null, array('statut' => $statut));
$possedeDateNouvelleEdition = false;
if (isset($row['date_nouvelle_edition']) and
$regs = recup_date($row['date_nouvelle_edition'], false)
) {
$annee_nouvelle_edition = $regs[0];
$mois_nouvelle_edition = $regs[1];
$jour_nouvelle_edition = $regs[2];
$heure_nouvelle_edition = $regs[3];
$minute_nouvelle_edition = $regs[4];
$possedeDateNouvelleEdition = true;
// attention : les vrai dates de l'annee 1 sont stockee avec +9000 => 9001
// mais reviennent ici en annee 1 par recup_date
// on verifie donc que le intval($row['date_nouvelle_edition']) qui ressort l'annee
// est bien lui aussi <=1 : dans ce cas c'est une date sql 'nulle' ou presque, selon
// le gestionnnaire sql utilise (0001-01-01 pour PG par exemple)
if (intval($row['date_nouvelle_edition']) <= 1 and ($annee_nouvelle_edition <= 1) and ($mois_nouvelle_edition <= 1) and ($jour_nouvelle_edition <= 1)) {
$possedeDateNouvelleEdition = false;
}
} else {
$annee_nouvelle_edition = $mois_nouvelle_edition = $jour_nouvelle_edition = $heure_nouvelle_edition = $minute_nouvelle_edition = 0;
}
if ($regs = recup_date($row['date'], false)) {
$annee = $regs[0];
$mois = $regs[1];
$jour = $regs[2];
$heure = $regs[3];
$minute = $regs[4];
}
// attention, si la variable s'appelle date ou date_nouvelle_edition, le compilo va
// la normaliser, ce qu'on ne veut pas ici.
$valeurs['afficher_date_nouvelle_edition'] = ($possedeDateNouvelleEdition ? $row['date_nouvelle_edition'] : '');
$valeurs['date_nouvelle_edition_jour'] = dater_livre_formater_saisie_jour($jour_nouvelle_edition, $mois_nouvelle_edition, $annee_nouvelle_edition);
$valeurs['date_nouvelle_edition_heure'] = "$heure_nouvelle_edition:$minute_nouvelle_edition";
$valeurs['afficher_date'] = $row['date'];
$valeurs['date_jour'] = dater_livre_formater_saisie_jour($jour, $mois, $annee);
$valeurs['date_heure'] = "$heure:$minute";
$valeurs['_editer_date_nouvelle_edition'] = true;
// $valeurs['sans_nouvelle_edition'] = !$possedeDateNouvelleEdition;
// if (isset($options['date_nouvelle_edition'])) {
// $valeurs['_editer_date_nouvelle_edition'] = $options['date_nouvelle_edition'];
// } else {
// $valeurs['_editer_date_nouvelle_edition'] = ($objet == 'livre' and $possedeDateNouvelleEdition);
// }
$valeurs['_label_date'] = (($statut == 'publie') ? _T('texte_date_publication_objet') : _T('texte_date_creation_objet'));
$valeurs['_saisie_en_cours'] = (_request('_saisie_en_cours') !== null or _request('date_jour') !== null);
// cas ou l'on ne peut pas dater mais on peut modifier la date de redac anterieure
// https://core.spip.net/issues/3494
$valeurs['_editer_date'] = $valeurs['editable'];
if ($valeurs['_editer_date_nouvelle_edition'] and !$valeurs['editable']) {
$valeurs['editable'] = autoriser('modifier', $objet, $id_objet);
}
return $valeurs;
}
/**
* Formate la date
*
* @param string|int $jour
* Numéro du jour
* @param string|int $mois
* Numéro du mois
* @param string|int $annee
* Année
* @param string $sep
* Séparateur
* @return string
* Date formatée tel que `02/10/2012`
**/
function dater_livre_formater_saisie_jour($jour, $mois, $annee, $sep = "/") {
$annee = str_pad($annee, 4, '0', STR_PAD_LEFT);
if (intval($jour)) {
$jour = str_pad($jour, 2, '0', STR_PAD_LEFT);
$mois = str_pad($mois, 2, '0', STR_PAD_LEFT);
return "$jour$sep$mois$sep$annee";
}
if (intval($mois)) {
$mois = str_pad($mois, 2, '0', STR_PAD_LEFT);
return "$mois$sep$annee";
}
return $annee;
}
/**
* Identifier le formulaire en faisant abstraction des paramètres qui
* ne représentent pas l'objet edité
*
* @param string $objet
* Type d'objet
* @param int $id_objet
* Identifiant de l'objet
* @param string $retour
* URL de redirection après le traitement
* @param array|string $options
* Options.
* @return string
* Hash du formulaire
**/
function formulaires_dater_livre_identifier_dist($objet, $id_objet, $retour = '', $options = array()) {
return serialize(array($objet, $id_objet));
}
/**
* Vérifications avant traitements du formulaire d'édition d'une date
*
* @param string $objet
* Type d'objet
* @param int $id_objet
* Identifiant de l'objet
* @param string $retour
* URL de redirection après le traitement
* @param array|string $options
* Options.
* @return Array
* Tableau des erreurs
*/
function formulaires_dater_livre_verifier_dist($objet, $id_objet, $retour = '', $options = array()) {
$erreurs = array();
// ouvrir le formulaire en edition ?
if (_request('_saisie_en_cours')) {
$erreurs['message_erreur'] = '';
return $erreurs;
}
foreach (array('date', 'date_nouvelle_edition') as $k) {
if ($v = _request($k . "_jour") and !dater_livre_recuperer_date_saisie($v, $k)) {
$erreurs[$k] = _T('format_date_incorrecte');
} elseif ($v = _request($k . "_heure") and !dater_livre_recuperer_heure_saisie($v)) {
$erreurs[$k] = _T('format_heure_incorrecte');
}
}
if (!_request('date_jour')) {
$erreurs['date'] = _T('info_obligatoire');
}
return $erreurs;
}
/**
* Traitement du formulaire d'édition d'une date
*
* @param string $objet
* Type d'objet
* @param int $id_objet
* Identifiant de l'objet
* @param string $retour
* URL de redirection après le traitement
* @param array|string $options
* Options.
* @return Array
* Retours des traitements
*/
function formulaires_dater_livre_traiter_dist($objet, $id_objet, $retour = '', $options = array()) {
$res = array('editable' => ' ');
if (_request('changer')) {
$_id_objet = id_table_objet($objet);
$table = table_objet($objet);
$trouver_table = charger_fonction('trouver_table', 'base');
$desc = $trouver_table($table);
if (!$desc) {
return array('message_erreur' => _L('erreur'));
} #impossible en principe
$champ_date = $desc['date'] ? $desc['date'] : 'date';
$set = array();
$charger = charger_fonction("charger", "formulaires/dater_livre/");
$v = $charger($objet, $id_objet, $retour, $options);
if ($v['_editer_date']) {
if (!$d = dater_livre_recuperer_date_saisie(_request('date_jour'))) {
$d = array(date('Y'), date('m'), date('d'));
}
if (!$h = dater_livre_recuperer_heure_saisie(_request('date_heure'))) {
$h = array(0, 0);
}
$set[$champ_date] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]);
}
if (isset($desc['field']['date_nouvelle_edition']) and $v['_editer_date_nouvelle_edition']) {
if (!_request('date_nouvelle_edition_jour') or _request('sans_nouvelle_edition')) {
$set['date_nouvelle_edition'] = sql_format_date(0, 0, 0, 0, 0, 0);
} else {
if (!$d = dater_livre_recuperer_date_saisie(_request('date_nouvelle_edition_jour'), "date_nouvelle_edition")) {
$d = array(date('Y'), date('m'), date('d'));
}
if (!$h = dater_livre_recuperer_heure_saisie(_request('date_nouvelle_edition_heure'))) {
$h = array(0, 0);
}
$set['date_nouvelle_edition'] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]);
}
}
if (count($set)) {
$publie_avant = objet_test_si_publie($objet, $id_objet);
include_spip('action/editer_objet');
objet_modifier($objet, $id_objet, $set);
$publie_apres = objet_test_si_publie($objet, $id_objet);
if ($publie_avant !== $publie_apres) {
// on refuse ajax pour forcer le rechargement de la page ici
// on refera traiter une 2eme fois, mais c'est sans consequence
refuser_traiter_formulaire_ajax();
}
}
}
if ($retour) {
$res['redirect'] = $retour;
}
set_request('date_jour');
set_request('date_nouvelle_edition_jour');
set_request('date_heure');
set_request('date_nouvelle_edition_heure');
return $res;
}
/**
* Récupérer annee,mois,jour sur la date saisie
*
* @param string $post
* @param string $quoi
* @return array
*/
function dater_livre_recuperer_date_saisie($post, $quoi = "date") {
if (!preg_match('#^(?:(?:([0-9]{1,2})[/-])?([0-9]{1,2})[/-])?([0-9]{4}|[0-9]{1,2})#', $post, $regs)) {
return '';
}
if ($quoi == "date_nouvelle_edition") {
if ($regs[3] <> '' and $regs[3] < 1001) {
$regs[3] += 9000;
}
return array($regs[3], $regs[2], $regs[1]);
} else {
$t = mktime(0, 0, 0, $regs[2], $regs[1], $regs[3]);
// si la date n'est pas valide selon mktime, la refuser
if (!$t) {
return '';
}
return array(date('Y', $t), date('m', $t), date('d', $t));
}
}
/**
* Récupérer heures,minutes sur l'heure saisie
*
* @param string $post
* @return array
*/
function dater_livre_recuperer_heure_saisie($post) {
if (!preg_match('#([0-9]{1,2})(?:[h:](?:([0-9]{1,2}))?)?#', $post, $regs)) {
return '';
}
return array($regs[1], $regs[2]);
}

@ -0,0 +1,76 @@
<div class='formulaire_spip formulaire_editer formulaire_#FORM formulaire_#FORM-#ENV{id_livre,nouveau}'>
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
[(#ENV{editable})
<form method="post" action="#ENV{action}"><div>
#ACTION_FORMULAIRE{#ENV{action}}
<input type="hidden" name="id_livre" value="#ENV{id_livre}" />
<div class="editer-groupe">
[(#SAISIE{input, titre, obligatoire=oui,
label=<:livre:champ_titre_label:>})]
[<div class="editer editer_rubrique[ (#ENV**{erreurs/id_parent}|oui)erreur]">
<label for="id_parent"><:titre_cadre_interieur_rubrique:></label>[
<span class="erreur_message">(#ENV**{erreurs/id_parent})</span>
]
(#VAL|chercher_rubrique{#ENV{id_livre},#ENV{id_parent},'livre',#ENV{id_secteur},'',0,form_simple})
</div>]
[(#SAISIE{input, soustitre,
label=<:livre:champ_soustitre_label:>})]
[(#SAISIE{input, volume,
label=<:livre:champ_volume_label:>})]
[(#SAISIE{input, edition,
label=<:livre:champ_edition_label:>})]
[(#SAISIE{input, traduction,
label=<:livre:champ_traduction_label:>})]
[(#SAISIE{textarea, texte,
label=<:livre:champ_texte_label:>,
conteneur_class=pleine_largeur, rows=16})]
[(#SAISIE{textarea, extrait,
label=<:livre:champ_extrait_label:>,
conteneur_class=pleine_largeur, class=inserer_barre_forum, rows=8})]
[(#SAISIE{input, infos_sup,
label=<:livre:champ_infos_sup_label:>})]
[(#SAISIE{input, isbn,
label=<:livre:champ_isbn_label:>})]
[(#SAISIE{input, pages, obligatoire=oui,
label=<:livre:champ_pages_label:>})]
[(#SAISIE{input, reliure,
label=<:livre:champ_reliure_label:>,
explication=<:livre:champ_reliure_explication:> })]
[(#SAISIE{input, largeur,
label=<:livre:champ_largeur_label:>,
explication=<:livre:champ_largeur_explication:> })]
[(#SAISIE{input, hauteur,
label=<:livre:champ_hauteur_label:>,
explication=<:livre:champ_hauteur_explication:> })]
[(#SAISIE{input, poids,
label=<:livre:champ_poids_label:>,
explication=<:livre:champ_poids_explication:> })]
[(#SAISIE{input, prix,
label=<:livre:champ_prix_label:>,
explication=<:livre:champ_prix_explication:> })]
</div>
[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
<!--extra-->
<p class="boutons"><input type="submit" class="submit" value="<:bouton_enregistrer:>" /></p>
</div></form>
]
</div>

@ -0,0 +1,160 @@
<?php
/**
* Gestion du formulaire de d'édition de livre
*
* @plugin Bouquinerie
* @copyright 2017
* @author Peetdu
* @licence GNU/GPL
* @package SPIP\Bouquinerie\Formulaires
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
include_spip('inc/actions');
include_spip('inc/editer');
/**
* Identifier le formulaire en faisant abstraction des paramètres qui ne représentent pas l'objet edité
*
* @param int|string $id_livre
* Identifiant du livre. 'new' pour un nouveau livre.
* @param int $id_rubrique
* Identifiant de l'objet parent (si connu)
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le livre créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un livre source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du livre, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return string
* Hash du formulaire
*/
function formulaires_editer_livre_identifier_dist($id_livre = 'new', $id_rubrique = 0, $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
return serialize(array(intval($id_livre), $associer_objet));
}
/**
* Chargement du formulaire d'édition de livre
*
* Déclarer les champs postés et y intégrer les valeurs par défaut
*
* @uses formulaires_editer_objet_charger()
*
* @param int|string $id_livre
* Identifiant du livre. 'new' pour un nouveau livre.
* @param int $id_rubrique
* Identifiant de l'objet parent (si connu)
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le livre créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un livre source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du livre, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return array
* Environnement du formulaire
*/
function formulaires_editer_livre_charger_dist($id_livre = 'new', $id_rubrique = 0, $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
$valeurs = formulaires_editer_objet_charger('livre', $id_livre, $id_rubrique, $lier_trad, $retour, $config_fonc, $row, $hidden);
return $valeurs;
}
/**
* Vérifications du formulaire d'édition de livre
*
* Vérifier les champs postés et signaler d'éventuelles erreurs
*
* @uses formulaires_editer_objet_verifier()
*
* @param int|string $id_livre
* Identifiant du livre. 'new' pour un nouveau livre.
* @param int $id_rubrique
* Identifiant de l'objet parent (si connu)
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le livre créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un livre source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du livre, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return array
* Tableau des erreurs
*/
function formulaires_editer_livre_verifier_dist($id_livre = 'new', $id_rubrique = 0, $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
$erreurs = array();
$erreurs = formulaires_editer_objet_verifier('livre', $id_livre, array('titre', 'pages'));
return $erreurs;
}
/**
* Traitement du formulaire d'édition de livre
*
* Traiter les champs postés
*
* @uses formulaires_editer_objet_traiter()
*
* @param int|string $id_livre
* Identifiant du livre. 'new' pour un nouveau livre.
* @param int $id_rubrique
* Identifiant de l'objet parent (si connu)
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le livre créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un livre source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du livre, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return array
* Retours des traitements
*/
function formulaires_editer_livre_traiter_dist($id_livre = 'new', $id_rubrique = 0, $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
$retours = formulaires_editer_objet_traiter('livre', $id_livre, $id_rubrique, $lier_trad, $retour, $config_fonc, $row, $hidden);
// Un lien a prendre en compte ?
if ($associer_objet and $id_livre = $retours['id_livre']) {
list($objet, $id_objet) = explode('|', $associer_objet);
if ($objet and $id_objet and autoriser('modifier', $objet, $id_objet)) {
include_spip('action/editer_liens');
objet_associer(array('livre' => $id_livre), array($objet => $id_objet));
if (isset($retours['redirect'])) {
$retours['redirect'] = parametre_url($retours['redirect'], 'id_lien_ajoute', $id_livre, '&');
}
}
}
return $retours;
}

@ -0,0 +1,38 @@
<div class='formulaire_spip formulaire_editer formulaire_#FORM formulaire_#FORM-#ENV{id_livres_auteur,nouveau}'>
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
[(#ENV{editable})
<form method="post" action="#ENV{action}"><div>
#ACTION_FORMULAIRE{#ENV{action}}
<input type="hidden" name="id_livres_auteur" value="#ENV{id_livres_auteur}" />
<div class="editer-groupe">
[(#SAISIE{input, nom, obligatoire=oui,
label=<:livres_auteur:champ_nom_label:>})]
[(#SAISIE{input, prenom,
label=<:livres_auteur:champ_prenom_label:>})]
[(#SAISIE{textarea, biographie,
label=<:livres_auteur:champ_bio_label:>,
conteneur_class=pleine_largeur, class=inserer_barre_edition, rows=4})]
<div class='editer_liens_sites fieldset'>
<fieldset>
<legend><:livres_auteur:info_site_web_livres_auteur:></legend>
[(#SAISIE{input, lien_titre,
label=<:livres_auteur:champ_lien_titre_label:>})]
[(#SAISIE{input, lien_url,
label=<:livres_auteur:champ_lien_url_label:>,
placeholder='http://...'})]
</fieldset>
</div>
</div>
[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
<!--extra-->
<p class="boutons"><input type="submit" class="submit" value="<:bouton_enregistrer:>" /></p>
</div></form>
]
</div>

@ -0,0 +1,152 @@
<?php
/**
* Gestion du formulaire de d'édition de livres_auteur
*
* @plugin Bouquinerie
* @copyright 2017
* @author Peetdu
* @licence GNU/GPL
* @package SPIP\Bouquinerie\Formulaires
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
include_spip('inc/actions');
include_spip('inc/editer');
/**
* Identifier le formulaire en faisant abstraction des paramètres qui ne représentent pas l'objet edité
*
* @param int|string $id_livres_auteur
* Identifiant du livres_auteur. 'new' pour un nouveau livres_auteur.
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le livres_auteur créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un livres_auteur source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du livres_auteur, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return string
* Hash du formulaire
*/
function formulaires_editer_livres_auteur_identifier_dist($id_livres_auteur = 'new', $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
return serialize(array(intval($id_livres_auteur), $associer_objet));
}
/**
* Chargement du formulaire d'édition de livres_auteur
*
* Déclarer les champs postés et y intégrer les valeurs par défaut
*
* @uses formulaires_editer_objet_charger()
*
* @param int|string $id_livres_auteur
* Identifiant du livres_auteur. 'new' pour un nouveau livres_auteur.
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le livres_auteur créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un livres_auteur source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du livres_auteur, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return array
* Environnement du formulaire
*/
function formulaires_editer_livres_auteur_charger_dist($id_livres_auteur = 'new', $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
$valeurs = formulaires_editer_objet_charger('livres_auteur', $id_livres_auteur, '', $lier_trad, $retour, $config_fonc, $row, $hidden);
return $valeurs;
}
/**
* Vérifications du formulaire d'édition de livres_auteur
*
* Vérifier les champs postés et signaler d'éventuelles erreurs
*
* @uses formulaires_editer_objet_verifier()
*
* @param int|string $id_livres_auteur
* Identifiant du livres_auteur. 'new' pour un nouveau livres_auteur.
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le livres_auteur créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un livres_auteur source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du livres_auteur, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return array
* Tableau des erreurs
*/
function formulaires_editer_livres_auteur_verifier_dist($id_livres_auteur = 'new', $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
$erreurs = array();
$erreurs = formulaires_editer_objet_verifier('livres_auteur', $id_livres_auteur, array('nom'));
return $erreurs;
}
/**
* Traitement du formulaire d'édition de livres_auteur
*
* Traiter les champs postés
*
* @uses formulaires_editer_objet_traiter()
*
* @param int|string $id_livres_auteur
* Identifiant du livres_auteur. 'new' pour un nouveau livres_auteur.
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le livres_auteur créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un livres_auteur source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du livres_auteur, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return array
* Retours des traitements
*/
function formulaires_editer_livres_auteur_traiter_dist($id_livres_auteur = 'new', $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
$retours = formulaires_editer_objet_traiter('livres_auteur', $id_livres_auteur, '', $lier_trad, $retour, $config_fonc, $row, $hidden);
// Un lien a prendre en compte ?
if ($associer_objet and $id_livres_auteur = $retours['id_livres_auteur']) {
list($objet, $id_objet) = explode('|', $associer_objet);
if ($objet and $id_objet and autoriser('modifier', $objet, $id_objet)) {
include_spip('action/editer_liens');
objet_associer(array('livres_auteur' => $id_livres_auteur), array($objet => $id_objet));
if (isset($retours['redirect'])) {
$retours['redirect'] = parametre_url($retours['redirect'], 'id_lien_ajoute', $id_livres_auteur, '&');
}
}
}
return $retours;
}

@ -0,0 +1,13 @@
<BOUCLE_contexte(LIVRES){id_livre}>
<title>[(#TITRE|couper{80}|textebrut) : ][(#SOUSTITRE|textebrut) - ][(#NOM_SITE_SPIP|textebrut)]</title>
[<meta name="description" content="(#TEXTE|couper{150}|textebrut)" />]
[<link rel="canonical" href="(#URL_LIVRE|url_absolue)" />]
<meta property="og:title" content="[(#TITRE|couper{80}|textebrut)]"/>
[<meta property="og:image" content="(#LOGO_LIVRE|fichier|url_absolue)"/>]
<meta property="og:url" content="#URL_LIVRE"/>
<meta property="og:site_name" content="#NOM_SITE_SPIP"/>
[<meta property="og:description" content="(#INTRODUCTION{150}|attribut_html)"/>]
<meta name="twitter:title" content="[(#TITRE|couper{80}|textebrut)]" />
[<meta name="twitter:image" content="(#LOGO_LIVRE|fichier|url_absolue)" />]
[<meta name="twitter:url" content="(#URL_LIVRE|url_absolue)" />]
</BOUCLE_contexte>

@ -0,0 +1,13 @@
<BOUCLE_contexte(LIVRES_AUTEURS){id_livres_auteur}>
<title>[(#PRENOM) ]#NOM[ - (#NOM_SITE_SPIP|textebrut)]</title>
<meta name="description" content="[(#BIO|?{[(#BIO|couper{150}|textebrut)], 'liste des livres publiés aux éditions Arléa'})]" />
[<link rel="canonical" href="(#URL_LIVRES_AUTEUR|url_absolue)" />]
<meta property="og:title" content="[(#PRENOM) ]#NOM"/>
[<meta property="og:image" content="(#LOGO_LIVRES_AUTEUR|fichier|url_absolue)"/>]
<meta property="og:url" content="#URL_LIVRES_AUTEUR"/>
<meta property="og:site_name" content="#NOM_SITE_SPIP"/>
[<meta property="og:description" content="(#BIO)"/>]
<meta name="twitter:title" content="#PRENOM #NOM" />
[<meta name="twitter:image" content="(#LOGO_LIVRES_AUTEUR|fichier|url_absolue)" />]
<meta name="twitter:url" content="#URL_LIVRES_AUTEUR" />
</BOUCLE_contexte>

@ -0,0 +1,55 @@
<?php
/**
* Préchargement des formulaires d'édition de livre
*
* @plugin Bouquinerie
* @copyright 2017
* @author Peetdu
* @licence GNU/GPL
* @package SPIP\Bouquinerie\Formulaires
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
include_spip('inc/precharger_objet');
/**
* Retourne les valeurs à charger pour un formulaire d'édition d'un livre
*
* Lors d'une création, certains champs peuvent être préremplis
* (c'est le cas des traductions)
*
* @param string|int $id_livre
* Identifiant de livre, ou "new" pour une création
* @param int $id_rubrique
* Identifiant éventuel de la rubrique parente
* @param int $lier_trad
* Identifiant éventuel de la traduction de référence
* @return array
* Couples clés / valeurs des champs du formulaire à charger.
**/
function inc_precharger_livre_dist($id_livre, $id_rubrique=0, $lier_trad=0) {
return precharger_objet('livre', $id_livre, $id_rubrique, $lier_trad, 'titre');
}
/**
* Récupère les valeurs d'une traduction de référence pour la création
* d'un livre (préremplissage du formulaire).
*
* @note
* Fonction facultative si pas de changement dans les traitements
*
* @param string|int $id_livre
* Identifiant de livre, ou "new" pour une création
* @param int $id_rubrique
* Identifiant éventuel de la rubrique parente
* @param int $lier_trad
* Identifiant éventuel de la traduction de référence
* @return array
* Couples clés / valeurs des champs du formulaire à charger
**/
function inc_precharger_traduction_livre_dist($id_livre, $id_rubrique=0, $lier_trad=0) {
return precharger_traduction_objet('livre', $id_livre, $id_rubrique, $lier_trad, 'titre');
}

@ -0,0 +1,20 @@
<?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(
// B
'bouq_titre' => 'Bouquinerie',
// C
'cfg_exemple' => 'Exemple',
'cfg_exemple_explication' => 'Explication de cet exemple',
'cfg_titre_parametrages' => 'Paramétrages',
// T
'titre_page_configurer_bouq' => 'Configurer Auteurs de livres',
);

@ -0,0 +1,74 @@
<?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_livre' => 'Ajouter ce livre',
// C
'champ_date_parution_label' => 'Date de parution',
'champ_date_nouvelle_edition_label' => 'Date nouvelle édition',
'champ_edition_label' => 'Édition',
'champ_extrait_label' => 'Extrait',
'champ_hauteur_explication' => 'en cm',
'champ_hauteur_label' => 'Hauteur',
'champ_infos_sup_label' => 'Infos supplémentaires',
'champ_isbn_label' => 'ISBN',
'champ_largeur_explication' => 'en cm',
'champ_largeur_label' => 'Largeur',
'champ_pages_label' => 'Nombre de pages',
'champ_poids_explication' => 'En grammes',
'champ_poids_label' => 'Poids',
'champ_prix_explication' => 'Sans le symbole €',
'champ_prix_label' => 'Prix',
'champ_reliure_explication' => 'Brochée, collée, etc.',
'champ_reliure_label' => 'Reliure',
'champ_soustitre_label' => 'Soustitre',
'champ_texte_label' => 'Présentation',
'champ_titre_label' => 'Titre',
'champ_traduction_label' => 'Traduit de…',
'champ_volume_label' => 'Volume',
'confirmer_supprimer_livre' => 'Confirmez-vous la suppression de cet livre ?',
// I
'icone_creer_livre' => 'Créer un livre',
'icone_modifier_livre' => 'Modifier ce livre',
'info_1_livre' => 'Un livre',
'info_aucun_livre' => 'Aucun livre',
'info_livres_auteur' => 'Les livres de cet auteur',
'info_nb_livres' => '@nb@ livres',
'info_livres_proposes' => 'Livres proposés',
// R
'retirer_lien_livre' => 'Retirer ce livre',
'retirer_tous_liens_livres' => 'Retirer tous les livres',
'role_grand_format' => 'Grand format',
'role_poche' => 'Poche',
// S
'supprimer_livre' => 'Supprimer cet livre',
// T
'texte_ajouter_livre' => 'Ajouter un livre',
'texte_changer_statut_livre' => 'Ce livre est :',
'texte_creer_associer_livre' => 'Créer et associer un livre',
'texte_date_parution' => 'Date de parution',
'texte_definir_comme_traduction_livre' => 'Ce livre est une traduction du livre numéro :',
'texte_date_nouvelle_edition_nonaffichee' => 'Ne pas afficher la date de nouvelle publication',
'texte_statut_aparaitre' => 'à paraître',
'texte_statut_paru' => 'paru',
'texte_statut_epuise' => 'épuisé',
'texte_livres_recents' => 'Livres les plus récents',
'titre_langue_livre' => 'Langue de ce livre',
'titre_livre' => 'Livre',
'titre_livres' => 'Livres',
'titre_livres_rubrique' => 'Livres de la rubrique',
'titre_logo_livre' => 'Couverture livre',
'titre_objets_lies_livre' => 'Liés à ce livre',
);