retour sur edit apres add pour l'ajout des sources
[mw_sourceml] / app / controllers / users / morceaux.php
1 <?php
2
3   class mw_users_morceaux extends mw_controller{
4
5     var $user;
6
7     var $status;
8     var $album_status_id;
9     var $morceau_status_id;
10
11     function validate(){
12       $env = $this->env();
13       $data = $env->data();
14       if(($this->status = $data->source_status()) === false){
15         return "Impossible de lire la liste des status de source";
16       }
17       foreach($this->status as $id_source_status => $source_status){
18         if($source_status["nom"] == "album") $this->album_status_id = $id_source_status;
19         if($source_status["nom"] == "morceau") $this->morceau_status_id = $id_source_status;
20         if(isset($this->album_status_id) && isset($this->morceau_status_id)) break;
21       }
22       if(!isset($this->album_status_id) || !isset($this->morceau_status_id)){
23         if(!isset($this->album_status_id)) return "Type de source inconnu: album";
24         return "Type de source inconnu: morceau";
25       }
26       if(!($this->user = $env->user())){
27         return "Vous devez être identifié pour accéder à cette page";
28       }
29       return true;
30     }
31
32     function index(){
33       $env = $this->env();
34       $data = $env->data();
35       if(($groupes = $data->groupes($this->user["id"])) === false){
36         $env->erreur("Impossible de lire la liste des groupes");
37         return;
38       }
39       $albums_groupes = $groupes["list"];
40       $id_groupe = false;
41       if(isset($_GET[$env->param("groupe")])){
42         $id_groupe = $_GET[$env->param("groupe")];
43         if(!isset($groupes["list"][$id_groupe])){
44           $env->erreur("Impossible de lire les informations du groupe");
45           return;
46         }
47       }
48       if($id_groupe){
49         $albums_groupes = array($id_groupe => $groupes["list"][$id_groupe]);
50       }
51       if(
52         (
53           $albums = $data->groupes_sources(
54             array(
55               "groupes" => $albums_groupes,
56               "id_class" => $this->album_status_id,
57               // on veut les albums pour lesquels au moins un groupe (et pas tous) ...
58               "satisfy_all_groupes_access" => false,
59               // ... a le droit de contribution
60               "id_source_access" => $data->id_groupe_status_contributeur()
61             )
62           )
63         ) === false
64       ) return "impossible de lire la liste des albums";
65       if($id_album = isset($_GET[$env->param("album")]) ? $_GET[$env->param("album")] : false){
66         if(!($album = $data->source($id_album, true))){
67           $env->erreur("Impossible de lire les informations de l'album");
68           return;
69         }
70       }
71       $select = array(
72         "status" => $this->morceau_status_id,
73         "id_user" => $this->user["id"],
74         "order_by" => "ordre",
75         "start" => isset($_GET[$env->param("start")]) && $_GET[$env->param("start")] ? $_GET[$env->param("start")] : 0
76       );
77       if($id_groupe) $select["id_groupe"] = $id_groupe;
78       if($id_album !== false) $select["id_composition"] = $id_album;
79       if(($morceaux = $data->sources($select)) === false){
80         $env->erreur("impossible de lire la liste des morceaux");
81         return;
82       }
83       foreach($morceaux["list"] as $id_morceau => $morceau){
84         $morceaux["list"][$id_morceau]["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
85       }
86       if($_POST){
87         foreach($morceaux["list"] as $id_morceau => $morceau){
88           if(isset($_POST["ordre_".$id_morceau])){
89             if($data->set_source_info($morceau["id"], "ordre", $_POST["ordre_".$id_morceau]) === false){
90               $env->erreur("Impossible d'enregistrer l'ordre des morceaux");
91               return;
92             }
93           }
94         }
95         $get_params = array();
96         if($id_groupe) $get_params["groupe"] = $id_groupe;
97         if($id_album) $get_params["album"] = $id_album;
98         $env->redirect(
99           $env->url("users/morceaux", $get_params),
100           "l'ordre des morceaux a été enregistré"
101         );
102       }
103       $env->set_out("groupes", $groupes);
104       $env->set_out("albums", $albums);
105       $env->set_out("morceaux", $morceaux);
106     }
107
108     function add(){
109       $env = $this->env();
110       $data = $env->data();
111       $morceau = $data->empty_source();
112       $source_infos = array(
113         "date_inscription" => date("Y-m-d"),
114         "ordre" => 0
115       );
116       $groupe = false;
117       $album = false;
118       if(($groupes = $data->groupes($this->user["id"])) === false){
119         $env->erreur("Impossible de lire la liste des groupes");
120         return;
121       }
122       $albums = array();
123       if($groupes["total"] > 0){
124         $select = array(
125           "status" => $this->album_status_id,
126           "id_user" => $this->user["id"]
127         );
128         foreach($groupes["list"] as $id_groupe => $groupe){
129           $select["id_groupe"] = $id_groupe;
130           if(($groupes_albums = $data->sources($select)) === false){
131             $env->erreur("impossible de lire la liste des albums");
132             return;
133           }
134           $albums[$id_groupe] = $groupes_albums["list"];
135         }
136       }
137       if(($licences = $data->licences()) === false){
138         return "Impossible de lire la liste des licences";
139       }
140       if(!$data->check_user_uploads_dir()){
141         $env->erreur("Impossible de creer le repertoire utilisateur");
142         return;
143       }
144       $web_path = $env->path("web");
145       $upload_dir = $env->path("content")."uploads/".$this->user["id"];
146       $_SESSION["upload_dir"] = $web_path.($web_path ? "" : "/").$env->path("content")."uploads/".$this->user["id"];
147       $users_sources_mod = $env->get_controller("users/sources");
148       if(isset($_POST["button_derive"])){
149         if(
150               ($origin_source_id = $_POST["button_derive"])
151           &&  ($origin_source_xml_url = $data->source_xml_url($origin_source_id))
152           &&  ($origin_source_xml_content = $data->get_source_xml($origin_source_id))
153         ){
154           $morceau["derivations"][$origin_source_id] = $users_sources_mod->get_source_from_xml(
155             $env,
156             $origin_source_xml_url,
157             $origin_source_xml_content,
158             false
159           );
160         }
161       }
162       elseif($_POST){
163         if(!($groupe = $data->groupe($_POST["id_groupe"]))){
164           $env->erreur("Impossible de lire les informations du groupe");
165           return;
166         }
167         $groupe["id_groupe_status"] = $data->id_groupe_status_admin();
168         $morceau["groupes"] = array($groupe["id"] => $groupe);
169         if($_POST["album"]){
170           if(!($album = $data->source($_POST["album"], true))){
171             $env->erreur("Impossible de lire les informations de l'album");
172             return;
173           }
174           $album["permissions"] = $data->source_permissions($album, $this->user["id"]);
175           if(!$album["permissions"]["contributeur"]){
176             $env->erreur("vous n'avez pas la permission d'ajouter un morceau dans cet album");
177             return;
178           }
179           $morceau["album"] = $album["id"];
180         }
181         if(isset($_POST["is_derivation"])){
182           foreach($_POST as $key => $value){
183             if(substr($key, 0, 14) == "derivation_id_"){
184               $id_source_derivation = substr($key, 14);
185               $xml_url = trim($_POST["derivation_".$id_source_derivation]);
186               $morceau["derivations"][$id_source_derivation] = $users_sources_mod->get_source_from_xml(
187                 $env,
188                 $xml_url,
189                 (
190                   isset($_POST["use_edit_derivation_content_".$id_source_derivation]) ?
191                     $_POST["edit_derivation_content_".$id_source_derivation]
192                   : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
193                 ),
194                 isset($_POST["use_edit_derivation_content_".$id_source_derivation]) ? true : false
195               );
196             }
197           }
198         }
199         if(isset($_POST["is_reference"])){
200           $xml_url = trim($_POST["reference"]);
201           $morceau["reference"] = $users_sources_mod->get_source_from_xml(
202             $env,
203             $xml_url,
204             (
205               isset($_POST["use_edit_reference_content"]) ?
206                 $_POST["edit_reference_content"]
207               : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
208             ),
209             isset($_POST["use_edit_reference_content"]) ? true : false
210           );
211         }
212         else{
213           if(!($morceau["titre"] = trim($_POST["titre"]))){
214             $env->message("merci de pr&eacute;ciser un titre pour le morceau");
215           }
216           $morceau["licence"] = array(
217             "id" => $_POST["licence"]
218           );
219           $source_infos["date_creation"] = $_POST["annee_date_creation"]."-".$_POST["mois_date_creation"]."-".$_POST["jour_date_creation"];
220           $source_infos["description"] = $_POST["description"];
221           $morceau["description"] = $source_infos["description"];
222           $morceau["date_creation"] = $source_infos["date_creation"];
223           foreach($_POST as $post_key => $post_value){
224             if(substr($post_key, 0, 13) == "document_nom_"){
225               if($id_document = substr($post_key, 13)){
226                 $morceau["documents"][$id_document] = array(
227                   "nom" => $_POST["document_nom_".$id_document],
228                   "url" => $_POST["document_url_".$id_document]
229                 );
230               }
231             }
232           }
233         }
234         if(!$env->messages()){
235           if(($image = $data->upload("image", $upload_dir)) === false){
236             $env->erreur("erreur lors de l'envoi de l'image. le morceau n'a pas été ajouté");
237             return;
238           }
239           if($image) $source_infos["image"] = $this->user["id"]."/".$image;
240           if(
241             (
242               $id_source = $data->add_source(
243                 $morceau["groupes"],
244                 $morceau["titre"],
245                 $this->morceau_status_id,
246                 isset($morceau["licence"]["id"]) ? $morceau["licence"]["id"] : null,
247                 $morceau["documents"],
248                 $morceau["reference"],
249                 $morceau["derivations"],
250                 $source_infos
251               )
252             ) === false
253           ){
254             $env->erreur("Impossible d'ajouter le morceau");
255             return;
256           }
257           if($album){
258             if(!$data->set_source_composition($id_source, $album["id"])){
259               $env->erreur("Le morceau a été ajouté mais impossible de l'associer à l'album");
260               return;
261             }
262           }
263           $env->redirect(
264             $env->url("users/morceaux/edit", array("id" => $id_source)),
265             "le morceau a été ajouté"
266           );
267         }
268       }
269       $env->set_out("groupes", $groupes);
270       $env->set_out("albums", $albums);
271       $env->set_out("licences", $licences);
272       $env->set_out("morceau", $morceau);
273       $env->set_out("source_infos", $source_infos);
274       $env->set_out("groupe", $groupe);
275       $env->set_out("album", $album);
276     }
277
278     function edit(){
279       $env = $this->env();
280       $data = $env->data();
281       if(($groupes = $data->groupes($this->user["id"])) === false){
282         $env->erreur("Impossible de lire la liste des groupes");
283         return;
284       }
285       if(($licences = $data->licences()) === false){
286         $env->erreur("Impossible de lire la liste des licences");
287         return;
288       }
289       if(($sources_access = $data->sources_access()) === false){
290         $env->erreur("Impossible de lire les types d'access");
291         return;
292       }
293       if(!($morceau = $data->source($_GET[$env->param("id")], true))){
294         $env->erreur("Impossible de lire les informations du morceau");
295         return;
296       }
297       $morceau["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
298       if(!$morceau["permissions"]["editeur"]){
299         $env->erreur("vous n'avez pas la permission d'editer ce morceau");
300         return;
301       }
302       if(
303         (
304           $albums = $data->groupes_sources(
305             array(
306               "groupes" => $morceau["groupes"],
307               "id_class" => $this->album_status_id,
308               // on veut les albums pour lesquels chaque groupe du morceau ...
309               "satisfy_all_groupes_access" => true,
310               // ... a le droit de contribution
311               "id_source_access" => $data->id_groupe_status_contributeur()
312             )
313           )
314         ) === false
315       ) return "impossible de lire la liste des albums";
316       if(!$data->check_user_uploads_dir()){
317         $env->erreur("Impossible de creer le repertoire utilisateur");
318         return;
319       }
320       $web_path = $env->path("web");
321       $upload_dir = $env->path("content")."uploads/".$this->user["id"];
322       $_SESSION["upload_dir"] = $web_path.($web_path ? "" : "/").$env->path("content")."uploads/".$this->user["id"];
323       if(($compositions = $data->source_compositions(array("id_source" => $morceau["id"]))) === false){
324         $env->erreur("Impossible de lire la liste des compositions");
325         return;
326       }
327       if($compositions) foreach($compositions[$morceau["id"]] as $id_album) { $morceau["album"] = $id_album; break; }
328       if($_POST){
329         $source_infos = array(
330           "date_inscription" => $_POST["date_inscription"],
331           "ordre" => isset($morceau["ordre"]) ? $morceau["ordre"] : 0
332         );
333         $permissions = $morceau["permissions"];
334         $image = isset($morceau["image"]) ? $morceau["image"] : null;
335         $image_uri = isset($morceau["image_uri"]) ? $morceau["image_uri"] : null;
336         $image_uri = $morceau["image_uri"];
337         $morceau = $data->empty_source(
338           array(
339             "id" => $morceau["id"],
340             "groupes" => $morceau["groupes"],
341             "image" => isset($morceau["image"]) ? $morceau["image"] : ""
342           )
343         );
344         $morceau["permissions"] = $permissions;
345         $morceau["date_creation"] = $_POST["annee_date_creation"]."-".$_POST["mois_date_creation"]."-".$_POST["jour_date_creation"];
346         $morceau["image"] = $image;
347         $morceau["image_uri"] = $image_uri;
348         $users_sources_mod = $env->get_controller("users/sources");
349         if($_POST["album"]){
350           if($album = $data->source($_POST["album"], true)){
351             $album["permissions"] = $data->source_permissions($album, $this->user["id"]);
352             if(!$album["permissions"]["contributeur"]){
353               $env->erreur("vous n'avez pas la permission d'ajouter un morceau dans cet album");
354               return;
355             }
356           }
357           else{
358             $env->erreur("Impossible de lire les informations de l'album");
359             return;
360           }
361           $morceau["album"] = $album["id"];
362         }
363         if(isset($_POST["is_derivation"])){
364           foreach($_POST as $key => $value){
365             if(substr($key, 0, 14) == "derivation_id_"){
366               $id_source_derivation = substr($key, 14);
367               $xml_url = trim($_POST["derivation_".$id_source_derivation]);
368               $morceau["derivations"][$id_source_derivation] = $users_sources_mod->get_source_from_xml(
369                 $env,
370                 $xml_url,
371                 (
372                   isset($_POST["use_edit_derivation_content_".$id_source_derivation]) ?
373                     $_POST["edit_derivation_content_".$id_source_derivation]
374                   : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
375                 ),
376                 isset($_POST["use_edit_derivation_content_".$id_source_derivation]) ? true : false
377               );
378             }
379           }
380         }
381         if(isset($_POST["is_reference"])){
382           $xml_url = trim($_POST["reference"]);
383           $morceau["reference"] = $users_sources_mod->get_source_from_xml(
384             $env,
385             $xml_url,
386             (
387               isset($_POST["use_edit_reference_content"]) ?
388                 $_POST["edit_reference_content"]
389               : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
390             ),
391             isset($_POST["use_edit_reference_content"]) ? true : false
392           );
393           $morceau["licence"]["id"] = 0;
394         }
395         else{
396           if(!($morceau["titre"] = trim($_POST["titre"]))){
397             $env->message("merci de pr&eacute;ciser un titre pour le morceau");
398           }
399           $morceau["licence"] = array(
400             "id" => $_POST["licence"]
401           );
402           $source_infos["date_creation"] = $_POST["annee_date_creation"]."-".$_POST["mois_date_creation"]."-".$_POST["jour_date_creation"];
403           $source_infos["description"] = $_POST["description"];
404           $morceau["description"] = $source_infos["description"];
405           foreach($_POST as $post_key => $post_value){
406             if(substr($post_key, 0, 13) == "document_nom_"){
407               if($id_document = substr($post_key, 13)){
408                 $morceau["documents"][$id_document] = array(
409                   "nom" => $_POST["document_nom_".$id_document],
410                   "url" => $_POST["document_url_".$id_document]
411                 );
412               }
413             }
414           }
415         }
416         if(!$env->messages()){
417           if(isset($_POST["del_image"])){
418             if($morceau["image"]){
419               if(!@unlink($env->path("content")."uploads/".$morceau["image"])){
420                 $env->erreur("Impossible d'effacer l'image du morceau");
421                 return;
422               }
423             }
424             $morceau["image"] = "";
425           }
426           else{
427             if(($up_image = $data->upload("image", $upload_dir)) === false){
428               $env->erreur("Impossible d'uploader l'image");
429               return;
430             }
431             if($up_image) $morceau["image"] = $this->user["id"]."/".$up_image;
432           }
433           if($morceau["image"]) $source_infos["image"] = $morceau["image"];
434           if(
435             (
436               $data->set_source(
437                 $morceau["id"],
438                 $morceau["groupes"],
439                 $morceau["titre"],
440                 $this->morceau_status_id,
441                 $morceau["licence"]["id"],
442                 $morceau["documents"],
443                 $morceau["reference"],
444                 $morceau["derivations"],
445                 $source_infos
446               )
447             ) === false
448           ){
449             $env->erreur("Impossible de modifier le morceau");
450             return;
451           }
452           if(!$data->del_source_compositions(array("id_source" => $morceau["id"]))){
453             $env->erreur("Le morceau a été modifié mais impossible de l'associer à cet album");
454             return;
455           }
456           if($_POST["album"]){
457             if(!$data->set_source_composition($morceau["id"], $_POST["album"])){
458               $env->erreur("Le morceau a été modifié mais impossible de l'associer à cet album");
459               return;
460             }
461           }
462           $env->redirect(
463             $env->url("users/morceaux/edit", array("id" => $morceau["id"])),
464             "le morceau a &eacute;t&eacute; modifi&eacute;"
465           );
466         }
467       }
468       $env->set_out("groupes", $groupes);
469       $env->set_out("sources_access", $sources_access);
470       $env->set_out("licences", $licences);
471       $env->set_out("albums", $albums);
472       $env->set_out("morceau", $morceau);
473     }
474
475     function maj_xml(){
476       $env = $this->env();
477       $data = $env->data();
478       if(!($morceau = $data->source($_GET[$env->param("id")], true))){
479         $env->erreur("Impossible de lire les informations du morceau");
480         return;
481       }
482       $morceau["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
483       if(!$morceau["permissions"]["editeur"]){
484         $env->erreur("vous n'avez pas la permission d'editer ce morceau");
485         return;
486       }
487       if
488       (    !isset($_GET[$env->param("id")])
489         || !isset($_GET[$env->param("xml")])
490         || ($_GET[$env->param("xml")] == "derviation" && !isset($_GET[$env->param("derivation")]))
491       ){
492         $env->erreur("parametre de fichier xml manquant");
493         return;
494       }
495       $xml_url = "";
496       if($_GET[$env->param("xml")] == "derivation"){
497         if(isset($morceau["derivations"][$_GET[$env->param("derivation")]]["xml"]["url"]))
498         $xml_url = $morceau["derivations"][$_GET[$env->param("derivation")]]["xml"]["url"];
499       }
500       elseif($_GET[$env->param("xml")] == "reference"){
501         if(isset($morceau["reference"]["xml"]["url"]))
502         $xml_url = $morceau["reference"]["xml"]["url"];
503       }
504       if(!$xml_url){
505         $env->message("Pas d'URL pour ce fichier XML. Impossible de recharger les informations");
506         return;
507       }
508       if(!$env->messages()){
509         if(($res = $data->maj_source_cache($xml_url)) === false){
510           $env->erreur("Impossible de mettre à jour le contenu du fichier XML dans le cache");
511           return;
512         }
513         if($res === true){
514           if($morceau = $data->source($morceau["id"])){
515             $env->redirect(
516               $env->url("users/morceaux/edit", array("id" => $morceau["id"])),
517               "Les informations du fichier XML ont été mises à jour",
518               2
519             );
520           }
521           else{
522             $env->erreur(
523              "le contenu du fichier XML a &eacute;t&eacute; mis &agrave; jour"
524             .", mais impossible de lire les informations du morceau"
525             );
526           }
527           return;
528         }
529         switch($res){
530           case -1: $env->message("Impossible de lire le contenu du fichier XML"); break;
531           case -2: $env->message("Le fichier XML indiqu&eacute; ne contient pas un fichier de source valide"); break;
532           default: $env->erreur("Erreur inconnue (?)"); return;
533         }
534       }
535       $env->run("users/morceaux/edit", array("get" => array("id" => $morceau["id"])));
536     }
537
538     function del(){
539       $env = $this->env();
540       $data = $env->data();
541       if(!($morceau = $data->source($_GET[$env->param("id")], true))){
542         $env->erreur("Impossible de lire les informations du morceau");
543         return;
544       }
545       $morceau["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
546       if(!$morceau["permissions"]["admin"]){
547         $env->erreur("vous n'avez pas la permission d'effacer ce morceau");
548         return;
549       }
550       if(!$data->del_source($morceau["id"])){
551         $env->erreur("Impossible de supprimer le morceau");
552         return;
553       }
554       $env->redirect(
555         $env->url("users/morceaux"),
556         "le morceau a été supprimé"
557       );
558     }
559
560     function groupes(){
561       $env = $this->env();
562       if(
563             !($sources_invitations_controller = $env->get_controller("users/sources_invitations"))
564         ||  !$sources_invitations_controller->validate()
565       ){
566         $env->erreur("impossible de valider le controleur users/sources_invitations");
567         return;
568       }
569       $sources_invitations_controller->source_groupes();
570     }
571
572   }
573
574 ?>