Diverses corrections
[zf2.biz/galerie.git] / module / Galerie / src / Galerie / Controller / IndexController.php
1 <?php
2
3 namespace Galerie\Controller; 
4
5
6 use Zend\Mvc\Controller\AbstractActionController; 
7 use Zend\View\Model\ViewModel;
8 use Zend\View\Model\JsonModel;
9
10 use Zend\View\Renderer\PhpRenderer;
11
12 use Zend\Session\Container;
13
14 use Zend\Feed\Writer\FeedFactory;
15 use Zend\Feed\Reader\Reader as FeedReader;
16
17 use Galerie\Model\Galerie;
18 use Galerie\Graph\Test as TestPie;
19
20 class IndexController extends AbstractActionController 
21 {
22
23     private $_galerieTable;
24     private $_galerieInfoTable;
25     private $_galerieForm;
26     private $_galerieInfoExporter;
27     private $_galerieMailSender;
28     private $_viewResolver;
29     private $_galeriePairTable;
30
31     private $_translator;
32     private $_log;
33     private $_rss;
34
35
36     private function _getGalerieTable()
37     {
38         if (!$this->_galerieTable) {
39             $sm = $this->getServiceLocator();
40             $this->_galerieTable = $sm->get('Galerie\Model\GalerieTable');
41         }
42         return $this->_galerieTable;
43     }
44
45     private function _getGalerieInfoTable()
46     {
47         if (!$this->_galerieInfoTable) {
48             $sm = $this->getServiceLocator();
49             $this->_galerieInfoTable = $sm->get('Galerie\Model\GalerieInfoTable');
50         }
51         return $this->_galerieInfoTable;
52     }
53
54     private function _getGalerieInfoRssTable()
55     {
56         if (!$this->_galerieInfoTable) {
57             $sm = $this->getServiceLocator();
58             $this->_galerieInfoTable = $sm->get('Galerie\Model\GalerieInfoRssTable');
59         }
60         return $this->_galerieInfoTable;
61     }
62
63     private function _getTranslator()
64     {
65         if (!$this->_translator) {
66             $sm = $this->getServiceLocator();
67             $this->_translator = $sm->get('translator');
68         }
69         return $this->_translator;
70     }
71
72     private function _getGalerieForm()
73     {
74         if (!$this->_galerieForm) {
75             $sm = $this->getServiceLocator();
76             $this->_galerieForm = $sm->get('Galerie\Form\GalerieForm');
77         }
78         return $this->_galerieForm;
79     }
80
81     private function _getGalerieInfoExporter()
82     {
83         if (!$this->_galerieInfoExporter) {
84             $sm = $this->getServiceLocator();
85             $this->_galerieInfoExporter = $sm->get('Galerie\Export\GalerieWorkbook');
86         }
87         return $this->_galerieInfoExporter;
88     }
89
90     private function _getGalerieMailSender()
91     {
92         if (!$this->_galerieMailSender) {
93             $sm = $this->getServiceLocator();
94             $this->_galerieMailSender = $sm->get('Galerie\Mail\MailSender');
95         }
96         return $this->_galerieMailSender;
97     }
98     
99     private function _getViewResolver()
100     {
101         if (!$this->_viewResolver) {
102             $sm = $this->getServiceLocator();
103             $this->_viewResolver = $sm->get('ViewResolver');
104         }
105         return $this->_viewResolver;
106     }
107
108     private function _getGaleriePairTable()
109     {
110         if (!$this->_galeriePairTable) {
111             $sm = $this->getServiceLocator();
112             $this->_galeriePairTable = $sm->get('Galerie\Model\GaleriePairTable');
113         }
114         return $this->_galeriePairTable;
115     }
116
117     private function _getLog()
118     {
119         if (!$this->_log) {
120             $sm = $this->getServiceLocator();
121             $this->_log = $sm->get('Zend\Log');
122         }
123         return $this->_log;
124     }
125
126     private function _getRss()
127     {
128         if (!$this->_rss) {
129             $sm = $this->getServiceLocator();
130             $config = $sm->get('Config');
131             $this->_rss = FeedFactory::factory($config['rss']);
132         }
133         return $this->_rss;
134     }
135
136
137
138
139     public function indexAction() 
140     {
141         //$this->_getLog()->info('Acces à la liste des galeries');
142         $session = new Container('test');
143         if ($session->offsetExists('last')) {
144             $last = $email = $session->offsetGet('last');
145         } else {
146             $last = null;
147         }
148         return new ViewModel(array('last' => $last));
149     }
150
151     public function rssAction() {
152         // Récupération des informations brutes
153         $modelManager = $this->_getGalerieInfoRssTable();
154         $datas = $modelManager->all();
155
156         // Création du fil RSS
157         $rss = $this->_getRss();
158         
159         foreach($datas as $d) {
160             $entry = $rss->createEntry();
161             $entry->setTitle($d->name);
162             
163             $entry->setLink($this->url()->fromRoute(
164                 'galerie/view',
165                 array('id' => $d->id)),
166                 array('force_canonical' => true)
167             );
168
169             $entry->addAuthor(array(
170                 'name'  => $d->username,
171             ));
172             $date = new \DateTime();
173             $entry->setDateModified(
174                 $date->setTimestamp(intval($d->updated))
175             );
176             $entry->setDateCreated(
177                 $date->setTimestamp(intval($d->created))
178             );
179             $entry->setDescription($d->description);
180             $entry->setContent("{$d->nb} photos.");
181             $rss->addEntry($entry);
182         }
183
184         //echo '<pre>'; print_r($rss->export('rss')); die('</pre>');
185
186         // Création de la réponse
187         $response = $this->getResponse();
188         $response->setStatusCode(200);
189
190         // Modification des entêtes
191         $headers = $this->getResponse()->getHeaders();
192         $headers->addHeaderLine('Content-Type', 'application/rss+xml; charset=utf-8');
193
194         $response->setContent($rss->export('rss'));
195
196         return $response;
197     }
198
199     public function csvAction() {
200         // Récupération des informations brutes
201         $modelManager = $this->_getGalerieInfoTable();
202         $datas = $modelManager->all();
203
204         // Mise en forme des résultats
205         $content = array($modelManager->csvHeader());
206         foreach($datas as $d) {
207             $content[] = $d->csvFormat();
208         }
209
210         // Création de la réponse
211         $response = $this->getResponse();
212         $response->setStatusCode(200);
213
214         // Modification des entêtes
215         $headers = $this->getResponse()->getHeaders();
216         $headers->addHeaderLine('Content-Type', 'text/csv; charset=utf-8');
217         $headers->addHeaderLine('Content-Disposition', 'attachment; filename="export_galerie.csv"');
218
219         $response->setContent(implode("\r\n", $content));
220
221         return $response;
222     }
223     
224     public function rsscheckAction()
225     {
226         $url = $this->url()->fromRoute('galerie/rss', array(), array('force_canonical' => true));
227         $channel = FeedReader::import($url);
228         $title = $channel->getTitle();
229         $author = $channel->getAuthor();
230         $username = $author['name'];
231         $galeries = array();
232         foreach ($channel as $item) {
233             $galeries[] = "{$item->getTitle()} : {$item->getDescription()}";
234         }
235
236         return new ViewModel(array(
237             'title' => $title,
238             'username' => $username,
239             'galeries' => $galeries,
240         ));
241     }
242
243
244     public function excelAction() {
245         // Récupération des informations brutes
246         $modelManager = $this->_getGalerieInfoTable();
247         $datas = $modelManager->all();
248
249         $exporter = $this->_getGalerieInfoExporter();
250         $exporter->build($datas);
251
252         // Renvoi d'une réponse vide pour désactiver le rendu de la vue
253         return $this->getResponse();
254     }
255
256
257     public function mailAction()
258     {
259         //Construction du courriel au format HTML.
260         $mail_viewmodel = new ViewModel(array(
261             'who' => 'World',
262         ));
263         $mail_viewmodel->setTemplate('galerie/mail/test');
264         $renderer = new PhpRenderer;
265         $renderer->setResolver($this->_getViewResolver());
266         $body_html = $renderer->render($mail_viewmodel);
267
268         // Envoi du courriel
269         $mailSender = $this->_getGalerieMailSender();
270         $mailSender->send(
271             's.chazallet@gmail.com', 'Moi',//'sender@example.com', 'Moi',
272             's.chazallet@gmail.com', 'Toi',//'to@example.com', 'Toi',
273             'Test', 'Hello World 4.', $body_html
274         );
275
276         // Création de la réponse
277         $response = $this->getResponse();
278         $response->setStatusCode(200);
279         $response->setContent('Mail Sent.');
280
281         return $response;
282     }
283
284     public function pieAction()
285     {
286         // Accès aux modèles
287         $modelManager = $this->_getGalerieInfoTable();
288         $datas = $modelManager->all();
289
290         // Mise en forme des résultats
291         $nombres = array();
292         $noms = array();
293         foreach($datas as $d) {
294             $nombres[] = $d->nb;
295             $noms[] = $d->name;
296         }
297
298         // Construction (et envoi) du diagramme
299         $pie = new TestPie($nombres, $noms);
300
301         $response = $this->getResponse();
302         $response->setStatusCode(200);
303         $response->setContent('');
304
305         return $response;
306     }
307
308     public function listAction() 
309     { 
310         // Récupération de l'objet requête
311         $request = $this->getRequest();
312
313         $start = $request->getQuery('iDisplayStart', 0);
314         $length = $request->getQuery('iDisplayLength', 10);
315         $tri = $request->getQuery('iSortCol_0');
316         $senstri = $request->getQuery('sSortDir_0', 'asc');
317         $filtre = $request->getQuery('sSearch');
318
319         // Preparation pour le requêtage
320         $modelManager = $this->_getGalerieInfoTable();
321
322         // Récupération des galeries sous la forme d'un tableau d'entités
323         $galeries = $modelManager->getPartial($start, $length, $tri, $senstri, $filtre);
324
325         // Préparation pour la mise en forme du résultat
326         $action_template = '<a href="%s">%s</a><a href="%s">%s</a><a href="%s">%s</a>';
327         $translator = $this->_getTranslator();
328         $action_voir = $translator->translate('Galerie_index_table_lien_view', 'galerie');
329         $action_editer = $translator->translate('Galerie_index_table_lien_edit', 'galerie');
330         $action_supprimer = $translator->translate('Galerie_index_table_lien_del', 'galerie');
331         $url = $this->url();
332         // Mise en forme du résultat pour que cela corresponde à l'attendu, c'est à dire un tableau de tableaux
333         $result = array();
334         foreach($galeries as $g) {
335             $result[] = array(
336                 "<strong>{$g->name}</strong><em>{$g->description}</em>",
337                 $g->username,
338                 $g->nb,
339                 sprintf(
340                     $action_template,
341                     $url->fromRoute('galerie/view', array('id' => $g->id)),
342                     $action_voir,
343                     $url->fromRoute('galerie/edit', array('id' => $g->id)),
344                     $action_editer,
345                     $url->fromRoute('galerie/del', array('id' => $g->id)),
346                     $action_supprimer
347                 ),
348             );
349         }
350
351         // Construction du resultat
352         return new JsonModel(array(
353             "sEcho" => $request->getQuery('sEcho', 1),
354             "iTotalRecords" => $modelManager->count_all(),
355             "iTotalDisplayRecords" => count($result),
356             "aaData" => $result,
357         ));
358     } 
359
360     public function editAction() 
361     {
362         // Création du formulaire
363         $form = $this->_getGalerieForm();
364
365         // Récupération de l'objet de travail
366         $id = $this->params()->fromRoute('id', null);
367         if (!$id) {
368             $galerie = null;
369         } else {
370             $galerie = $this->_getGalerieTable()->any(array('id' => $id));
371             if (!$galerie) {
372                 return $this->redirect()->toRoute('galerie');
373             }
374         }
375
376         // Sommes-nous en ajout ou en édition ?
377         if (!$galerie) {
378             // Nous sommes en ajout
379             $form->get('submit')->setValue('Ajouter');
380             // Il faut créer un nouveau objet Galerie
381             $galerie = new Galerie;
382             // Garder cette information pour la vue
383             $is_new = true;
384         } else {
385             // Nous sommes en modification
386             $form->get('submit')->setValue('Modifier');
387             // Garder cette information pour la vue
388             $is_new = false;
389         }
390
391
392             // Il faut préremplir le formulaire avec les données actuelles
393             $form->bind($galerie);
394
395         // Récupération de l'objet requête
396         $request = $this->getRequest();
397         if ($request->isPost()) {
398             // Mise en place pour la validation du formulaire
399             $form->setInputFilter($galerie->getInputFilter());
400             $form->setData($request->getPost());
401
402             // Validation des données
403             if ($form->isValid()) {
404                 // Sauvegarde des données
405                 $galerie = $form->getData();
406                 if ($is_new) {
407                     // Si l'objet n'est pas nouveau, les autres paramètres restent inchangés
408                     // Si l'objet est nouveau, il faut renseigner l'id de l'utilisateur courant
409                     $galerie->id_user = 1; //TODO: Mettre ici le user connecté
410                 }
411                 $this->_getGalerieTable()->save($galerie);
412
413                 $translator = $this->_getTranslator();
414                 $messenger = $this->flashMessenger();
415                 $messenger->setNamespace('infos');
416                 if ($is_new) {
417                     $messenger->addMessage($translator->translate('Galerie_added', 'galerie'));
418                 } else {
419                     $messenger->addMessage($translator->translate('Galerie_updated', 'galerie'));
420                 }
421                 // Redirection à l'ancienne mode
422                 //return $this->redirect()->toRoute('galerie');
423                 // Redirection vers le contrôleur courant
424                 //return $this->postRedirectGet();
425                 // Redirection vers la page Galerie/Index
426                 return $this->postRedirectGet('galerie');
427             }
428         }
429
430         // On prépare l'affichage du formulaire
431         if ($is_new) {
432             $form->setAttribute('action', $this->url()->fromRoute('galerie/add'));
433         } else {
434             $form->setAttribute('action', $this->url()->fromRoute('galerie/edit', array('id' => $id)));
435         }
436         $form->prepare();
437
438         // On passe la main à la vue
439         return new ViewModel(array(
440             'id' => $id,
441             'form' => $form,
442             'is_new' => $is_new,
443         ));
444     } 
445
446     public function delAction() 
447     { 
448         return $this->redirect()->toRoute('galerie/view', array(
449             'id' => $this->params()->fromRoute('id', null),
450         ));
451     } 
452
453     public function viewAction() 
454     {
455         $id = $this->params()->fromRoute('id', null);
456         $galerie = $this->_getGalerieInfoTable()->any($id);
457
458         if (!$galerie) {
459             return $this->redirect()->toRoute('galerie');
460         }
461
462         $pairs = $this->_getGaleriePairTable()->all();
463         unset($pairs[$id]);
464
465         $session = new Container('test');
466         $session->offsetSet('last', $id);
467
468         return new ViewModel(array(
469             'id' => $id,
470             'galerie' => $galerie,
471             'pairs' => $pairs,
472         ));
473     } 
474
475