fce394f212f11e407c667b033f49e686f816d54c
[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             true
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           foreach($_POST as $post_key => $post_value){
222             if(substr($post_key, 0, 13) == "document_nom_"){
223               if($id_document = substr($post_key, 13)){
224                 $morceau["documents"][$id_document] = array(
225                   "nom" => $_POST["document_nom_".$id_document],
226                   "url" => $_POST["document_url_".$id_document]
227                 );
228               }
229             }
230           }
231         }
232         if(!$env->messages()){
233           if(($image = $data->upload("image", $upload_dir)) === false){
234             $env->erreur("erreur lors de l'envoi de l'image. le morceau n'a pas été ajouté");
235             return;
236           }
237           if($image) $source_infos["image"] = $this->user["id"]."/".$image;
238           if(
239             (
240               $id_source = $data->add_source(
241                 $morceau["groupes"],
242                 $morceau["titre"],
243                 $this->morceau_status_id,
244                 $morceau["licence"]["id"],
245                 $morceau["documents"],
246                 $morceau["reference"],
247                 $morceau["derivations"],
248                 $source_infos
249               )
250             ) === false
251           ){
252             $env->erreur("Impossible d'ajouter le morceau");
253             return;
254           }
255           if($album){
256             if(!$data->set_source_composition($id_source, $album["id"])){
257               $env->erreur("Le morceau a été ajouté mais impossible de l'associer à l'album");
258               return;
259             }
260           }
261           $env->redirect(
262             $env->url("users/morceaux"),
263             "le morceau a été ajouté"
264           );
265         }
266       }
267       $env->set_out("groupes", $groupes);
268       $env->set_out("albums", $albums);
269       $env->set_out("licences", $licences);
270       $env->set_out("morceau", $morceau);
271       $env->set_out("source_infos", $source_infos);
272       $env->set_out("groupe", $groupe);
273       $env->set_out("album", $album);
274     }
275
276     function edit(){
277       $env = $this->env();
278       $data = $env->data();
279       if(($groupes = $data->groupes($this->user["id"])) === false){
280         $env->erreur("Impossible de lire la liste des groupes");
281         return;
282       }
283       if(($licences = $data->licences()) === false){
284         $env->erreur("Impossible de lire la liste des licences");
285         return;
286       }
287       if(($sources_access = $data->sources_access()) === false){
288         $env->erreur("Impossible de lire les types d'access");
289         return;
290       }
291       if(!($morceau = $data->source($_GET[$env->param("id")], true))){
292         $env->erreur("Impossible de lire les informations du morceau");
293         return;
294       }
295       $morceau["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
296       if(!$morceau["permissions"]["editeur"]){
297         $env->erreur("vous n'avez pas la permission d'editer ce morceau");
298         return;
299       }
300       if(
301         (
302           $albums = $data->groupes_sources(
303             array(
304               "groupes" => $morceau["groupes"],
305               "id_class" => $this->album_status_id,
306               // on veut les albums pour lesquels chaque groupe du morceau ...
307               "satisfy_all_groupes_access" => true,
308               // ... a le droit de contribution
309               "id_source_access" => $data->id_groupe_status_contributeur()
310             )
311           )
312         ) === false
313       ) return "impossible de lire la liste des albums";
314       if(!$data->check_user_uploads_dir()){
315         $env->erreur("Impossible de creer le repertoire utilisateur");
316         return;
317       }
318       $web_path = $env->path("web");
319       $upload_dir = $env->path("content")."uploads/".$this->user["id"];
320       $_SESSION["upload_dir"] = $web_path.($web_path ? "" : "/").$env->path("content")."uploads/".$this->user["id"];
321       if(($compositions = $data->source_compositions(array("id_source" => $morceau["id"]))) === false){
322         $env->erreur("Impossible de lire la liste des compositions");
323         return;
324       }
325       if($compositions) foreach($compositions[$morceau["id"]] as $id_album) { $morceau["album"] = $id_album; break; }
326       if($_POST){
327         $source_infos = array(
328           "date_inscription" => $_POST["date_inscription"],
329           "ordre" => isset($morceau["ordre"]) ? $morceau["ordre"] : 0
330         );
331         $morceau = $data->empty_source(
332           array(
333             "id" => $morceau["id"],
334             "groupes" => $morceau["groupes"],
335             "image" => isset($morceau["image"]) ? $morceau["image"] : ""
336           )
337         );
338         $users_sources_mod = $env->get_controller("users/sources");
339         if($_POST["album"]){
340           if($album = $data->source($_POST["album"], true)){
341             $album["permissions"] = $data->source_permissions($album, $this->user["id"]);
342             if(!$album["permissions"]["contributeur"]){
343               $env->erreur("vous n'avez pas la permission d'ajouter un morceau dans cet album");
344               return;
345             }
346           }
347           else{
348             $env->erreur("Impossible de lire les informations de l'album");
349             return;
350           }
351           $morceau["album"] = $album["id"];
352         }
353         if(isset($_POST["is_derivation"])){
354           foreach($_POST as $key => $value){
355             if(substr($key, 0, 14) == "derivation_id_"){
356               $id_source_derivation = substr($key, 14);
357               $xml_url = trim($_POST["derivation_".$id_source_derivation]);
358               $morceau["derivations"][$id_source_derivation] = $users_sources_mod->get_source_from_xml(
359                 $env,
360                 $xml_url,
361                 (
362                   isset($_POST["use_edit_derivation_content_".$id_source_derivation]) ?
363                     $_POST["edit_derivation_content_".$id_source_derivation]
364                   : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
365                 ),
366                 isset($_POST["use_edit_derivation_content_".$id_source_derivation]) ? true : false
367               );
368             }
369           }
370         }
371         if(isset($_POST["is_reference"])){
372           $xml_url = trim($_POST["reference"]);
373           $morceau["reference"] = $users_sources_mod->get_source_from_xml(
374             $env,
375             $xml_url,
376             (
377               isset($_POST["use_edit_reference_content"]) ?
378                 $_POST["edit_reference_content"]
379               : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
380             ),
381             isset($_POST["use_edit_reference_content"]) ? true : false
382           );
383         }
384         else{
385           if(!($morceau["titre"] = trim($_POST["titre"]))){
386             $env->message("merci de pr&eacute;ciser un titre pour le morceau");
387           }
388           $morceau["licence"] = array(
389             "id" => $_POST["licence"]
390           );
391           $source_infos["date_creation"] = $_POST["annee_date_creation"]."-".$_POST["mois_date_creation"]."-".$_POST["jour_date_creation"];
392           $source_infos["description"] = $_POST["description"];
393           foreach($_POST as $post_key => $post_value){
394             if(substr($post_key, 0, 13) == "document_nom_"){
395               if($id_document = substr($post_key, 13)){
396                 $morceau["documents"][$id_document] = array(
397                   "nom" => $_POST["document_nom_".$id_document],
398                   "url" => $_POST["document_url_".$id_document]
399                 );
400               }
401             }
402           }
403         }
404         if(!$env->messages()){
405           if(isset($_POST["del_image"])){
406             if($morceau["image"]){
407               if(!@unlink($env->path("content")."uploads/".$morceau["image"])){
408                 $env->erreur("Impossible d'effacer l'image du morceau");
409                 return;
410               }
411             }
412             $morceau["image"] = "";
413           }
414           else{
415             if(($up_image = $data->upload("image", $upload_dir)) === false){
416               $env->erreur("Impossible d'uploader l'image");
417               return;
418             }
419             if($up_image) $morceau["image"] = $this->user["id"]."/".$up_image;
420           }
421           if($morceau["image"]) $source_infos["image"] = $morceau["image"];
422           if(
423             (
424               $data->set_source(
425                 $morceau["id"],
426                 $morceau["groupes"],
427                 $morceau["titre"],
428                 $this->morceau_status_id,
429                 $morceau["licence"]["id"],
430                 $morceau["documents"],
431                 $morceau["reference"],
432                 $morceau["derivations"],
433                 $source_infos
434               )
435             ) === false
436           ){
437             $env->erreur("Impossible de modifier le morceau");
438             return;
439           }
440           if(!$data->del_source_compositions(array("id_source" => $morceau["id"]))){
441             $env->erreur("Le morceau a été modifié mais impossible de l'associer à cet album");
442             return;
443           }
444           if($_POST["album"]){
445             if(!$data->set_source_composition($morceau["id"], $_POST["album"])){
446               $env->erreur("Le morceau a été modifié mais impossible de l'associer à cet album");
447               return;
448             }
449           }
450           $env->redirect(
451             $env->url("users/morceaux/edit", array("id" => $morceau["id"])),
452             "le morceau a &eacute;t&eacute; modifi&eacute;"
453           );
454         }
455       }
456       $env->set_out("groupes", $groupes);
457       $env->set_out("sources_access", $sources_access);
458       $env->set_out("licences", $licences);
459       $env->set_out("albums", $albums);
460       $env->set_out("morceau", $morceau);
461     }
462
463     function maj_xml(){
464       $data = $env->data();
465       if(!($morceau = $data->source($_GET[$env->param("id")], true))){
466         $env->erreur("Impossible de lire les informations du morceau");
467         return;
468       }
469       $morceau["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
470       if(!$morceau["permissions"]["editeur"]){
471         $env->erreur("vous n'avez pas la permission d'editer ce morceau");
472         return;
473       }
474       if
475       (    isset($_GET[$env->param("id")])
476         && isset($_GET[$env->param("xml")])
477         && ($_GET[$env->param("xml")] == "derviation" ? isset($_GET[$env->param("derivation")]) : true)
478       ){
479         $env->erreur("parametre de fichier xml manquant");
480         return;
481       }
482       $xml_url = "";
483       if($_GET[$env->param("xml")] == "derivation"){
484         if(isset($morceau["derivations"][$_GET[$env->param("derivation")]]["xml"]["url"]))
485         $xml_url = $morceau["derivations"][$_GET[$env->param("derivation")]]["xml"]["url"];
486       }
487       elseif($_GET[$env->param("xml")] == "reference"){
488         if(isset($morceau["reference"]["xml"]["url"]))
489         $xml_url = $morceau["reference"]["xml"]["url"];
490       }
491       if(!$xml_url){
492         $env->message("Pas d'URL pour ce fichier XML. Impossible de recharger les informations");
493         return;
494       }
495       if(!$env->messages()){
496         if(($res = $data->maj_source_cache($xml_url)) === false){
497           $env->erreur("Impossible de mettre à jour le contenu du fichier XML dans le cache");
498           return;
499         }
500         if($res === true){
501           if($morceau = $data->source($morceau["id"])){
502             $env->redirect(
503               $env->url("users/morceaux/edit", array("id" => $morceau["id"])),
504               "Les informations du fichier XML ont été mises à jour",
505               2
506             );
507           }
508           else{
509             $env->erreur(
510              "le contenu du fichier XML a &eacute;t&eacute; mis &agrave; jour"
511             .", mais impossible de lire les informations du morceau"
512             );
513           }
514           return;
515         }
516         switch($res){
517           case -1: $env->message("Impossible de lire le contenu du fichier XML"); break;
518           case -2: $env->message("Le fichier XML indiqu&eacute; ne contient pas un fichier de source valide"); break;
519           default: $env->erreur("Erreur inconnue (?)"); return;
520         }
521       }
522       $env->run("users/morceaux/edit", array("get" => array("id" => $morceau["id"])));
523     }
524
525     function del(){
526       $env = $this->env();
527       $data = $env->data();
528       if(!($morceau = $data->source($_GET[$env->param("id")], true))){
529         $env->erreur("Impossible de lire les informations du morceau");
530         return;
531       }
532       $morceau["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
533       if(!$morceau["permissions"]["admin"]){
534         $env->erreur("vous n'avez pas la permission d'effacer ce morceau");
535         return;
536       }
537       if(!$data->del_source($morceau["id"])){
538         $env->erreur("Impossible de supprimer le morceau");
539         return;
540       }
541       $env->redirect(
542         $env->url("users/morceaux"),
543         "le morceau a été supprimé"
544       );
545     }
546
547     function groupes(){
548       $env = $this->env();
549       if(
550             !($sources_invitations_controller = $env->get_controller("users/sources_invitations"))
551         ||  !$sources_invitations_controller->validate()
552       ){
553         $env->erreur("impossible de valider le controleur users/sources_invitations");
554         return;
555       }
556       $sources_invitations_controller->source_groupes();
557     }
558
559   }
560
561 ?>