source: spip-zone/_plugins_/albums/trunk/albums_pipelines.php @ 87050

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

Sur la fiche d'un album, afficher plus de document à la fois (pagination).

File size: 17.4 KB
Line 
1<?php
2/**
3 * Utilisations de pipelines par le plugin Albums
4 *
5 * @plugin     Albums
6 * @copyright  2014
7 * @author     Tetue, Charles Razack
8 * @licence    GNU/GPL
9 * @package    SPIP\Albums\Pipelines
10 */
11
12// Sécurité
13if (!defined('_ECRIRE_INC_VERSION')) return;
14
15
16/**
17 * Ajout de contenu aux fiches des objets.
18 *
19 * - Albums liés aux objets activés dans la configuration du plugin
20 * - Documents liés aux albums en cas d'absence du portfolio (cf. note)
21 *
22 * @note
23 * Les portfolios ne sont affichés que pour les objets qu'on a le droit d'éditer (cf. `autoriser_joindredocument_dist`).
24 * Mais pour les albums, les documents doivent être visibles dans tous les cas.
25 * Si nécessaire, on affiche donc les documents via notre squelette maison.
26 *
27 * @uses marquer_doublons_album()
28 * @pipeline afficher_complement_objet
29 *
30 * @param  array $flux Données du pipeline
31 * @return array       Données du pipeline
32 */
33function albums_afficher_complement_objet($flux) {
34
35        $texte = "";
36        $e     = trouver_objet_exec($flux['args']['type']);
37        $id    = intval($flux['args']['id']);
38
39        // Fiches des objets activés : albums liés
40        if (
41                $e !== false // page d'un objet éditorial
42                AND $e['edition'] === false // pas en mode édition
43                AND $type = $e['type']
44                AND autoriser('ajouteralbum',$type,$id)
45        ) {
46                // on vérifie d'abord que les albums vus sont bien liés
47                $table_objet_sql = table_objet_sql($type);
48                $table_objet     = table_objet($type);
49                $id_table_objet  = id_table_objet($type);
50                $champs          = sql_fetsel('*',$table_objet_sql,addslashes($id_table_objet)."=".intval($id));
51                $marquer_doublons_album = charger_fonction('marquer_doublons_album','inc');
52                $marquer_doublons_album($champs,$id,$type,$id_table_objet,$table_objet,$table_objet_sql);
53                // puis on récupère le squelette
54                $texte .= recuperer_fond('prive/squelettes/contenu/portfolio_albums', array(
55                        'objet' => $type,
56                        'id_objet' => $id,
57                        ),
58                        array('ajax'=>'albums')
59                );
60        }
61
62        // Fiches des albums : documents liés quand les documents «classiques» ne sont pas affichés
63        if (
64                $e !== false // page d'un objet éditorial
65                AND $e['edition'] === false // pas en mode édition
66                AND ($type=$e['type']) == 'album'
67                AND !autoriser('joindredocument',$type,$id)
68        ) {
69                $texte .= recuperer_fond('prive/squelettes/inclure/documents_album', array('id_album' => $id, 'pagination_documents'=>30));
70        }
71
72        if ($texte) {
73                if ($p=strpos($flux['data'],"<!--afficher_complement_objet-->"))
74                        $flux['data'] = substr_replace($flux['data'],$texte,$p,0);
75                else
76                        $flux['data'] .= $texte;
77        }
78
79        return $flux;
80}
81
82
83/**
84 * Ajout de contenu sur certaines pages.
85 *
86 * - Auteurs sur la fiche d'un album
87 * - Message sur la fiche d'un album si auteur pas autorisé à modifier (cf. autorisation)
88 *
89 * @pipeline affiche_milieu
90 *
91 * @param  array $flux Données du pipeline
92 * @return array       Données du pipeline
93 */
94function albums_affiche_milieu($flux){
95
96        $texte = "";
97        $e     = trouver_objet_exec($flux['args']['exec']);
98
99        // Fiches des albums
100        if (
101                $e !== false // page d'un objet éditorial
102                AND $e['edition'] === false // pas en mode édition
103                AND $e['type'] == 'album'
104                AND $id_objet=$flux['args'][$e['id_table_objet']]
105        ) {
106                // liste des auteurs liés
107                $texte .= recuperer_fond('prive/objets/editer/liens', array(
108                        'table_source' => 'auteurs',
109                        'objet' => 'album',
110                        'id_objet' => $id_objet
111                ));
112                // message si l'auteur de l'album n'est pas autorisé à le modifier
113                // c'est que l'album est lié à un objet qu'il ne peut pas modifier
114                include_spip('action/editer_liens');
115                $auteurs_album = array();
116                if (is_array($liens_auteurs = objet_trouver_liens(array('auteur'=>'*'),array('album'=>$id_objet))))
117                        foreach($liens_auteurs as $l)
118                                $auteurs_album[] = $l['id_auteur'];
119                $id_auteur = $GLOBALS['visiteur_session']['id_auteur'];
120                if (in_array($id_auteur,$auteurs_album) AND !autoriser(modifier,album,$id_objet)) {
121                        $texte .= recuperer_fond('prive/squelettes/inclure/message_album_non_editable');
122                }
123        }
124
125        if ($texte) {
126                if ($p=strpos($flux['data'],"<!--affiche_milieu-->"))
127                        $flux['data'] = substr_replace($flux['data'],$texte,$p,0);
128                else
129                        $flux['data'] .= $texte;
130        }
131
132        return $flux;
133}
134
135
136/**
137 * Modifier ou ajouter du contenu dans la colonne de gauche.
138 *
139 * - Gestion des albums sur le formulaire d'édition d'un objet
140 * lorsqu'on peut lui ajouter des albums mais que l'ajout de documents est désactivé.
141 *
142 * @note
143 * Lors d'une première création de l'objet, celui-ci n'ayant pas
144 * encore d'identifiant tant que le formulaire d'edition n'est pas enregistré,
145 * les liaisions entre les albums liés et l'objet à créer sauvegardent
146 * un identifiant d'objet négatif de la valeur de id_auteur (l'auteur
147 * connecté). Ces liaisons seront corrigées apres validation dans albums_post_insertion()
148 * cf. plugin Médias.
149 *
150 * @pipeline affiche_gauche
151 *
152 * @param  array $flux Données du pipeline
153 * @return array       Données du pipeline
154 */
155function albums_affiche_gauche($flux){
156
157        $texte = "";
158        $e = trouver_objet_exec($flux['args']['exec']);
159
160        // Edition des objets activés : gestion des albums
161        if (
162                $e !== false // page d'un objet éditorial
163                AND $e['edition'] !== false // mode édition uniquement
164                AND $type = $e['type']
165                AND $id_table_objet = $e['id_table_objet']
166                AND (
167                        (isset($flux['args'][$id_table_objet]) AND $id = intval($flux['args'][$id_table_objet]))
168                        // id non défini pour les nouveaux objets : on met un identifiant negatif
169                        OR ($id = 0-$GLOBALS['visiteur_session']['id_auteur'])
170                )
171                AND autoriser('ajouteralbum',$type,$id)
172                AND !autoriser('joindredocument',$type,$id)
173        ){
174                $texte .= recuperer_fond('prive/objets/editer/colonne_document',array('objet'=>$type,'id_objet'=>$id));
175        }
176
177        if ($texte) {
178                $flux['data'] .= $texte;
179        }
180
181        return $flux;
182}
183
184
185/**
186 * Actions effectuées après l'insertion d'un nouvel objet en base.
187 *
188 * - Mise à jour les liens temporaires avec les albums.
189 *
190 * @note
191 * Lors d'une première création de l'objet, celui-ci n'ayant pas
192 * encore d'identifiant tant que le formulaire d'edition n'est pas enregistré,
193 * les liaisions entre les albums liés et l'objet à créer sauvegardent
194 * un identifiant d'objet négatif de la valeur de id_auteur (l'auteur
195 * connecté).
196 * Une fois l'objet inséré en base, il faut rétablir ces liaisons
197 * avec le vrai identifiant de l'objet.
198 * cf. plugin Médias.
199 *
200 * @pipeline post_insertion
201 *
202 * @param  array $flux Données du pipeline
203 * @return array       Données du pipeline
204**/
205function albums_post_insertion($flux){
206
207        $objet    = objet_type($flux['args']['table']);
208        $id_objet = $flux['args']['id_objet'];
209        include_spip('inc/autoriser');
210
211        if (
212                autoriser('ajouteralbum', $objet, $id_objet)
213                AND $id_auteur = intval($GLOBALS['visiteur_session']['id_auteur'])
214        ){
215                $id_temporaire = 0-$id_auteur;
216                include_spip('action/editer_liens');
217                $liens = objet_trouver_liens(array('album'=>'*'),array($objet=>$id_temporaire));
218                foreach($liens as $lien){
219                        objet_associer(array('album'=>$lien['id_album']),array($objet=>$id_objet));
220                }
221                // un simple delete pour supprimer les liens temporaires
222                sql_delete("spip_albums_liens", array("id_objet=".$id_temporaire,"objet=".sql_quote($objet)));
223        }
224
225        return $flux;
226}
227
228
229/**
230 * Actions effectuées après l'édition d'un objet.
231 *
232 * - Mise à jour des liens avec les albums.
233 *
234 * @note
235 * cf. pipeline du plugin Médias
236 *
237 * @uses marquer_doublons_album()
238 * @pipeline post_edition
239 *
240 * @param  array $flux Données du pipeline
241 * @return array       Données du pipeline
242 */
243function albums_post_edition($flux){
244
245        $table_objet_sql = $flux['args']['table'];
246        $serveur         = (isset($flux['args']['serveur']) ? $flux['args']['serveur'] : '');
247        $type            = isset($flux['args']['type']) ? $flux['args']['type'] : objet_type($table_objet_sql);
248        $id_objet        = $flux['args']['id_objet'];
249        $id_table_objet  = id_table_objet($type, $serveur);
250        $table_objet     = isset($flux['args']['table_objet']) ? $flux['args']['table_objet'] : table_objet($table_objet_sql,$serveur);
251
252        // si on édite un objet, mettre ses albums liés à jour
253        if ($table_objet_sql !== 'spip_albums'){
254                include_spip('inc/autoriser');
255                if (autoriser('autoassocieralbum',$type,$id_objet)){
256                        $marquer_doublons_album = charger_fonction('marquer_doublons_album','inc');
257                        $marquer_doublons_album($flux['data'],$id_objet,$type,$id_table_objet,$table_objet,$table_objet_sql,'',$serveur);
258                }
259        }
260
261        return $flux;
262}
263
264
265/**
266 * Plugins Jquery UI nécessaires au plugin
267 *
268 * @pipeline jqueryui_plugins
269 *
270 * @param  array $scripts Liste des js chargés
271 * @return array          Liste complétée des js chargés
272**/
273function albums_jqueryui_plugins($plugins){
274        if (test_espace_prive()){
275                include_spip('inc/config');
276                $plugins[] = 'jquery.ui.autocomplete';
277                if (lire_config('albums/deplacer_documents'))
278                        $plugins[] = 'jquery.ui.sortable';
279        }
280        return $plugins;
281}
282
283
284/**
285 * Ajout de feuilles de style CSS sur les pages publiques
286 *
287 * @pipeline insert_head_css
288 *
289 * @param string $flux Feuilles de styles
290 * @return string      Description complétée des feuilles de styles
291 */
292function albums_insert_head_css($flux) {
293
294        if (!defined('_ALBUMS_INSERT_HEAD_CSS') OR !_ALBUMS_INSERT_HEAD_CSS){
295                include_spip("inc/config");
296                if (!function_exists('liste_plugin_actifs')) include_spip('inc/plugin');
297                $cfg = (defined('_ALBUMS_INSERT_HEAD_CSS')?_ALBUMS_INSERT_HEAD_CSS:lire_config("albums/insert_head_css",1));
298                if ($cfg){
299
300                        // feuille de style minimale de base
301                        $flux .= '<link rel="stylesheet" href="'.find_in_path('css/albums.css').'" type="text/css" />';
302
303                        // fix selon les plugins
304                        $plugins_actifs = liste_plugin_actifs();
305
306                        // compatibilité avec bootstrap
307                        if (isset($plugins_actifs['BOOTSTRAP'])) {
308                                $flux .= '<link rel="stylesheet" href="'.find_in_path('css/albums_bootstrap.css').'" type="text/css" />';
309                        }
310
311                        // compatibilité avec foundation
312                        if (isset($plugins_actifs['FOUNDATION'])) {
313                                $flux .= '<link rel="stylesheet" href="'.find_in_path('css/albums_foundation.css').'" type="text/css" />';
314                        }
315                }
316        }
317
318        return $flux;
319}
320
321
322/**
323 * Compter les albums liés à un objet
324 *
325 * @pipeline objet_compte_enfants
326 *
327 * @param  array $flux Données du pipeline
328 * @return array       Données du pipeline
329 */
330function albums_objet_compte_enfants($flux){
331
332        if ($objet = $flux['args']['objet']
333          AND $id=intval($flux['args']['id_objet'])) {
334                // juste les publiés ?
335                if (array_key_exists('statut', $flux['args']) and ($flux['args']['statut'] == 'publie')) {
336                        $flux['data']['album'] = sql_countsel('spip_albums AS D JOIN spip_albums_liens AS L ON D.id_album=L.id_album', "L.objet=".sql_quote($objet)."AND L.id_objet=".intval($id)." AND (D.statut='publie')");
337                } else {
338                        $flux['data']['album'] = sql_countsel('spip_albums AS D JOIN spip_albums_liens AS L ON D.id_album=L.id_album', "L.objet=".sql_quote($objet)."AND L.id_objet=".intval($id)." AND (D.statut='publie' OR D.statut='prepa')");
339                }
340        }
341
342        return $flux;
343}
344
345
346/**
347 * Afficher le nombre d'albums liés dans la boîte infos des rubriques
348 *
349 * @pipeline boite_infos
350 *
351 * @param  array $flux Données du pipeline
352 * @return array       Données du pipeline
353 */
354function albums_boite_infos($flux){
355
356        if ($flux['args']['type']=='rubrique'
357          AND $id_rubrique = $flux['args']['id']){
358                if ($nb = sql_countsel('spip_albums_liens',"objet='rubrique' AND id_objet=".intval($id_rubrique))){
359                        $nb = "<div>". singulier_ou_pluriel($nb, "album:info_1_album", "album:info_nb_albums") . "</div>";
360                        if ($p = strpos($flux['data'],"<!--nb_elements-->"))
361                                $flux['data'] = substr_replace($flux['data'],$nb,$p,0);
362                }
363        }
364
365        return $flux;
366}
367
368
369/**
370 * Optimiser la base de donnée en supprimant les liens orphelins
371 *
372 * On supprime :
373 * - les albums à la poubelle
374 * - les liens obsolètes
375 *
376 * @pipeline optimiser_base_disparus
377 *
378 * @param  array $flux Données du pipeline
379 * @return array       Données du pipeline
380 */
381function albums_optimiser_base_disparus($flux){
382
383        // albums à la poubelle
384        if (
385                isset($flux['args']['date']) AND $flux['args']['date']
386                AND is_array($ids_albums_poubelle=sql_allfetsel('id_album', table_objet_sql('album'), "statut='poubelle' AND maj < ".$flux['args']['date']))
387        ){
388                $ids_albums_poubelle = array_keys($ids_albums_poubelle);
389                include_spip('inc/albums');
390                supprimer_albums($ids_albums_poubelle);
391        }
392
393        // optimiser les liens morts entre documents et albums
394        include_spip('action/editer_liens');
395        $flux['data'] += objet_optimiser_liens(array('document'=>'*'),array('album'=>'*'));
396
397        return $flux;
398}
399
400
401/**
402 * Compléter ou modifier le résultat de la compilation des squelettes de certains formulaires.
403 *
404 * - Formulaire de configuration des documents :
405 *   insérer un message d'avertissement après le titre
406 *   au cas où l'ajout des documents aux albums est désactivé.
407 *
408 * @pipeline formulaire_fond
409 *
410 * @param  array $flux Données du pipeline
411 * @return array       Données du pipeline
412 */
413function albums_formulaire_fond($flux){
414
415        if (
416                $flux['args']['form'] == 'configurer_documents'
417                AND $avertissement = albums_message_cfg_documents(true)
418        ) {
419                // On cherche titre du formulaire : <h3 class="titrem">...</h3>
420                // On le capture entièrement pour le faire suivre du message
421                $cherche = "/(<h3[^>]\s*class\s?=\s?['\"]titrem.*<\/h3>)/is";
422                $remplace = "$1$avertissement";
423                $flux['data'] = preg_replace($cherche, $remplace, $flux['data']);
424        }
425
426        return $flux;
427}
428
429
430/**
431 * Fonction privée qui retourne un message d'avertissement
432 * au cas où l'ajout de documents aux albums est désactivé.
433 *
434 * @param bool $baliser true pour baliser le texte avec <p>
435 * @return string|bool  le message d'avertissement, sinon false
436 */
437function albums_message_cfg_documents($baliser=false){
438
439        $message = false;
440        $config = explode(',',$GLOBALS['meta']['documents_objets']);
441        $config = (is_array($config)) ? $config : array();
442        if (!in_array(table_objet_sql('album'),$config)) {
443                $message = _T('album:message_avertissement_cfg_documents');
444                if ($baliser) $message=inserer_attribut(wrap($message,'<p>'),'class','notice');
445        }
446
447        return $message;
448}
449
450
451/**
452 * Compléter le tableau de réponse ou effectuer des traitements supplémentaires pour certains formulaires.
453 *
454 * - Formulaire d'ajout de documents :
455 *   quand il s'agit d'un album, rechargement ajax du conteneur des documents.
456 *   On ajoute du js au message de retour.
457 *
458 * @note
459 * L'identifiant de l'album peut être négatif en cas de création
460 * cf. joindre_document.php, L.206 à 222
461 *
462 * Attention, il y a une différence dans les retours avant et après SPIP 3.0.17
463 * A partir de SPIP 3.0.17, on a les identifiants des documents ajoutés dans $flux['data']['ids]
464 * Avant, il faut les repérer à la main dans le message de retour.
465 *
466 * @pipeline formulaire_fond
467 *
468 * @param  array $flux Données du pipeline
469 * @return array       Données du pipeline
470 */
471function albums_formulaire_traiter($flux){
472
473        if (
474                $flux['args']['form'] == 'joindre_document'
475                AND !intval($flux['args']['args'][0]) // nouveau document
476                AND $flux['args']['args'][2] == 'album'
477                AND $id_album = intval($flux['args']['args'][1])
478                AND isset($flux['data']['message_ok']) // ajout = succès
479        ) {
480                // déterminer les identifiants des documents
481                // soit ils sont donnés dans $flux['data']['ids] (SPIP 3.0.17+)...
482                if (is_array($flux['data']['ids'])) {
483                        $ids_documents = $flux['data']['ids'];
484                }
485                // ...soit il faut les récupérer à la main d'après le message de retour
486                // dans le callback du script dans le message, on a les identifiants des divs #docX
487                else {
488                        $reg = "/#doc(\d*)/";
489                        preg_match_all($reg,$flux['data']['message_ok'],$matches);
490                        $ids_documents = is_array($matches[1]) ? array_unique($matches[1]) : array();
491                }
492                // en callback, animation de chaque document ajouté (#documentX_albumY)
493                if (count($ids_documents)) {
494                        foreach ($ids_documents as $id_document)
495                                $divs_documents[] = "#document${id_document}-album${id_album}";
496                        $divs_documents = implode(',',$divs_documents);
497                        $callback = "jQuery('$divs_documents').animateAppend();";
498                }
499                // rechargement du conteneur des documents de l'album
500                // id du conteneur : «#documents-albumY»
501                $js = "if (window.jQuery) jQuery(function(){ajaxReload('documents-album$id_album',{callback:function(){ $callback }});});";
502                $js = "<script type='text/javascript'>$js</script>";
503                if (isset($flux['data']['message_erreur']))
504                        $flux['data']['message_erreur'].= $js;
505                else
506                        $flux['data']['message_ok'] .= $js;
507        }
508
509        return $flux;
510}
511
512
513/**
514 * Compléter ou modifier la liste des messages des compagnons.
515 *
516 * - Page «albums» : présentation succinte des albums & explication des filtres latéraux.
517 *
518 * @pipeline compagnon_messages
519 *
520 * @param  array $flux Données du pipeline
521 * @return array       Données du pipeline
522 */
523function albums_compagnon_messages($flux) {
524
525        $exec     = $flux['args']['exec'];
526        $pipeline = $flux['args']['pipeline'];
527        $vus      = $flux['args']['deja_vus'];
528        $aides    = &$flux['data'];
529
530        switch ($pipeline) {
531
532                case 'affiche_milieu':
533                        switch ($exec) {
534
535                                case 'albums':
536                                        if (!isset($vus['albums'])) {
537                                                $aides[] = array(
538                                                        'id' => 'albums',
539                                                        'titre' => _T('album:c_albumotheque_titre_presentation'),
540                                                        'texte' => _T('album:c_albumotheque_presentation'),
541                                                        'statuts'=> array('1comite', '0minirezo', 'webmestre'),
542                                                        'target'=> '.albumotheque .entete h2',
543                                                );
544                                                $aides[] = array(
545                                                        'id' => 'albums',
546                                                        'titre' => _T('album:c_albumotheque_titre_filtres'),
547                                                        'texte' => _T('album:c_albumotheque_filtres'),
548                                                        'statuts'=> array('1comite', '0minirezo', 'webmestre'),
549                                                        'target'=> '#navigation .navigation-albums',
550                                                );
551                                        }
552                                        break;
553                        }
554                        break;
555
556        }
557
558        return $flux;
559}
560
561
562?>
Note: See TracBrowser for help on using the repository browser.