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