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