93cf57f1f6c34e814820361a3d85a3c78cdbb145
[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                 $morceau["licence"]["id"],
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"),
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         }
394         else{
395           if(!($morceau["titre"] = trim($_POST["titre"]))){
396             $env->message("merci de pr&eacute;ciser un titre pour le morceau");
397           }
398           $morceau["licence"] = array(
399             "id" => $_POST["licence"]
400           );
401           $source_infos["date_creation"] = $_POST["annee_date_creation"]."-".$_POST["mois_date_creation"]."-".$_POST["jour_date_creation"];
402           $source_infos["description"] = $_POST["description"];
403           $morceau["description"] = $source_infos["description"];
404           foreach($_POST as $post_key => $post_value){
405             if(substr($post_key, 0, 13) == "document_nom_"){
406               if($id_document = substr($post_key, 13)){
407                 $morceau["documents"][$id_document] = array(
408                   "nom" => $_POST["document_nom_".$id_document],
409                   "url" => $_POST["document_url_".$id_document]
410                 );
411               }
412             }
413           }
414         }
415         if(!$env->messages()){
416           if(isset($_POST["del_image"])){
417             if($morceau["image"]){
418               if(!@unlink($env->path("content")."uploads/".$morceau["image"])){
419                 $env->erreur("Impossible d'effacer l'image du morceau");
420                 return;
421               }
422             }
423             $morceau["image"] = "";
424           }
425           else{
426             if(($up_image = $data->upload("image", $upload_dir)) === false){
427               $env->erreur("Impossible d'uploader l'image");
428               return;
429             }
430             if($up_image) $morceau["image"] = $this->user["id"]."/".$up_image;
431           }
432           if($morceau["image"]) $source_infos["image"] = $morceau["image"];
433           if(
434             (
435               $data->set_source(
436                 $morceau["id"],
437                 $morceau["groupes"],
438                 $morceau["titre"],
439                 $this->morceau_status_id,
440                 $morceau["licence"]["id"],
441                 $morceau["documents"],
442                 $morceau["reference"],
443                 $morceau["derivations"],
444                 $source_infos
445               )
446             ) === false
447           ){
448             $env->erreur("Impossible de modifier le morceau");
449             return;
450           }
451           if(!$data->del_source_compositions(array("id_source" => $morceau["id"]))){
452             $env->erreur("Le morceau a été modifié mais impossible de l'associer à cet album");
453             return;
454           }
455           if($_POST["album"]){
456             if(!$data->set_source_composition($morceau["id"], $_POST["album"])){
457               $env->erreur("Le morceau a été modifié mais impossible de l'associer à cet album");
458               return;
459             }
460           }
461           $env->redirect(
462             $env->url("users/morceaux/edit", array("id" => $morceau["id"])),
463             "le morceau a &eacute;t&eacute; modifi&eacute;"
464           );
465         }
466       }
467       $env->set_out("groupes", $groupes);
468       $env->set_out("sources_access", $sources_access);
469       $env->set_out("licences", $licences);
470       $env->set_out("albums", $albums);
471       $env->set_out("morceau", $morceau);
472     }
473
474     function maj_xml(){
475       $env = $this->env();
476       $data = $env->data();
477       if(!($morceau = $data->source($_GET[$env->param("id")], true))){
478         $env->erreur("Impossible de lire les informations du morceau");
479         return;
480       }
481       $morceau["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
482       if(!$morceau["permissions"]["editeur"]){
483         $env->erreur("vous n'avez pas la permission d'editer ce morceau");
484         return;
485       }
486       if
487       (    !isset($_GET[$env->param("id")])
488         || !isset($_GET[$env->param("xml")])
489         || ($_GET[$env->param("xml")] == "derviation" && !isset($_GET[$env->param("derivation")]))
490       ){
491         $env->erreur("parametre de fichier xml manquant");
492         return;
493       }
494       $xml_url = "";
495       if($_GET[$env->param("xml")] == "derivation"){
496         if(isset($morceau["derivations"][$_GET[$env->param("derivation")]]["xml"]["url"]))
497         $xml_url = $morceau["derivations"][$_GET[$env->param("derivation")]]["xml"]["url"];
498       }
499       elseif($_GET[$env->param("xml")] == "reference"){
500         if(isset($morceau["reference"]["xml"]["url"]))
501         $xml_url = $morceau["reference"]["xml"]["url"];
502       }
503       if(!$xml_url){
504         $env->message("Pas d'URL pour ce fichier XML. Impossible de recharger les informations");
505         return;
506       }
507       if(!$env->messages()){
508         if(($res = $data->maj_source_cache($xml_url)) === false){
509           $env->erreur("Impossible de mettre à jour le contenu du fichier XML dans le cache");
510           return;
511         }
512         if($res === true){
513           if($morceau = $data->source($morceau["id"])){
514             $env->redirect(
515               $env->url("users/morceaux/edit", array("id" => $morceau["id"])),
516               "Les informations du fichier XML ont été mises à jour",
517               2
518             );
519           }
520           else{
521             $env->erreur(
522              "le contenu du fichier XML a &eacute;t&eacute; mis &agrave; jour"
523             .", mais impossible de lire les informations du morceau"
524             );
525           }
526           return;
527         }
528         switch($res){
529           case -1: $env->message("Impossible de lire le contenu du fichier XML"); break;
530           case -2: $env->message("Le fichier XML indiqu&eacute; ne contient pas un fichier de source valide"); break;
531           default: $env->erreur("Erreur inconnue (?)"); return;
532         }
533       }
534       $env->run("users/morceaux/edit", array("get" => array("id" => $morceau["id"])));
535     }
536
537     function del(){
538       $env = $this->env();
539       $data = $env->data();
540       if(!($morceau = $data->source($_GET[$env->param("id")], true))){
541         $env->erreur("Impossible de lire les informations du morceau");
542         return;
543       }
544       $morceau["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
545       if(!$morceau["permissions"]["admin"]){
546         $env->erreur("vous n'avez pas la permission d'effacer ce morceau");
547         return;
548       }
549       if(!$data->del_source($morceau["id"])){
550         $env->erreur("Impossible de supprimer le morceau");
551         return;
552       }
553       $env->redirect(
554         $env->url("users/morceaux"),
555         "le morceau a été supprimé"
556       );
557     }
558
559     function groupes(){
560       $env = $this->env();
561       if(
562             !($sources_invitations_controller = $env->get_controller("users/sources_invitations"))
563         ||  !$sources_invitations_controller->validate()
564       ){
565         $env->erreur("impossible de valider le controleur users/sources_invitations");
566         return;
567       }
568       $sources_invitations_controller->source_groupes();
569     }
570
571   }
572
573 ?>