Browse Source

Refacto du formulaire d'ajout d'albums, avec prise en compte de bigup.

pull/21/head
tcharlss 11 months ago
parent
commit
d5eefbfb8f
  1. 182
      formulaires/ajouter_album.html
  2. 381
      formulaires/ajouter_album.php
  3. 47
      formulaires/inc-ajouter_album_choisir.html
  4. 57
      formulaires/inc-ajouter_album_creer.html
  5. 35
      formulaires/inc-ajouter_album_menu.html

182
formulaires/ajouter_album.html

@ -1,143 +1,69 @@
[(#REM)
Formulaire pour ajouter un ou plusieurs albums à un objet.
On peut soit créer et remplir un nouvel album, soit choisir un ou plusieurs albums existants.
Dans le premier cas, il s'agit en gros d'un fusion des formulaires « editer_album » et « joindre_document ».
Formulaire pour ajouter rapidement un nouvel album.
Utilise :
formulaires/inc-upload_document.html
L'album peut être autonome ou lié optionnellement à un objet.
Il s'agit en gros d'une fusion des formulaires « editer_album », « joindre_document » et « editer_liens ».
On peut ainsi ajouter les documents dès la création de l'album.
Dans le cas d'une liaison à un objet, on dispose d'une méthode supplémentaire
qui consiste à choisir des albums existants.
La vue permet alors de basculer d'une méthode à l'autre via un menu à onglets.
Ceci est désactivable dans les options passées au formulaire.
En cas d'utilisation côté public, la page doit inclure les ressources suivantes :
- scripts de Bigup à activer dans sa configuration
- script prive/javascript/albums_edit.js pour les onglets
- styles CSS pour la modale permettant de choisir un album
- Script prive/javascript/medias_edit.js pour l'édition des documents
]
#SET{ul,#SPIP_VERSION|floatval|>={3.1}|?{div,ul}}
#SET{li,#SPIP_VERSION|floatval|>={3.1}|?{div,li}}
#SET{id_unique,#ENV{objet_associer}|concat{#ENV{id_objet_associer}|intval}}
#SET{edition,#EVAL{_request('exec')}|match{_edit$}|?{1}}
<div class='formulaire_spip formulaire_#FORM'>
<h3 class='titrem'>[(#CHEMIN_IMAGE{album-24.png}|balise_img{'',cadre-icone})]<:album:icone_ajouter_album:></h3>
#SET{id_unique,#ENV{associer_objet,autonome}|replace{'\|'}}
#SET{id_form,#VAL{formulaire_}|concat{#FORM,_,#GET{id_unique}}}
#SET{id_creer,creer-album-#GET{id_unique}}
#SET{id_choisir,choisir-album-#GET{id_unique}}
<div class="formulaire_spip formulaire_#FORM mini" id="#GET{id_form}">
<h3 class="titrem">
<:album:icone_ajouter_album:>
[<a href="(#ENV{_url_fermer})" class="ajax btn btn_fermer btn_mini btn_link btn_icone_after">
<span class="btn__label"><:bouton_fermer:></span>
[(#CHEMIN_IMAGE{fermer-16.png}|balise_img{'',sp-icone})]
</a>]
</h3>
[<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}' name="formulaire_ajouter_album" id="formulaire_ajouter_album_#GET{id_unique}"><div>
#ACTION_FORMULAIRE{#ENV{action}}
[(#REM)
Onglet « Création d'un nouvel album »
<form method="post" action="#ENV{action}"><div>
#ACTION_FORMULAIRE
[(#REM) Menu ]
[(#ENV{associer_objet}|oui)
<INCLURE{fond=formulaires/inc-ajouter_album_menu,
_id_creer=#GET{id_creer},
_id_choisir=#GET{id_choisir},
env}
>
]
<div id="creer-album-#GET{id_unique}">
<h4 class="menu">
<span class="creer"><:album:onglet_ajouter_creer:></span> | <span class="choisir"><a href="#"><:album:onglet_ajouter_choisir:></a></span>
</h4>
<p class="explication"><strong><:album:label_onglet_ajouter_creer:></strong></p>
<p class="explication"><:album:explication_onglet_ajouter_creer:></p>
<[(#GET{ul})] class="editer-groupe">
#SET{name,titre} #SET{obli,''} #SET{defaut,#ENV{titre_defaut,''}} #SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<[(#GET{li})] class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label for="#GET{name}"><:album:label_titre:></label>[
<span class='erreur_message'>(#GET{erreurs})</span>
]<input type="text" name="#GET{name}" class="text" value="#ENV*{#GET{name},#GET{defaut}}" id="#GET{name}" placeholder="<:album:info_nouvel_album|attribut_html:>" />
</[(#GET{li})]>
#SET{name,descriptif} #SET{obli,''} #SET{defaut,#ENV{titre_defaut,''}} #SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<[(#GET{li})] class="editer editer_[(#GET{name})_album][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label for="text_area"><:album:label_descriptif:></label>[
<span class='erreur_message'>(#GET{erreurs})</span>
]<textarea name="#GET{name}" id="#GET{name}"[ lang="(#LANGUE)"] rows="[(#GET{edition}|?{2,4})]" cols="40">[(#ENV*{#GET{name}})]</textarea>
</[(#GET{li})]>
</[(#GET{ul})]>
[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
<!--extra-->
[(#REM) documents ]
<div class="documents">
<strong>[(#CHEMIN_IMAGE{document-12.png}|balise_img) ]<:medias:info_documents:></strong>
<INCLURE{fond=formulaires/inc-upload_document,
env,
objet=album,
id_objet=#ENV{_id_temporaire},
mediatheque=oui,
mode=document}>
</div>
</div><!-- #creer-album -->
[(#REM)
Onglet « Choix d'un album existant »
[(#REM) Création d'un nouvel album ]
<INCLURE{fond=formulaires/inc-ajouter_album_creer,
_id_creer=#GET{id_creer},
env}
>
[(#REM) Choix d'un album existant ]
[(#ENV{associer_objet}|oui)
<INCLURE{fond=formulaires/inc-ajouter_album_choisir,
_id_choisir=#GET{id_choisir},
_id_form=#GET{id_form},
env}
>
]
<div id="choisir-album-#GET{id_unique}" style="display:none;">
<h4 class="menu">
<span class="creer"><a href="#"><:album:onglet_ajouter_creer:></a></span> | <span class="choisir"><:album:onglet_ajouter_choisir:></span>
</h4>
<p class="explication"><strong><:album:label_onglet_ajouter_choisir:></strong></p>
<p class="explication"><:album:explication_onglet_ajouter_choisir:></p>
<[(#GET{ul})] class="editer-groupe">
#SET{name,ids_albums_associer} #SET{obli,''} #SET{defaut,''} #SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<[(#GET{li})] class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label for="#GET{name}"><:album:label_album_numero:></label>[
<span class='erreur_message'>(#GET{erreurs})</span>
]<input type="text" name="#GET{name}" class="text identifiants" value="#ENV*{#GET{name},#GET{defaut}}" id="ids_albums_associer_#GET{id_unique}" />
<input class="submit file" type="button" name="parcourir_albums" value="<:medias:bouton_parcourir:>"
onclick="jQuery.modalboxload('#URL_ECRIRE{popin-choisir_album,var_zajax=contenu&selectfunc=albumselect#GET{id_unique}}&objet=#ENV{objet_associer}&id_objet=#ENV{id_objet_associer}',{autoResize: true});"
/>
</[(#GET{li})]>
</[(#GET{ul})]>
<p class='boutons'[ style="direction: (#LANG_DIR|=={ltr}|?{rtl,ltr})"]>
<input class="submit" type="submit" name="choisir_album" value="<:bouton_enregistrer:>" />
</p>
</div><!-- #choisir-album -->
</div></form>
]
</div>
[(#REM) Scripts :
- la gestion des onglets et intitulé du bouton de validation
- poster automatiquement le formulaire aux choix d'un album dans la modalbox
]
<script type='text/javascript'>/*<![CDATA[*/
jQuery(document).ready(function($) {
// fn : gestion onglets + intitulés bouton validation
function ajouter_album() {
var creer = $("#creer-album-[(#GET{id_unique})]");
var choisir = $("#choisir-album-[(#GET{id_unique})]");
var menu_creer = $("#formulaire_ajouter_album_[(#GET{id_unique}) ].menu .creer");
var menu_choisir = $("#formulaire_ajouter_album_[(#GET{id_unique}) ].menu .choisir");
var bouton = $("#formulaire_ajouter_album_[(#GET{id_unique}) ]input[name='choisir_album']");
menu_creer.click(function() {
if (creer.is(':hidden')) {
creer.slideDown(function(){$(this).find("input#titre").focus()});
choisir.slideUp();
bouton.attr("value","<:bouton_enregistrer:>");
return false;
}
});
menu_choisir.click(function() {
if (choisir.is(':hidden')) {
creer.slideUp()
choisir.slideDown(function(){$(this).find("input#ids_albums_associer_#GET{id_unique}").focus()});
bouton.attr("value","<:bouton_valider:>");
return false;
}
});
}
// init
ajouter_album();
// relance en cas de rechargement ajax
if (window.jQuery) jQuery(function(){
onAjaxLoad(ajouter_album);
});
});
// fn : validation du formulaire au choix d'un album dans la modalbox
function albumselect#GET{id_unique}(id){
$.modalboxclose();
$("#ids_albums_associer_#GET{id_unique}").attr('value',id).focus();
$('#formulaire_ajouter_album_[(#GET{id_unique}) ]input\[name=choisir_album\]').get(0).click();
}
/*]]>*/</script>
</div>

381
formulaires/ajouter_album.php

@ -1,12 +1,11 @@
<?php
/**
* Gestion du formulaire d'ajout d'albums à un objet
* Gestion du formulaire d'ajout d'album
*
* Le formulaire permet soit de créer et remplir un nouvel album,
* soit de choisir un ou plusieurs albums existants.
* Dans le premier cas, il s'agit en gros d'un fusion des formulaires
* «editer_album» et «joindre_document» : les traitements sont identiques
* à ceux de ces 2 formulaires.
* soit de choisir des albums existants.
* Il s'agit en gros d'une fusion des formulaires
* editer_album, joindre_document et editer_liens.
*
* @plugin Albums
* @copyright 2014
@ -20,6 +19,30 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Identifier le formulaire en faisant abstraction des paramètres qui ne représentent pas l'objet edité
*
* @param int|string $objet
* type d'un objet à associer (optionnel).
* @param int|string $id_objet
* Identifiant d'un objet à associer (optionnel).
* @param string $redirection
* URL de redirection après le traitement
* @param int $lier_trad
* Identifiant éventuel d'un album source d'une traduction
* @param array $options
* Tableau d'options
* - url_fermer (string) : ajoute un bouton ajax de fermeture
* - ajaxreload (string) : identifiant ajax ou sélecteur jQuery d'un bloc à recharger.
* - ajaxreload_params (array) : paramètres à transmettre au bloc rechargé.
* @return string
* Hash du formulaire
*/
function formulaires_ajouter_album_identifier_dist($objet = '', $id_objet = 0, $redirection = '', $lier_trad = 0, $options = []) {
$hash = serialize(array($objet, $id_objet));
return $hash;
}
/**
* Chargement du formulaire d'ajout d'album
*
@ -32,41 +55,58 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* type de l'objet à associer.
* @param int|string $id_objet
* Identifiant de l'objet à associer.
* @param string $retour
* @param string $redirection
* URL de redirection après le traitement
* @param int $lier_trad
* Identifiant éventuel d'un album source d'une traduction
* @param array $options
* Tableau d'options
* - url_fermer (string) : ajoute un bouton ajax de fermeture
* - ajaxreload (string) : identifiant ajax ou sélecteur jQuery d'un bloc à recharger.
* - ajaxreload_params (array) : paramètres à transmettre au bloc rechargé.
* @return array
* Environnement du formulaire
*/
function formulaires_ajouter_album_charger_dist($objet = '', $id_objet = 0, $retour = '', $lier_trad = 0) {
$valeurs = array();
$valeurs['ids_albums_associer'] = '';
$valeurs['objet_associer'] = $objet;
$valeurs['id_objet_associer'] = $id_objet;
// valeurs du formulaire d'édition d'un album
$charger_editer_album = charger_fonction('charger', 'formulaires/editer_album');
$valeurs_editer_album = $charger_editer_album('new', $retour, $objet.'|'.$id_objet, $lier_trad);
if (count($valeurs_editer_album)) {
$valeurs = array_merge($valeurs, $valeurs_editer_album);
}
function formulaires_ajouter_album_charger_dist($objet = '', $id_objet = 0, $redirection = '', $lier_trad = 0, $options = []) {
$editable = autoriser('ajouteralbum', $objet, $id_objet);
$valeurs = [
'editable' => $editable,
'_url_fermer' => ($options['url_fermer'] ?? null),
];
// valeurs du formulaire d'ajout de documents
$charger_joindre_document = charger_fonction('charger', 'formulaires/joindre_document');
$valeurs_joindre_document = $charger_joindre_document(
'new',
0-$GLOBALS['visiteur_session']['id_auteur'],
'album',
'document'
);
if (count($valeurs_joindre_document)) {
$valeurs = array_merge($valeurs, $valeurs_joindre_document);
if ($editable) {
$associer_objet = (($objet and $id_objet) ? "$objet|$id_objet" : '');
$valeurs = array_merge($valeurs, [
'ids_albums_associer' => '',
'associer_objet' => $associer_objet,
'_bigup_rechercher_fichiers' => true, // pour activer bigup sur le formulaire
]);
// Valeurs du formulaire d'édition d'un album
$charger_editer_album = charger_fonction('charger', 'formulaires/editer_album');
$valeurs_editer_album = $charger_editer_album('new', $redirection, $associer_objet, $lier_trad);
if (count($valeurs_editer_album)) {
$valeurs = array_merge($valeurs, $valeurs_editer_album);
}
// Valeurs du formulaire d'ajout de documents
// Hack : identifiant négatif pour l'instant, cf. medias_post_insertion()
$id_album_temp = 0-$GLOBALS['visiteur_session']['id_auteur'];
$charger_joindre_document = charger_fonction('charger', 'formulaires/joindre_document');
$valeurs_joindre_document = $charger_joindre_document(
'new',
$id_album_temp,
'album',
'document'
);
$valeurs = array_merge(
$valeurs,
$valeurs_joindre_document,
['_id_album_temp' => $id_album_temp]
);
}
// valeur de l'identifiant négatif pour l'ajout de documents
// cf. medias_pipelines.php L.161
$valeurs['_id_temporaire'] = 0-$GLOBALS['visiteur_session']['id_auteur'];
return $valeurs;
}
@ -82,54 +122,66 @@ function formulaires_ajouter_album_charger_dist($objet = '', $id_objet = 0, $ret
* type de l'objet à associer.
* @param int|string $id_objet
* Identifiant de l'objet à associer.
* @param string $retour
* @param string $redirection
* URL de redirection après le traitement
* @param int $lier_trad
* Identifiant éventuel d'un album source d'une traduction
* @param array $options
* Tableau d'options
* - ajaxreload (string) : identifiant ajax ou sélecteur jQuery d'un bloc à recharger.
* - ajaxreload_params (array) : paramètres à transmettre au bloc rechargé.
* @return array
* Tableau des erreurs
*/
function formulaires_ajouter_album_verifier_dist($objet = '', $id_objet = 0, $retour = '', $lier_trad = 0) {
$erreurs = array();
// onglet créer un album
if (!_request('choisir_album')) {
// erreurs du formulaire d'édition d'un album
$verifier_editer_album = charger_fonction('verifier', 'formulaires/editer_album');
$erreurs_editer_album = $verifier_editer_album('new', $retour, $objet.'|'.$id_objet, $lier_trad);
if (is_array($erreurs_editer_album)
and count($erreurs_editer_album)
) {
$erreurs = array_merge($erreurs, $erreurs_editer_album);
}
function formulaires_ajouter_album_verifier_dist($objet = '', $id_objet = 0, $redirection = '', $lier_trad = 0, $options = []) {
// erreurs du formulaire d'ajout de documents
// on autorise le fait de ne pas avoir choisi de fichier (album vide)
// FIXME on se base sur le texte du message d'erreur retourné, il y a sans doute plus propre
$verifier_joindre_document = charger_fonction('verifier', 'formulaires/joindre_document');
$erreurs_joindre_document = $verifier_joindre_document(
'new',
0-$GLOBALS['visiteur_session']['id_auteur'],
'album',
'document'
);
$messages_aucun_document = array(
_T('medias:erreur_indiquez_un_fichier'),
_T('medias:erreur_aucun_document')
);
if (is_array($erreurs_joindre_document)
and count($erreurs_joindre_document)
and !in_array($erreurs_joindre_document['message_erreur'], $messages_aucun_document)
) {
$erreurs = [];
// Méthode d'ajout : on se base sur le name du bouton submit
// (présent uniquement sur celui de l'onglet choisir).
$methode = (_request('choisir_album') ? 'choisir' : 'creer');
switch ($methode) {
// Créer un nouvel album.
case 'creer':
// Erreurs du formulaire d'édition d'un album.
$verifier_editer_album = charger_fonction('verifier', 'formulaires/editer_album');
if ($erreurs_editer_album = $verifier_editer_album(
'new',
$redirection,
"$objet|$id_objet",
$lier_trad
)) {
$erreurs = array_merge($erreurs, $erreurs_editer_album);
}
// Erreurs du formulaire d'ajout de documents.
$verifier_joindre_document = charger_fonction('verifier', 'formulaires/joindre_document');
$erreurs_joindre_document = $verifier_joindre_document(
'new',
0-$GLOBALS['visiteur_session']['id_auteur'],
'album',
'document'
);
$erreurs = array_merge($erreurs, $erreurs_joindre_document);
}
// Supprimer le message d'erreur indiquant qu'il n'y a pas de document : on autorise les albums vides.
// FIXME on se base sur le texte du message d'erreur retourné, il y a sans doute plus propre.
$messages_aucun_document = [
_T('medias:erreur_indiquez_un_fichier'),
_T('medias:erreur_aucun_document'),
_T('medias:erreur_aucun_fichier'),
];
if (!in_array($erreurs_joindre_document['message_erreur'], $messages_aucun_document)) {
unset($erreurs['message_erreur']);
}
break;
// onglet choisir un album
} else {
if (!_request('ids_albums_associer')) {
$erreurs['ids_albums_associer'] = _T('info_obligatoire');
}
// Associer des albums existants.
case 'choisir':
if (!_request('ids_albums_associer')) {
$erreurs['ids_albums_associer'] = _T('info_obligatoire');
}
break;
}
return $erreurs;
@ -147,104 +199,133 @@ function formulaires_ajouter_album_verifier_dist($objet = '', $id_objet = 0, $re
* type de l'objet à associer.
* @param int|string $id_objet
* Identifiant de l'objet à associer.
* @param string $retour
* @param string $redirection
* URL de redirection après le traitement
* @param int $lier_trad
* Identifiant éventuel d'un album source d'une traduction
* @param array $options
* Tableau d'options
* - ajaxreload (string) : identifiant ajax ou sélecteur jQuery d'un bloc à recharger.
* - ajaxreload_params (array) : paramètres à transmettre au bloc rechargé.
* @return array
* Retours des traitements
* Tableau de retours des traitements
* id_album, ids_documents, message_ok, message_erreur
*/
function formulaires_ajouter_album_traiter_dist($objet = '', $id_objet = 0, $retour = '', $lier_trad = 0) {
$res = array();
// onglet créer un album
if (!_request('choisir_album')) {
// traitement des documents si des fichiers ont été choisis
include_spip('inc/joindre_document');
$id_temporaire = 0-$GLOBALS['visiteur_session']['id_auteur'];
$verifier_joindre_document = charger_fonction('verifier', 'formulaires/joindre_document');
$res_verifier_joindre_document = $verifier_joindre_document('new', $id_temporaire, 'album', 'document');
if (count($res_verifier_joindre_document) == 0) {
$traiter_joindre_document = charger_fonction('traiter', 'formulaires/joindre_document');
$res_joindre_document = $traiter_joindre_document('new', $id_temporaire, 'album', 'document');
$res = array_merge($res, $res_joindre_document);
}
// pas besoin du js ajouté dans le message de retour
if (isset($res['message_ok']) and $res['message_ok']) {
$res['message_ok'] = preg_replace('/(<script.*<\/script>)/is', '', $res['message_ok']);
}
function formulaires_ajouter_album_traiter_dist($objet = '', $id_objet = 0, $redirection = '', $lier_trad = 0, $options = []) {
// traitement de l'album
set_request('statut', 'publie');
$traiter_editer_album = charger_fonction('traiter', 'formulaires/editer_album');
$res_editer_album = $traiter_editer_album('new', $retour, $objet.'|'.$id_objet, $lier_trad);
if (is_array($res_editer_album)) {
$res = array_merge($res, $res_editer_album);
}
if (isset($res['message_ok'])
and $res['message_ok']
and $id_album = $res['id_album']
) {
$res['message_ok'] = _T(
'album:message_id_album_ajoute',
array('id_album' => $id_album, 'url' => ancre_url(self(), 'album'.$id_album))
);
$res['message_ok'] .= js_ajouter_albums($id_album);
// r.a.z des champs
foreach (array('titre','descriptif','refdoc_joindre') as $champ) {
set_request($champ, '');
$retours = [];
$erreurs = [];
$ok_album = false;
$ok_docs = false;
$associer_objet = (($objet and $id_objet) ? "$objet|$id_objet" : '');
$ids_albums = [];
// Méthode d'ajout : on se base sur le name du bouton submit
// (présent uniquement sur celui de l'onglet choisir).
$methode = (_request('choisir_album') ? 'choisir' : 'creer');
switch ($methode) {
// Créer un nouvel album.
case 'creer':
// Traitement de l'album
// On publie d'office uniquement si l'objet à lier est lui-même publié.
if (
$associer_objet
and objet_test_si_publie($objet, $id_objet)
) {
set_request('statut', 'publie');
}
}
$traiter_editer_album = charger_fonction('traiter', 'formulaires/editer_album');
$retours_editer_album = $traiter_editer_album('new', $redirection, $associer_objet, $lier_trad);
$ids_albums = (!empty($retours_editer_album['id_album']) ? [$retours_editer_album['id_album']] : []);
// Erreur
if (!empty($retours_editer_album['message_erreur'])) {
$erreurs[] = $retours_editer_album['message_erreur'];
}
// Si album ok, on passe aux documents
if (!empty($retours_editer_album['id_album'])) {
$id_album = $retours_editer_album['id_album'];
$retours['id_album'] = $id_album;
$retours['message_ok'] = _T('album:message_id_album_ajoute');
$ok_album = true;
// onglet choisir un album
} else {
$ids = _request('ids_albums_associer');
$ids = explode(',', $ids);
include_spip('action/editer_liens');
if ($nb=objet_associer(array('album'=>$ids), array($objet => $id_objet))) {
// singulier_ou_pluriel ne semble pas aimer les chaines avec parametres
if ($nb == 1) {
$id_album=intval($ids[0]);
$message = _T(
'album:message_id_album_ajoute',
array('id_album' => $id_album, 'url' => ancre_url(self(), 'album'.$id_album))
);
} elseif ($nb > 1) {
$message = _T('album:message_nb_albums_ajoutes');
include_spip('inc/joindre_document');
$traiter_joindre_document = charger_fonction('traiter', 'formulaires/joindre_document');
$retours_joindre_document = $traiter_joindre_document('new', $id_album, 'album', 'document');
// Ok : on ne retourne que les ids, pas besoin du message_ok des documents
if (!empty($retours_joindre_document['ids'])) {
$retours['ids_documents'] = $retours_joindre_document['ids'];
$ok_docs = true;
}
// Erreur
if (!empty($retours_joindre_document['message_erreur'])) {
$erreurs[] = $retours_joindre_document['message_erreur'];
}
}
$res['message_ok'] = $message;
$res['message_ok'] .= js_ajouter_albums($ids);
// r.a.z du champ
set_request('ids_albums_associer', '');
} else {
$res['message_erreur'] = _T('erreur');
break;
// Associer des albums existants.
case 'choisir':
$ids_albums = explode(',', _request('ids_albums_associer'));
include_spip('action/editer_liens');
if ($nb = objet_associer(['album' => $ids_albums], [$objet => $id_objet])) {
$retours['message_ok'] = singulier_ou_pluriel($nb, 'album:message_1_album_ajoute', 'album:message_nb_albums_ajoutes');
} else {
$erreurs[] = _T('erreur');
}
break;
}
// Messages d'erreurs
if ($erreurs) {
$retours['message_erreur'] = implode('<br>', $erreurs);
}
// Rechargement ajax
$ajaxreload = $options['ajaxreload'] ?? null;
$ajaxparams = $options['ajaxreload_params'] ?? [];
if ($ajaxreload) {
$retours['message_ok'] .= js_ajouter_albums($ajaxreload, $ajaxparams, $ids_albums);
}
// Redirection
if ($redirection) {
$retours['redirect'] = $redirection;
}
// Si ok on remet tous les champs à zéro
if ($ok_album and $ok_docs) {
foreach (['titre', 'descriptif', 'refdoc_joindre', 'ids_albums_associer'] as $champ) {
set_request($champ, '');
}
}
$res['editable'] = true;
return $res;
return $retours;
}
/**
* Fonction privée retournant le js pour recharger les blocs adéquats
*
* @param string|array $ids identifiants des albums ajoutés
* @param string $ajaxbloc identifiant d'un bloc ajax
* @param array $ids identifiants des albums ajoutés
* @return string message js
*/
function js_ajouter_albums($ids = array()) {
if (!intval($ids)) {
return;
}
if (!is_array($ids)) {
$ids = array($ids);
}
$divs = array();
foreach ($ids as $id) {
$divs[] = "#album${id}";
function js_ajouter_albums(string $ajaxbloc, array $params = [], array $ids = []) : string {
if ($ids) {
$divs = [];
foreach ($ids as $id) {
$divs[] = "#album${id}";
}
$divs = implode(',', $divs);
$callback = "function(){ jQuery('${divs}').animateAppend(); }";
$params['callback'] = $callback;
}
$divs = implode(',', $divs);
$callback = "jQuery('${divs}').animateAppend();";
$js = "if (window.jQuery) jQuery(function(){ajaxReload('liste_albums',{callback:function(){ $callback }});});";
$js = "<script type='text/javascript'>${js}</script>";
$params = json_encode($params);
$js = "if (window.jQuery) jQuery(function(){ajaxReload('$ajaxbloc',$params);});";
$js = "<script type=\"text/javascript\">$js</script>";
return $js;
}

47
formulaires/inc-ajouter_album_choisir.html

@ -0,0 +1,47 @@
[(#REM)
Onglet choix d'un album existant
]
<div
tabindex="0"
role="tabpanel"
id="#ENV{_id_choisir}"
aria-labelledby="#ENV{_id_choisir}-menu"
data-tab="choisir"
hidden=""
style="display: none;"
>
<div class="editer-groupe">
#SET{name,ids_albums_associer}
#SET{id,#GET{name}_edit}
#SET{defaut,''}
#SET{valeur,#ENV*{#GET{name},#GET{defaut}}}
#SET{obli,''}
#SET{erreurs,#ENV**{erreurs/#GET{name}}}
#SET{url_modale,#URL_ECRIRE{modale_albums_choisir,var_zajax=contenu}
|parametre_url{associer_objet,#ENV{associer_objet}}
|parametre_url{form,#ENV{_id_form}}
}
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label for="#GET{id}"><:album:label_album_numero:></label>
[<span class='erreur_message'>(#GET{erreurs})</span>]
<p class="explication"><:album:explication_album_numero:></p>
<div class="input-btn">
<input type="text" name="#GET{name}" id="#GET{id}" class="text ids" value="#GET{valeur}" />
<button
type="button"
name="parcourir_albums"
class="btn btn_secondaire btn_parcourir"
data-url_modale="#GET{url_modale}"
><:medias:bouton_parcourir:></button>
</div>
</div>
</div>
<p class='boutons'>
<button class="submit" type="submit" name="choisir_album" value="1"><:album:bouton_ajouter_choisir:></button>
</p>
</div>

57
formulaires/inc-ajouter_album_creer.html

@ -0,0 +1,57 @@
[(#REM)
Onglet création d'un nouvel album
]
<div
tabindex="0"
role="tabpanel"
id="#ENV{_id_creer}"
aria-labelledby="#ENV{_id_creer}-menu"
data-tab="creer"
>
[(#REM) Texte de l'album ]
<div class="editer-groupe">
#SET{name,titre}
#SET{id,champ_#GET{name}}
#SET{defaut,#ENV{titre_defaut}}
#SET{valeur,#ENV*{#GET{name},#GET{defaut}}}
#SET{obli,''}
#SET{erreurs,#ENV**{erreurs/#GET{name}}}
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur] pleine_largeur">
<label for="#GET{name}"><:album:label_titre:></label>
[<span class="erreur_message">(#GET{erreurs})</span>]
<input type="text" name="#GET{name}" id="#GET{id}" class="text" value="#GET{valeur}" placeholder="<:album:info_nouvel_album|attribut_html:>" />
</div>
#SET{name,descriptif}
#SET{id,champ_#GET{name}}
#SET{defaut,''}
#SET{valeur,#ENV*{#GET{name},#GET{defaut}}}
#SET{obli,''}
#SET{erreurs,#ENV**{erreurs/#GET{name}}}
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label for="#GET{id}"><:album:label_descriptif:></label>
[<span class="erreur_message">(#GET{erreurs})</span>]
<textarea name="#GET{name}" id="#GET{id}"[ lang="(#LANG)"] rows="2">#GET{valeur}</textarea>
</div>
</div>
[(#REM) ajouter les saisies supplementaires : extra et autre, à cet endroit ]
<!--extra-->
[(#REM) documents ]
<div class="documents formulaire_joindre_document">
<INCLURE{fond=formulaires/inc-upload_document,
env,
objet=album,
id_objet=#ENV{_id_album_temp},
mediatheque=oui,
mode=document}
>
</div>
</div>

35
formulaires/inc-ajouter_album_menu.html

@ -0,0 +1,35 @@
[(#REM)
Menu des onglets pour le formulaire d'ajout d'album
Accessible, sauf pour la navigation au clavier (touches droite et gauche).
On verra quand on aura une lib adéquate dans le core.
Amélioration progressive : sans JS, de simples liens vers des ancres internes.
Avec JS, les liens se comportent comme des onglets, 1 seul affiché à la fois.
]
<nav
class="onglets_simple"
role="tablist"
aria-label="<:albums:label_menu_ajouter_album|attribut_html:>"
>
<ul>
<BOUCLE_onglets(DATA) {source table, #LISTE{creer,choisir}}>
<li>
#SET{expose,#COMPTEUR_BOUCLE|=={1}}
[(#SELF|ancre_url{#ENV{_id_#VALEUR}}
|lien_ou_expose{
#VAL{album:onglet_ajouter_#VALEUR}|_T{},
#GET{expose}|?{a.menu-onglets__item on},
menu-onglets__item
}|inserer_attribut{role,tab}
|inserer_attribut{id,#ENV{_id_#VALEUR}-menu}
|inserer_attribut{aria-selected,#GET{expose}|?{true,false}}
|inserer_attribut{aria-controls,#ENV{_id_#VALEUR}}
|inserer_attribut{tabindex,#GET{expose}|?{0,-1}}
)]
</li>
</BOUCLE_onglets>
</ul>
</nav>
Loading…
Cancel
Save