Diverses corrections
[zf2.biz/galerie.git] / module / Galerie / src / Galerie / Controller / IndexController.php
index db1242f..488e437 100644 (file)
 
 namespace Galerie\Controller; 
 
+
 use Zend\Mvc\Controller\AbstractActionController; 
 use Zend\View\Model\ViewModel;
+use Zend\View\Model\JsonModel;
+
+use Zend\View\Renderer\PhpRenderer;
+
+use Zend\Session\Container;
+
+use Zend\Feed\Writer\FeedFactory;
+use Zend\Feed\Reader\Reader as FeedReader;
+
+use Galerie\Model\Galerie;
+use Galerie\Graph\Test as TestPie;
 
 class IndexController extends AbstractActionController 
 {
 
-    private $_galerieArrayTable;
-    private $_galerieATable;
-    private $_galerieBTable;
-    private $_galerieCTable;
-    private $_galerieCTable2;
+    private $_galerieTable;
+    private $_galerieInfoTable;
+    private $_galerieForm;
+    private $_galerieInfoExporter;
+    private $_galerieMailSender;
+    private $_viewResolver;
+    private $_galeriePairTable;
+
+    private $_translator;
+    private $_log;
+    private $_rss;
+
+
+    private function _getGalerieTable()
+    {
+        if (!$this->_galerieTable) {
+            $sm = $this->getServiceLocator();
+            $this->_galerieTable = $sm->get('Galerie\Model\GalerieTable');
+        }
+        return $this->_galerieTable;
+    }
+
+    private function _getGalerieInfoTable()
+    {
+        if (!$this->_galerieInfoTable) {
+            $sm = $this->getServiceLocator();
+            $this->_galerieInfoTable = $sm->get('Galerie\Model\GalerieInfoTable');
+        }
+        return $this->_galerieInfoTable;
+    }
+
+    private function _getGalerieInfoRssTable()
+    {
+        if (!$this->_galerieInfoTable) {
+            $sm = $this->getServiceLocator();
+            $this->_galerieInfoTable = $sm->get('Galerie\Model\GalerieInfoRssTable');
+        }
+        return $this->_galerieInfoTable;
+    }
 
+    private function _getTranslator()
+    {
+        if (!$this->_translator) {
+            $sm = $this->getServiceLocator();
+            $this->_translator = $sm->get('translator');
+        }
+        return $this->_translator;
+    }
 
-    private function _getGalerieArrayTable()
+    private function _getGalerieForm()
     {
-        if (!$this->_galerieArrayTable) {
+        if (!$this->_galerieForm) {
             $sm = $this->getServiceLocator();
-            $this->_galerieArrayTable = $sm->get('Galerie\Model\GalerieArrayTable');
+            $this->_galerieForm = $sm->get('Galerie\Form\GalerieForm');
         }
-        return $this->_galerieArrayTable;
+        return $this->_galerieForm;
     }
 
-    private function _getGalerieATable()
+    private function _getGalerieInfoExporter()
     {
-        if (!$this->_galerieATable) {
+        if (!$this->_galerieInfoExporter) {
             $sm = $this->getServiceLocator();
-            $this->_galerieATable = $sm->get('Galerie\Model\GalerieATable');
+            $this->_galerieInfoExporter = $sm->get('Galerie\Export\GalerieWorkbook');
         }
-        return $this->_galerieATable;
+        return $this->_galerieInfoExporter;
     }
 
-    private function _getGalerieBTable()
+    private function _getGalerieMailSender()
+    {
+        if (!$this->_galerieMailSender) {
+            $sm = $this->getServiceLocator();
+            $this->_galerieMailSender = $sm->get('Galerie\Mail\MailSender');
+        }
+        return $this->_galerieMailSender;
+    }
+    
+    private function _getViewResolver()
     {
-        if (!$this->_galerieBTable) {
+        if (!$this->_viewResolver) {
             $sm = $this->getServiceLocator();
-            $this->_galerieBTable = $sm->get('Galerie\Model\GalerieBTable');
+            $this->_viewResolver = $sm->get('ViewResolver');
         }
-        return $this->_galerieBTable;
+        return $this->_viewResolver;
     }
 
-    private function _getGalerieCTable()
+    private function _getGaleriePairTable()
     {
-        if (!$this->_galerieCTable) {
+        if (!$this->_galeriePairTable) {
             $sm = $this->getServiceLocator();
-            $this->_galerieCTable = $sm->get('Galerie\Model\GalerieCTable');
+            $this->_galeriePairTable = $sm->get('Galerie\Model\GaleriePairTable');
         }
-        return $this->_galerieCTable;
+        return $this->_galeriePairTable;
     }
 
-    private function _getGalerieCTable2()
+    private function _getLog()
     {
-        if (!$this->_galerieCTable2) {
+        if (!$this->_log) {
             $sm = $this->getServiceLocator();
-            $this->_galerieCTable2 = $sm->get('Galerie\Model\GalerieCTable2');
+            $this->_log = $sm->get('Zend\Log');
         }
-        return $this->_galerieCTable2;
+        return $this->_log;
     }
 
+    private function _getRss()
+    {
+        if (!$this->_rss) {
+            $sm = $this->getServiceLocator();
+            $config = $sm->get('Config');
+            $this->_rss = FeedFactory::factory($config['rss']);
+        }
+        return $this->_rss;
+    }
+
+
+
+
     public function indexAction() 
-    { 
+    {
+        //$this->_getLog()->info('Acces à la liste des galeries');
+        $session = new Container('test');
+        if ($session->offsetExists('last')) {
+            $last = $email = $session->offsetGet('last');
+        } else {
+            $last = null;
+        }
+        return new ViewModel(array('last' => $last));
+    }
+
+    public function rssAction() {
+        // Récupération des informations brutes
+        $modelManager = $this->_getGalerieInfoRssTable();
+        $datas = $modelManager->all();
+
+        // Création du fil RSS
+        $rss = $this->_getRss();
+        
+        foreach($datas as $d) {
+            $entry = $rss->createEntry();
+            $entry->setTitle($d->name);
+            
+            $entry->setLink($this->url()->fromRoute(
+                'galerie/view',
+                array('id' => $d->id)),
+                array('force_canonical' => true)
+            );
+
+            $entry->addAuthor(array(
+                'name'  => $d->username,
+            ));
+            $date = new \DateTime();
+            $entry->setDateModified(
+                $date->setTimestamp(intval($d->updated))
+            );
+            $entry->setDateCreated(
+                $date->setTimestamp(intval($d->created))
+            );
+            $entry->setDescription($d->description);
+            $entry->setContent("{$d->nb} photos.");
+            $rss->addEntry($entry);
+        }
+
+        //echo '<pre>'; print_r($rss->export('rss')); die('</pre>');
+
+        // Création de la réponse
+        $response = $this->getResponse();
+        $response->setStatusCode(200);
+
+        // Modification des entêtes
+        $headers = $this->getResponse()->getHeaders();
+        $headers->addHeaderLine('Content-Type', 'application/rss+xml; charset=utf-8');
+
+        $response->setContent($rss->export('rss'));
+
+        return $response;
+    }
+
+    public function csvAction() {
+        // Récupération des informations brutes
+        $modelManager = $this->_getGalerieInfoTable();
+        $datas = $modelManager->all();
+
+        // Mise en forme des résultats
+        $content = array($modelManager->csvHeader());
+        foreach($datas as $d) {
+            $content[] = $d->csvFormat();
+        }
+
+        // Création de la réponse
+        $response = $this->getResponse();
+        $response->setStatusCode(200);
+
+        // Modification des entêtes
+        $headers = $this->getResponse()->getHeaders();
+        $headers->addHeaderLine('Content-Type', 'text/csv; charset=utf-8');
+        $headers->addHeaderLine('Content-Disposition', 'attachment; filename="export_galerie.csv"');
+
+        $response->setContent(implode("\r\n", $content));
+
+        return $response;
+    }
+    
+    public function rsscheckAction()
+    {
+        $url = $this->url()->fromRoute('galerie/rss', array(), array('force_canonical' => true));
+        $channel = FeedReader::import($url);
+        $title = $channel->getTitle();
+        $author = $channel->getAuthor();
+        $username = $author['name'];
+        $galeries = array();
+        foreach ($channel as $item) {
+            $galeries[] = "{$item->getTitle()} : {$item->getDescription()}";
+        }
+
         return new ViewModel(array(
-            'GalerieArray_all' => $this->_getGalerieArrayTable()->fetchAll(),
-            'GalerieArray_one' => $this->_getGalerieArrayTable()->getGalerie(1),
-            'GalerieA_all' => $this->_getGalerieATable()->fetchAll(),
-            'GalerieA_one' => $this->_getGalerieATable()->getGalerie(1),
-            'GalerieB_all' => $this->_getGalerieBTable()->fetchAll(),
-            'GalerieB_one' => $this->_getGalerieBTable()->getGalerie(1),
-            'GalerieC_all' => $this->_getGalerieCTable()->fetchAll(),
-            'GalerieC_one' => $this->_getGalerieCTable()->getGalerie(1),
-            'GalerieC2_all' => $this->_getGalerieCTable2()->fetchAll(),
-            'GalerieC2_one' => $this->_getGalerieCTable2()->getGalerie(1),
-        )); 
+            'title' => $title,
+            'username' => $username,
+            'galeries' => $galeries,
+        ));
+    }
+
+
+    public function excelAction() {
+        // Récupération des informations brutes
+        $modelManager = $this->_getGalerieInfoTable();
+        $datas = $modelManager->all();
+
+        $exporter = $this->_getGalerieInfoExporter();
+        $exporter->build($datas);
+
+        // Renvoi d'une réponse vide pour désactiver le rendu de la vue
+        return $this->getResponse();
+    }
+
+
+    public function mailAction()
+    {
+        //Construction du courriel au format HTML.
+        $mail_viewmodel = new ViewModel(array(
+            'who' => 'World',
+        ));
+        $mail_viewmodel->setTemplate('galerie/mail/test');
+        $renderer = new PhpRenderer;
+        $renderer->setResolver($this->_getViewResolver());
+        $body_html = $renderer->render($mail_viewmodel);
+
+        // Envoi du courriel
+        $mailSender = $this->_getGalerieMailSender();
+        $mailSender->send(
+            's.chazallet@gmail.com', 'Moi',//'sender@example.com', 'Moi',
+            's.chazallet@gmail.com', 'Toi',//'to@example.com', 'Toi',
+            'Test', 'Hello World 4.', $body_html
+        );
+
+        // Création de la réponse
+        $response = $this->getResponse();
+        $response->setStatusCode(200);
+        $response->setContent('Mail Sent.');
+
+        return $response;
+    }
+
+    public function pieAction()
+    {
+        // Accès aux modèles
+        $modelManager = $this->_getGalerieInfoTable();
+        $datas = $modelManager->all();
+
+        // Mise en forme des résultats
+        $nombres = array();
+        $noms = array();
+        foreach($datas as $d) {
+            $nombres[] = $d->nb;
+            $noms[] = $d->name;
+        }
+
+        // Construction (et envoi) du diagramme
+        $pie = new TestPie($nombres, $noms);
+
+        $response = $this->getResponse();
+        $response->setStatusCode(200);
+        $response->setContent('');
+
+        return $response;
+    }
+
+    public function listAction() 
+    { 
+        // Récupération de l'objet requête
+        $request = $this->getRequest();
+
+        $start = $request->getQuery('iDisplayStart', 0);
+        $length = $request->getQuery('iDisplayLength', 10);
+        $tri = $request->getQuery('iSortCol_0');
+        $senstri = $request->getQuery('sSortDir_0', 'asc');
+        $filtre = $request->getQuery('sSearch');
+
+        // Preparation pour le requêtage
+        $modelManager = $this->_getGalerieInfoTable();
+
+        // Récupération des galeries sous la forme d'un tableau d'entités
+        $galeries = $modelManager->getPartial($start, $length, $tri, $senstri, $filtre);
+
+        // Préparation pour la mise en forme du résultat
+        $action_template = '<a href="%s">%s</a><a href="%s">%s</a><a href="%s">%s</a>';
+        $translator = $this->_getTranslator();
+        $action_voir = $translator->translate('Galerie_index_table_lien_view', 'galerie');
+        $action_editer = $translator->translate('Galerie_index_table_lien_edit', 'galerie');
+        $action_supprimer = $translator->translate('Galerie_index_table_lien_del', 'galerie');
+        $url = $this->url();
+        // Mise en forme du résultat pour que cela corresponde à l'attendu, c'est à dire un tableau de tableaux
+        $result = array();
+        foreach($galeries as $g) {
+            $result[] = array(
+                "<strong>{$g->name}</strong><em>{$g->description}</em>",
+                $g->username,
+                $g->nb,
+                sprintf(
+                    $action_template,
+                    $url->fromRoute('galerie/view', array('id' => $g->id)),
+                    $action_voir,
+                    $url->fromRoute('galerie/edit', array('id' => $g->id)),
+                    $action_editer,
+                    $url->fromRoute('galerie/del', array('id' => $g->id)),
+                    $action_supprimer
+                ),
+            );
+        }
+
+       // Construction du resultat
+        return new JsonModel(array(
+            "sEcho" => $request->getQuery('sEcho', 1),
+            "iTotalRecords" => $modelManager->count_all(),
+            "iTotalDisplayRecords" => count($result),
+            "aaData" => $result,
+        ));
     } 
 
     public function editAction() 
-    { 
-        return array(); 
+    {
+        // Création du formulaire
+        $form = $this->_getGalerieForm();
+
+        // Récupération de l'objet de travail
+        $id = $this->params()->fromRoute('id', null);
+        if (!$id) {
+            $galerie = null;
+        } else {
+            $galerie = $this->_getGalerieTable()->any(array('id' => $id));
+            if (!$galerie) {
+                return $this->redirect()->toRoute('galerie');
+            }
+        }
+
+        // Sommes-nous en ajout ou en édition ?
+        if (!$galerie) {
+            // Nous sommes en ajout
+            $form->get('submit')->setValue('Ajouter');
+            // Il faut créer un nouveau objet Galerie
+            $galerie = new Galerie;
+            // Garder cette information pour la vue
+            $is_new = true;
+        } else {
+            // Nous sommes en modification
+            $form->get('submit')->setValue('Modifier');
+            // Garder cette information pour la vue
+            $is_new = false;
+        }
+
+
+            // Il faut préremplir le formulaire avec les données actuelles
+            $form->bind($galerie);
+
+        // Récupération de l'objet requête
+        $request = $this->getRequest();
+        if ($request->isPost()) {
+            // Mise en place pour la validation du formulaire
+            $form->setInputFilter($galerie->getInputFilter());
+            $form->setData($request->getPost());
+
+            // Validation des données
+            if ($form->isValid()) {
+                // Sauvegarde des données
+                $galerie = $form->getData();
+                if ($is_new) {
+                    // Si l'objet n'est pas nouveau, les autres paramètres restent inchangés
+                    // Si l'objet est nouveau, il faut renseigner l'id de l'utilisateur courant
+                    $galerie->id_user = 1; //TODO: Mettre ici le user connecté
+                }
+                $this->_getGalerieTable()->save($galerie);
+
+                $translator = $this->_getTranslator();
+                $messenger = $this->flashMessenger();
+                $messenger->setNamespace('infos');
+                if ($is_new) {
+                    $messenger->addMessage($translator->translate('Galerie_added', 'galerie'));
+                } else {
+                    $messenger->addMessage($translator->translate('Galerie_updated', 'galerie'));
+                }
+                // Redirection à l'ancienne mode
+                //return $this->redirect()->toRoute('galerie');
+                // Redirection vers le contrôleur courant
+                //return $this->postRedirectGet();
+                // Redirection vers la page Galerie/Index
+                return $this->postRedirectGet('galerie');
+            }
+        }
+
+        // On prépare l'affichage du formulaire
+        if ($is_new) {
+            $form->setAttribute('action', $this->url()->fromRoute('galerie/add'));
+        } else {
+            $form->setAttribute('action', $this->url()->fromRoute('galerie/edit', array('id' => $id)));
+        }
+        $form->prepare();
+
+        // On passe la main à la vue
+        return new ViewModel(array(
+            'id' => $id,
+            'form' => $form,
+            'is_new' => $is_new,
+        ));
     } 
 
     public function delAction() 
     { 
-        return array(); 
+        return $this->redirect()->toRoute('galerie/view', array(
+            'id' => $this->params()->fromRoute('id', null),
+        ));
     } 
 
     public function viewAction() 
-    { 
-        return array(); 
+    {
+        $id = $this->params()->fromRoute('id', null);
+        $galerie = $this->_getGalerieInfoTable()->any($id);
+
+        if (!$galerie) {
+            return $this->redirect()->toRoute('galerie');
+        }
+
+        $pairs = $this->_getGaleriePairTable()->all();
+        unset($pairs[$id]);
+
+        $session = new Container('test');
+        $session->offsetSet('last', $id);
+
+        return new ViewModel(array(
+            'id' => $id,
+            'galerie' => $galerie,
+            'pairs' => $pairs,
+        ));
     } 
+
 }