You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

355 lines
12 KiB

<?php
/**
* Gestion du formulaire d'ajout d'album
*
* Le formulaire permet soit de créer et remplir un nouvel album,
* 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
* @author Tetue, Charles Razack
* @licence GNU/GPL
* @package SPIP\Albums\Formulaires
*/
// Sécurité
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 (array|string) : identifiants de blocs ajax à recharger.
* - ajaxreload_params (array) : paramètres à transmettre aux blocs rechargés.
* @return string
* Hash du formulaire
*/
function formulaires_ajouter_album_identifier_dist($objet = '', $id_objet = 0, $redirection = '', $lier_trad = 0, $options = []) {
$hash = serialize([$objet, $id_objet]);
return $hash;
}
/**
* Chargement du formulaire d'ajout d'album
*
* Déclarer les champs postés et y intégrer les valeurs par défaut
*
* @uses formulaires_editer_album_charger()
* @uses formulaires_joindre_document_charger()
*
* @param int|string $objet
* type de l'objet à associer.
* @param int|string $id_objet
* Identifiant de l'objet à associer.
* @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 (array|string) : identifiants de blocs ajax à recharger.
* - ajaxreload_params (array) : paramètres à transmettre aux blocs rechargés.
* @return array
* Environnement du formulaire
*/
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),
];
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 (is_countable($valeurs_editer_album) ? count($valeurs_editer_album) : 0) {
$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,
'onglet' => '',
],
);
}
return $valeurs;
}
/**
* Vérifications du formulaire d'ajout d'album
*
* Vérifier les champs postés et signaler d'éventuelles erreurs
*
* @uses formulaires_editer_album_verifier()
* @uses formulaires_joindre_document_verifier()
*
* @param int|string $objet
* type de l'objet à associer.
* @param int|string $id_objet
* Identifiant de l'objet à associer.
* @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 (array|string) : identifiants de blocs ajax à recharger.
* - ajaxreload_params (array) : paramètres à transmettre aux blocs rechargés.
* @return array
* Tableau des erreurs
*/
function formulaires_ajouter_album_verifier_dist($objet = '', $id_objet = 0, $redirection = '', $lier_trad = 0, $options = []) {
$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':
set_request('onglet', '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 (
!empty($erreurs_joindre_document['message_erreur'])
and in_array($erreurs_joindre_document['message_erreur'], $messages_aucun_document)
) {
unset($erreurs['message_erreur']);
}
break;
// Associer des albums existants.
case 'choisir':
set_request('onglet', 'choisir');
if (!_request('ids_albums_associer')) {
$erreurs['ids_albums_associer'] = _T('info_obligatoire');
}
break;
}
return $erreurs;
}
/**
* Traitement du formulaire d'ajout d'album
*
* Traiter les champs postés
*
* @uses formulaires_editer_album_traiter()
* @uses formulaires_joindre_document_traiter()
*
* @param int|string $objet
* type de l'objet à associer.
* @param int|string $id_objet
* Identifiant de l'objet à associer.
* @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 (array|string) : identifiants de blocs ajax à recharger.
* - ajaxreload_params (array) : paramètres à transmettre aux blocs rechargés.
* @return array
* Tableau de retours des traitements
* id_album, ids_documents, message_ok, message_erreur
*/
function formulaires_ajouter_album_traiter_dist($objet = '', $id_objet = 0, $redirection = '', $lier_trad = 0, $options = []) {
$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 = (int) $retours_editer_album['id_album'];
$url_album = generer_url_ecrire('album', 'id_album=' . $id_album);
$retours['id_album'] = $id_album;
$retours['message_ok'] = _T('album:message_id_album_ajoute', ['url' => $url_album,'id_album' => $id_album]);
$ok_album = true;
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'];
}
}
break;
// Associer des albums existants.
case 'choisir':
$ids_albums = explode(',', _request('ids_albums_associer')) ?: [];
$associer_album = charger_fonction('associer_album', 'action');
$nb = 0;
foreach ($ids_albums as $id_album) {
$ok = $associer_album("$id_album/$objet/$id_objet");
$nb = $nb + ($ok ? 1 : 0);
}
if ($nb > 0) {
$ok_docs = $ok_album = true;
$retours['message_ok'] = singulier_ou_pluriel($nb, 'album:message_1_album_ajoute', 'album:message_nb_albums_ajoutes');
} else {
$erreurs[] = label_ponctuer(_T('erreur')) . ' ' . _T('album:info_aucun_album_ajoute');
}
break;
}
// Messages d'erreurs
if ($erreurs) {
$retours['message_erreur'] = implode('<br>', $erreurs);
}
// Rechargement ajax
$ajaxreload = $options['ajaxreload'] ?? [];
$ajaxreload = (is_array($ajaxreload) ? $ajaxreload : [$ajaxreload]);
$ajaxparams = $options['ajaxreload_params'] ?? [];
if (!$erreurs and $ajaxreload) {
$message_ok = $retours['message_ok'] ?? '';
$retours['message_ok'] = $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, '');
}
}
return $retours;
}
/**
* Fonction privée retournant le js pour recharger les blocs adéquats
*
* @param array $ajaxblocs identifiants de blocs ajax à recharger
* @param array $ids identifiants des albums ajoutés
* @return string message js
*/
function js_ajouter_albums(array $ajaxblocs, array $params = [], array $ids = []): string {
// S'il y a des ids, on ajoute un callback qui lance leur animation
if ($ids) {
$divs = [];
foreach ($ids as $id) {
$divs[] = "#album${id}";
}
$divs = implode(',', $divs);
$callback = "function(){ jQuery('${divs}').animateAppend(); }";
$params['callback'] = $callback;
}
$params = json_encode($params, JSON_THROW_ON_ERROR);
// Go
$js_ajaxreload = '';
foreach ($ajaxblocs as $ajaxbloc) {
$js_ajaxreload .= "ajaxReload('$ajaxbloc',$params);";
}
$js = "<script type=\"text/javascript\">if (window.jQuery) jQuery(function(){ $js_ajaxreload });</script>";
return $js;
}