plusieurs auteurs pour les 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       $_SESSION["upload_dir"] = $web_path.($web_path ? "" : "/").$env->path("content")."uploads/".$this->user["id"];
146       $users_sources_mod = $env->get_controller("users/sources");
147       if($_POST){
148         if(!($groupe = $data->groupe($_POST["id_groupe"]))){
149           $env->erreur("Impossible de lire les informations du groupe");
150           return;
151         }
152         $groupe["id_groupe_status"] = $data->id_groupe_status_admin();
153         $morceau["groupes"] = array($groupe["id"] => $groupe);
154         if($_POST["album"]){
155           if(!($album = $data->source($_POST["album"], true))){
156             $env->erreur("Impossible de lire les informations de l'album");
157             return;
158           }
159           $album["permissions"] = $data->source_permissions($album, $this->user["id"]);
160           if(!$album["permissions"]["contributeur"]){
161             $env->erreur("vous n'avez pas la permission d'ajouter un morceau dans cet album");
162             return;
163           }
164           $morceau["album"] = $album["id"];
165         }
166         if(isset($_POST["is_derivation"])){
167           foreach($_POST as $key => $value){
168             if(substr($key, 0, 14) == "derivation_id_"){
169               $id_source_derivation = substr($key, 14);
170               $xml_url = trim($_POST["derivation_".$id_source_derivation]);
171               $morceau["derivations"][$id_source_derivation] = $users_sources_mod->get_source_from_xml(
172                 $env,
173                 $xml_url,
174                 (
175                   $_POST["use_edit_derivation_content_".$id_source_derivation] ?
176                     $_POST["edit_derivation_content_".$id_source_derivation]
177                   : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
178                 ),
179                 $_POST["use_edit_derivation_content_".$id_source_derivation] ? true : false
180               );
181             }
182           }
183         }
184         if(isset($_POST["is_reference"])){
185           $xml_url = trim($_POST["reference"]);
186           $morceau["reference"] = $users_sources_mod->get_source_from_xml(
187             $env,
188             $xml_url,
189             (
190               $_POST["use_edit_reference_content"] ?
191                 $_POST["edit_reference_content"]
192               : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
193             ),
194             $_POST["use_edit_reference_content"] ? true : false
195           );
196         }
197         else{
198           if(!($morceau["titre"] = trim($_POST["titre"]))){
199             $env->message("merci de pr&eacute;ciser un titre pour le morceau");
200           }
201           $morceau["licence"] = array(
202             "id" => $_POST["licence"]
203           );
204           $source_infos["date_creation"] = $_POST["annee_date_creation"]."-".$_POST["mois_date_creation"]."-".$_POST["jour_date_creation"];
205           $source_infos["description"] = $_POST["description"];
206           foreach($_POST as $post_key => $post_value){
207             if(substr($post_key, 0, 13) == "document_nom_"){
208               if($id_document = substr($post_key, 13)){
209                 $morceau["documents"][$id_document] = array(
210                   "nom" => $_POST["document_nom_".$id_document],
211                   "url" => $_POST["document_url_".$id_document]
212                 );
213               }
214             }
215           }
216         }
217         if(!$env->messages()){
218           if(
219             (
220               $id_source = $data->add_source(
221                 $morceau["groupes"],
222                 $morceau["titre"],
223                 $this->morceau_status_id,
224                 $morceau["licence"]["id"],
225                 $morceau["documents"],
226                 $morceau["reference"],
227                 $morceau["derivations"],
228                 $source_infos
229               )
230             ) === false
231           ){
232             $env->erreur("Impossible d'ajouter le morceau");
233             return;
234           }
235           if($album){
236             if(!$data->set_source_composition($id_source, $album["id"])){
237               $env->erreur("Le morceau a été ajouté mais impossible de l'associer à l'album");
238               return;
239             }
240           }
241           $env->redirect(
242             $env->url("users/morceaux"),
243             "le morceau a été ajouté"
244           );
245         }
246       }
247       $env->set_out("groupes", $groupes);
248       $env->set_out("albums", $albums);
249       $env->set_out("licences", $licences);
250       $env->set_out("morceau", $morceau);
251       $env->set_out("source_infos", $source_infos);
252       $env->set_out("groupe", $groupe);
253       $env->set_out("album", $album);
254     }
255
256     function edit(){
257       $env = $this->env();
258       $data = $env->data();
259       if(($groupes = $data->groupes($this->user["id"])) === false){
260         $env->erreur("Impossible de lire la liste des groupes");
261         return;
262       }
263       if(($licences = $data->licences()) === false){
264         $env->erreur("Impossible de lire la liste des licences");
265         return;
266       }
267       if(($sources_access = $data->sources_access()) === false){
268         $env->erreur("Impossible de lire les types d'access");
269         return;
270       }
271       if(!($morceau = $data->source($_GET[$env->param("id")], true))){
272         $env->erreur("Impossible de lire les informations du morceau");
273         return;
274       }
275       $morceau["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
276       if(!$morceau["permissions"]["editeur"]){
277         $env->erreur("vous n'avez pas la permission d'editer ce morceau");
278         return;
279       }
280       if(
281         (
282           $albums = $data->groupes_sources(
283             array(
284               "groupes" => $morceau["groupes"],
285               "id_class" => $this->album_status_id,
286               // on veut les albums pour lesquels chaque groupe du morceau ...
287               "satisfy_all_groupes_access" => true,
288               // ... a le droit de contribution
289               "id_source_access" => $data->id_groupe_status_contributeur()
290             )
291           )
292         ) === false
293       ) return "impossible de lire la liste des albums";
294       if(!$data->check_user_uploads_dir()){
295         $env->erreur("Impossible de creer le repertoire utilisateur");
296         return;
297       }
298       $web_path = $env->path("web");
299       $_SESSION["upload_dir"] = $web_path.($web_path ? "" : "/").$env->path("content")."uploads/".$this->user["id"];
300       if(($compositions = $data->source_compositions(array("id_source" => $morceau["id"]))) === false){
301         $env->erreur("Impossible de lire la liste des compositions");
302         return;
303       }
304       if($compositions) foreach($compositions[$morceau["id"]] as $id_album) { $morceau["album"] = $id_album; break; }
305       if($_POST){
306         $source_infos = array(
307           "date_inscription" => $_POST["date_inscription"],
308           "ordre" => isset($morceau["ordre"]) ? $morceau["ordre"] : 0
309         );
310         $morceau = $data->empty_source(
311           array(
312             "id" => $morceau["id"],
313             "groupes" => $morceau["groupes"]
314           )
315         );
316         $users_sources_mod = $env->get_controller("users/sources");
317         if($_POST["album"]){
318           if($album = $data->source($_POST["album"], true)){
319             $album["permissions"] = $data->source_permissions($album, $this->user["id"]);
320             if(!$album["permissions"]["contributeur"]){
321               $env->erreur("vous n'avez pas la permission d'ajouter un morceau dans cet album");
322               return;
323             }
324           }
325           else{
326             $env->erreur("Impossible de lire les informations de l'album");
327             return;
328           }
329           $morceau["album"] = $album["id"];
330         }
331         if(isset($_POST["is_derivation"])){
332           foreach($_POST as $key => $value){
333             if(substr($key, 0, 14) == "derivation_id_"){
334               $id_source_derivation = substr($key, 14);
335               $xml_url = trim($_POST["derivation_".$id_source_derivation]);
336               $morceau["derivations"][$id_source_derivation] = $users_sources_mod->get_source_from_xml(
337                 $env,
338                 $xml_url,
339                 (
340                   $_POST["use_edit_derivation_content_".$id_source_derivation] ?
341                     $_POST["edit_derivation_content_".$id_source_derivation]
342                   : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
343                 ),
344                 $_POST["use_edit_derivation_content_".$id_source_derivation] ? true : false
345               );
346             }
347           }
348         }
349         if(isset($_POST["is_reference"])){
350           $xml_url = trim($_POST["reference"]);
351           $morceau["reference"] = $users_sources_mod->get_source_from_xml(
352             $env,
353             $xml_url,
354             (
355               $_POST["use_edit_reference_content"] ?
356                 $_POST["edit_reference_content"]
357               : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
358             ),
359             $_POST["use_edit_reference_content"] ? true : false
360           );
361         }
362         else{
363           if(!($morceau["titre"] = trim($_POST["titre"]))){
364             $env->message("merci de pr&eacute;ciser un titre pour le morceau");
365           }
366           $morceau["licence"] = array(
367             "id" => $_POST["licence"]
368           );
369           $source_infos["date_creation"] = $_POST["annee_date_creation"]."-".$_POST["mois_date_creation"]."-".$_POST["jour_date_creation"];
370           $source_infos["description"] = $_POST["description"];
371           foreach($_POST as $post_key => $post_value){
372             if(substr($post_key, 0, 13) == "document_nom_"){
373               if($id_document = substr($post_key, 13)){
374                 $morceau["documents"][$id_document] = array(
375                   "nom" => $_POST["document_nom_".$id_document],
376                   "url" => $_POST["document_url_".$id_document]
377                 );
378               }
379             }
380           }
381         }
382         if(!$env->messages()){
383           if(
384             (
385               $data->set_source(
386                 $morceau["id"],
387                 $morceau["groupes"],
388                 $morceau["titre"],
389                 $this->morceau_status_id,
390                 $morceau["licence"]["id"],
391                 $morceau["documents"],
392                 $morceau["reference"],
393                 $morceau["derivations"],
394                 $source_infos
395               )
396             ) === false
397           ){
398             $env->erreur("Impossible de modifier le morceau");
399             return;
400           }
401           if(!$data->del_source_compositions(array("id_source" => $morceau["id"]))){
402             $env->erreur("Le morceau a été modifié mais impossible de l'associer à cet album");
403             return;
404           }
405           if($_POST["album"]){
406             if(!$data->set_source_composition($morceau["id"], $_POST["album"])){
407               $env->erreur("Le morceau a été modifié mais impossible de l'associer à cet album");
408               return;
409             }
410           }
411           $env->redirect(
412             $env->url("users/morceaux/edit", array("id" => $morceau["id"])),
413             "le morceau a &eacute;t&eacute; modifi&eacute;"
414           );
415         }
416       }
417       $env->set_out("groupes", $groupes);
418       $env->set_out("sources_access", $sources_access);
419       $env->set_out("licences", $licences);
420       $env->set_out("albums", $albums);
421       $env->set_out("morceau", $morceau);
422     }
423
424     function maj_xml(){
425       $data = $env->data();
426       if(!($morceau = $data->source($_GET[$env->param("id")], true))){
427         $env->erreur("Impossible de lire les informations du morceau");
428         return;
429       }
430       $morceau["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
431       if(!$morceau["permissions"]["editeur"]){
432         $env->erreur("vous n'avez pas la permission d'editer ce morceau");
433         return;
434       }
435       if
436       (    isset($_GET[$env->param("id")])
437         && isset($_GET[$env->param("xml")])
438         && ($_GET[$env->param("xml")] == "derviation" ? isset($_GET[$env->param("derivation")]) : true)
439       ){
440         $env->erreur("parametre de fichier xml manquant");
441         return;
442       }
443       $xml_url = "";
444       if($_GET[$env->param("xml")] == "derivation"){
445         if(isset($morceau["derivations"][$_GET[$env->param("derivation")]]["xml"]["url"]))
446         $xml_url = $morceau["derivations"][$_GET[$env->param("derivation")]]["xml"]["url"];
447       }
448       elseif($_GET[$env->param("xml")] == "reference"){
449         if(isset($morceau["reference"]["xml"]["url"]))
450         $xml_url = $morceau["reference"]["xml"]["url"];
451       }
452       if(!$xml_url){
453         $env->message("Pas d'URL pour ce fichier XML. Impossible de recharger les informations");
454         return;
455       }
456       if(!$env->messages()){
457         if(($res = $data->maj_source_cache($xml_url)) === false){
458           $env->erreur("Impossible de mettre à jour le contenu du fichier XML dans le cache");
459           return;
460         }
461         if($res === true){
462           if($morceau = $data->source($morceau["id"])){
463             $env->redirect(
464               $env->url("users/morceaux/edit", array("id" => $morceau["id"])),
465               "Les informations du fichier XML ont été mises à jour",
466               2
467             );
468           }
469           else{
470             $env->erreur(
471              "le contenu du fichier XML a &eacute;t&eacute; mis &agrave; jour"
472             .", mais impossible de lire les informations du morceau"
473             );
474           }
475           return;
476         }
477         switch($res){
478           case -1: $env->message("Impossible de lire le contenu du fichier XML"); break;
479           case -2: $env->message("Le fichier XML indiqu&eacute; ne contient pas un fichier de source valide"); break;
480           default: $env->erreur("Erreur inconnue (?)"); return;
481         }
482       }
483       $env->run("users/morceaux/edit", array("get" => array("id" => $morceau["id"])));
484     }
485
486     function del(){
487       $env = $this->env();
488       $data = $env->data();
489       if(!($morceau = $data->source($_GET[$env->param("id")], true))){
490         $env->erreur("Impossible de lire les informations du morceau");
491         return;
492       }
493       $morceau["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
494       if(!$morceau["permissions"]["admin"]){
495         $env->erreur("vous n'avez pas la permission d'effacer ce morceau");
496         return;
497       }
498       if(!$data->del_source($morceau["id"])){
499         $env->erreur("Impossible de supprimer le morceau");
500         return;
501       }
502       $env->redirect(
503         $env->url("users/morceaux"),
504         "le morceau a été supprimé"
505       );
506     }
507
508   }
509
510 ?>