source: spip-zone/_plugins_/albums/trunk/inc/albums.php @ 88148

Last change on this file since 88148 was 88148, checked in by tcharlss@…, 4 years ago

Fonction pour "transvaser" les documents entre un album et le portfolio d'un objet (portfolio = tous les docs liés à l'objet, pas juste le groupe "porfolio". On se comprend.).
Autrement dit, ça permet de "transformer" un portfolio en album et inversement.
Pour l'instant, les boutons d'action correspondant ne sont pas intégrés dans l'interface, le temps de trouver comment faire ça proprement.
Il faut un libellé clair et pas trop long pour ces boutons (albumiser / désalbumiser ? transvaser ?...).
Quand les afficher : pour les admins, les rédacteurs ?
Que de questions.

File size: 7.7 KB
Line 
1<?php
2/**
3 * Fonctions du plugin Albums
4 *
5 * @plugin     Albums
6 * @copyright  2014
7 * @author     Tetue, Charles Razack
8 * @licence    GNU/GPL
9 * @package    SPIP\Albums\Fonctions
10 */
11
12// Sécurité
13if (!defined("_ECRIRE_INC_VERSION")) return;
14
15
16/**
17 * Supprimer proprement un ou plusieurs albums
18 *
19 * - suppression des liens faisant référence à l'album dans `spip_documents_liens`
20 * - suppression des liens faisant référence à l'album dans `spip_albums_liens`
21 * - suppression de l'album
22 *
23 * @param int|string|array $id_albums
24 *     Identifiant unique ou tableau d'identifiants des albums
25 * @param bool $supprimer_docs_orphelins
26 *     true pour supprimer les documents rendus orphelins
27 */
28function supprimer_albums($ids_albums, $supprimer_docs_orphelins=false) {
29
30        if (!$ids_albums) return false;
31        if (!is_array($ids_albums)) $ids_albums = array(intval($ids_albums));
32
33        // Vider les albums de leurs documents
34        vider_albums($ids_albums,$supprimer_docs_orphelins);
35
36        // Nettoyer la table de liens
37        include_spip('action/editer_liens');
38        objet_dissocier(array('album'=>$ids_albums),'*');
39
40        // Supprimer les albums
41        $in_albums = sql_in('id_album', $ids_albums);
42        sql_delete(table_objet_sql('album'), $in_albums);
43
44        // Invalider les caches
45        include_spip('inc/invalideur');
46        suivre_invalideur("id='album/$id_album'");
47
48        return;
49}
50
51
52/**
53 * Vider un ou plusieurs albums de leurs documents.
54 *
55 * @note
56 * Impossible de retirer en une fois tous les documents d'un album
57 * via le bouton d'action `dissocier_document` du plugin Médias.
58 * Il faut lui passer en paramètre un des 3 modes pour les documents :
59 *
60 * - les images en mode image : `I/image`
61 * - les images en mode document : `I/document`
62 * - les documents en mode document : 'D/document'
63 *
64 * Cf. fonction `dissocier_document` dans `action/dissocier_document.php`.
65 *
66 * @param int|string|array $id_albums
67 *     Identifiant unique ou tableau d'identifiants des albums
68 * @param bool $supprimer_docs_orphelins
69 *     true pour supprimer les documents rendus orphelins
70 * @return array
71 *     tableau des albums vidés et ceux laissés intacts
72 *     [succes => [x,y,z]],[erreurs => [x,y,z]]
73 */
74function vider_albums($ids_albums, $supprimer_docs_orphelins=false) {
75
76        if (!$ids_albums) return false;
77        if (!is_array($ids_albums)) $ids_albums = array($ids_albums);
78        $supprimer_docs_orphelins = ($supprimer_docs_orphelins==true) ? 'suppr' : '';
79
80        include_spip('inc/autoriser');
81        include_spip('action/editer_liens');
82
83        foreach($ids_albums as $id_album) {
84                if (
85                        $id_album = intval($id_album)
86                        AND autoriser('modifier','album',$id_album)
87                        AND count(objet_trouver_liens(array('document'=>'*'),array('album'=>$id_album)))
88                ){
89                        $dissocier_document = charger_fonction('dissocier_document','action');
90                        $modes_documents = array('I/image','I/document','D/document'); // cf. @note
91                        foreach($modes_documents as $mode) {
92                                $dissocier_document("${id_album}-album-${mode}-${supprimer_docs_orphelins}");
93                                // dès que l'album est vide, on arrête
94                                if (!count(objet_trouver_liens(array('document'=>'*'),array('album'=>$id_album))))
95                                        break;
96                        }
97                        $succes[] = $id_album;
98                } else {
99                        $erreurs[] = $id_album;
100                }
101        }
102
103        return array('succes'=>$succes, 'erreurs'=>$erreurs);
104}
105
106
107/**
108 * Transvaser les documents entre un album et un objet éditorial auquel il est associé
109 *
110 * @note
111 * On ne fait que modifier des liens existants au lieu de dissocier puis réassocier
112 * les documents au moyen des fonctions de Médias (`dissocier_document` et `associer_document`)
113 *
114 * @param int|string $id_album
115 *     Identifiant de l'album
116 *     0 pour créer un nouvel album vide, dans le cas d'un remplissage
117 * @param string $objet
118 *     Type d'objet
119 * @param int $id_objet
120 *     Identifiant de l'objet
121 * @param bool $remplir
122 *     Définit le sens du transvasement (on remplit l'album ou on le vide)
123 *     true  : portfolio -> album
124 *     false : album     -> portfolio
125 * @param bool $supprimer
126 *     true : supprimer l'album dans le cas d'un vidage
127 * @return int|bool
128 *     nb de liens changés si ok,
129 *     false en cas d'erreur
130 */
131function transvaser_album($id_album, $objet, $id_objet, $remplir=true, $supprimer=false) {
132
133        include_spip('inc/autoriser');
134        include_spip('action/editer_liens');
135        include_spip('action/editer_objet');
136
137        $echec = null;
138        $nb_maj = 0;
139
140        // au besoin, on crée d'abord un album et on l'associe à l'objet
141        if (
142                !intval($id_album)
143                AND $remplir === true
144        ) {
145                $id_album = objet_inserer('album');
146                objet_associer(array('album'=>$id_album),array($objet=>$id_objet));
147        }
148
149        if (autoriser('transvaser','album',$id_album,'',array('objet'=>$objet,'id_objet'=>$id_objet))){
150
151                $objet_source = ($remplir === true) ? $objet : 'album';
152                $id_objet_source = ($remplir === true) ? $id_objet : $id_album;
153                $objet_destination = ($remplir === true) ? 'album' : $objet;
154                $id_objet_destination = ($remplir === true) ? $id_album : $id_objet;
155
156                // changer les liens existants
157                // on ne peut pas changer objet et id_objet avec objet_qualifier_liens, donc on fait ça à la main
158                if (
159                        $liens_docs = objet_trouver_liens(array('document'=>'*'),array($objet_source=>$id_objet_source))
160                        AND is_array($liens_docs)
161                ){
162                        foreach ($liens_docs as $lien){
163                                $qualif = array('objet'=>$objet_destination,'id_objet'=>$id_objet_destination);
164                                $where = 'id_document='.intval($lien['id_document']).' AND objet='.sql_quote($objet_source).' AND id_objet='.intval($id_objet_source);
165                                $res = sql_updateq('spip_documents_liens',$qualif,$where);
166                                if ($res===false)
167                                        $echec = true;
168                                else
169                                        $nb_maj++;
170                        }
171                }
172                // en cas de vidage, dissocier l'album
173                // puis éventuellement le supprimer
174                if (
175                        $remplir === false
176                        AND $echec !== false
177                ){
178                        objet_dissocier(array('album'=>$id_album),array($objet=>$id_objet));
179                        if (
180                                $supprimer === true
181                                AND autoriser('supprimer','album',$id_album)
182                        ) {
183                                supprimer_albums($id_album);
184                        }
185                }
186        } else {
187                $echec = true;
188        }
189        return ($echec?false:$nb_maj);
190}
191
192
193/**
194 * Lister les formulaire yaml des modèles «album» disponibles dans les dossiers modeles/
195 *
196 * Les premiers modèles retournés sont les modèles du plugin (album.yaml et album_liste.yaml)
197 *
198 * @staticvar array $liste_modeles_albums
199 * @return array
200 */
201function albums_lister_modeles(){
202
203        static $liste_modeles_albums = false;
204        if ($liste_modeles_albums === false) {
205                $liste_modeles_albums = array();
206
207                // d'abord, on liste les 2 modèles par défaut afin qu'ils soient en tête de liste
208                foreach(array('album.yaml','album_liste.yaml') as $modele)
209                        $pre_liste[$modele] = find_in_path($modele,'modeles/');
210                // ensuite, on liste tous les modèles
211                $liste = find_all_in_path('modeles/', "album(_.*)?\.yaml$");
212                // puis on mélange
213                $liste = array_merge($pre_liste,$liste);
214
215                if (count($liste)){
216                        include_spip('inc/yaml');
217                        foreach($liste as $fichier => $chemin)
218                                $liste_modeles_albums[$fichier] = yaml_charger_inclusions(yaml_decode_file($chemin));
219                }
220        }
221
222        return $liste_modeles_albums;
223}
224
225
226/**
227 * Charger les informations d'un formulaire yaml de modèle «album»
228 *
229 * @staticvar array $infos_modeles_album
230 * @return array
231 */
232function infos_modele_album($fichier){
233
234        static $infos_modeles_album = array();
235        if (!isset($infos_modeles_album[$fichier])) {
236                if (substr($fichier,-5) != '.yaml')
237                        $formulaire .= '.yaml';
238                if ($chemin = find_in_path($fichier,'modeles/')) {
239                        include_spip('inc/yaml');
240                        $infos_modeles_album[$fichier] = yaml_charger_inclusions(yaml_decode_file($chemin));
241                }
242        }
243
244        return $infos_modeles_album[$fichier];
245}
246
247?>
Note: See TracBrowser for help on using the repository browser.