source: cpc/trunk/project/apps/frontend/modules/commentaire/actions/actions.class.php @ 1438

Last change on this file since 1438 was 1438, checked in by teymour, 11 years ago

Bug étrange avec les url_for dans les task
Gestion plus rationnelle du app.yml
Parametrage de l'envoi des alertes

File size: 14.1 KB
Line 
1<?php
2
3/**
4 * commentaire actions.
5 *
6 * @package    cpc
7 * @subpackage commentaire
8 * @author     Your name here
9 * @version    SVN: $Id: actions.class.php 12479 2008-10-31 10:54:40Z fabien $
10 */
11class commentaireActions extends sfActions
12{
13 
14  public function executePost(sfWebRequest $request)
15  {
16    $redirect_url = array('Intervention' => '@intervention?id=', 'Amendement' => '@amendement_id?id=', 'QuestionEcrite' => '@question_id?id=', 'ArticleLoi' => '@loi_article_id?id=', 'Alinea' => '@loi_alinea?id=', 'Texteloi' => '@document?id=');
17    $about = array('Intervention' => "Suite aux propos d", 'Amendement' => "Au sujet d'un amendement déposé", 'QuestionEcrite' => "A propos d'une question écrite d");
18       
19    $this->type = $request->getParameter('type');
20    $this->id = $request->getParameter('id');
21    $this->follow_talk = $request->getParameter('follow_talk');
22   
23    $values = $request->getParameter('commentaire');
24    $this->commentaire = myTools::clearHtml($values['commentaire']);
25    $this->unique_form = $request->getParameter('unique_form');
26
27    if ($this->getUser()->getAttribute('commentaire_'.$this->type.'_'.$this->id) != $this->unique_form) {
28      $this->getUser()->setFlash('error', 'Vous avez déjà posté ce commentaire...');
29      return $this->redirect($redirect_url[$this->type].$this->id);
30    }
31
32    if (!$request->isMethod('post')) {
33      $this->getUser()->setFlash('error', 'Un problème technique est survenu');
34      return $this->redirect($redirect_url[$this->type].$this->id);
35    }
36
37    /** On logue l'utilisateur si il a donné un login et mot de passe correct sinon creation du form et template**/
38    $isAuthenticated = $this->getUser()->isAuthenticated();
39    /** Pas loggué on s'assure que quelqu'un n'a pas trouvé notre hack */
40    $_GET['isAuthenticated'] = $isAuthenticated;
41    if (isset($values['login']) && isset($values['password']) && $values['login'] != "" && $values['password'] != "") {
42      if (!($citoyen_id = myUser::SignIn($values['login'], $values['password'], false, $this))) {
43        $this->form = new CommentaireForm();
44        $this->form->bind($values);
45        return ;
46      }
47      $is_active = true;
48      $isAuthenticated = 1;
49      //Pour communication avec CommentaireForm->configure()
50      $_GET['isAuthenticated'] = 1;
51      //Invalide les champs dont on a plus besoin come l'utilisateur est connecté
52      unset($values['login']);
53      unset($values['password']);
54      unset($values['email']);
55      unset($values['nom']);
56    }
57
58    /** Creation du form et validation */
59    $this->form = new CommentaireForm();
60    $this->form->bind($values); 
61    if (!$request->getParameter('ok') || !$this->form->isValid())
62      return ;
63
64
65    if ($isAuthenticated) {
66      $citoyen_id = $this->getUser()->getAttribute('user_id');
67      $is_active = $this->getUser()->getAttribute('is_active');
68    } else if ($values['nom'] && $values['email']) {
69      $this->getUser()->setAttribute('partial', 'inscriptioncom');
70      if (!($citoyen_id = myUser::CreateAccount($values['nom'], $values['email'], $this)))
71        return ;
72      $is_active = false;
73    } else { //Si pas de (login et mdp) ou (email, login)
74      $this->getUser()->setFlash('error', 'Vous devez avoir un compte et y être connecté pour poster un commentaire.<br />Le formulaire ci-dessous vous permet de vous identifier ou de vous inscrire sur le site.');
75      return;
76    }
77    $ip = '';
78    if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
79            $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
80    $ip = $ip . ',';
81    if(isset($_SERVER['HTTP_CLIENT_IP'])) 
82            $ip = $ip . $_SERVER['HTTP_CLIENT_IP'];
83    $ip = $ip . ',';
84    if(isset($_SERVER['REMOTE_ADDR'])) 
85            $ip = $ip . $_SERVER['REMOTE_ADDR']; 
86
87  // On teste l'existence préalable du même commentaire
88    if ($existing = Doctrine::getTable('Commentaire')->createQuery('c')
89      ->select('created_at')
90      ->where('citoyen_id = ?', $this->getUser()->getAttribute('user_id'))
91      ->andWhere('commentaire LIKE ?', $this->commentaire)
92      ->andWhere('object_type = ?', $this->type)
93      ->andWhere('object_id = ?', $this->id)
94      ->fetchArray()) {
95      $this->getUser()->setFlash('error', 'Vous avez déjà posté ce même commentaire le '.myTools::displayShortDate($existing[0]['created_at']));
96      return;
97    }
98
99 
100    $commentaire = $this->form->getObject();
101    //Pas trouvé d'autre moyen que de bypasser le form pour conserver la presentation htmlisée
102    $commentaire->commentaire = $this->commentaire;
103    $commentaire->object_type = $this->type;
104    $commentaire->object_id = $this->id;
105    $commentaire->lien = $redirect_url[$this->type].$this->id;
106    $object = Doctrine::getTable($this->type)->find($this->id);
107    if ($this->type === 'Texteloi') 
108      $present = $object->getShortTitre();
109    else if (isset($object->texteloi_id)) {
110      $titreloi = Doctrine::getTable('TitreLoi')->findLightLoi($object->texteloi_id);
111      $loi = Doctrine::getTable('Texteloi')->findLoi($object->texteloi_id);
112      if ($this->type != 'Amendement') {
113        if ($titreloi)
114          $present = preg_replace('/<br\/>.*$/', '', $titreloi['titre']).' - A propos de l\'article ';
115        else if($loi)
116          $present = $loi->getTitre().' - A propos de l\'article n°'.$object->numero;
117        if ($this->type == 'Alinea') {
118          $article = Doctrine::getTable('ArticleLoi')->createQuery('a')
119            ->select('titre')
120            ->where('texteloi_id = ?', $object->texteloi_id)
121            ->andWhere('id = ?', $object->article_loi_id)
122            ->fetchOne();
123          $present .= $article['titre'].' alinéa '.$object->numero;
124        } else $present .= $object->titre;
125      } else if ($titreloi)
126        $present = preg_replace('/<br\/>.*$/', '', $titreloi['titre']).' - A propos de l\'amendement n°'.$object->numero;
127      else if ($loi)
128        $present = $loi->getShortTitre().' - A propos de l\'amendement n°'.$object->numero;
129      else $present = $about[$this->type].' le '.date('d/m/Y', strtotime($object->date));
130    } else {
131      $present = '';
132      if ($this->type != 'QuestionEcrite') {
133        if ($section = $object->getSection())
134          $present = $section->getSection(1)->getTitre();
135        if ($present == '' && $this->type == 'Intervention' && $object->type == 'commission')
136          $present = $object->getSeance()->getOrganisme()->getNom();
137      }
138      if ($present != '') $present .= ' - ';   
139      else $present = '';
140      $present .= $about[$this->type];
141      $nom = '';
142      if ($this->type == 'QuestionEcrite')
143        $nom = $object->getParlementaire()->nom;
144      else if ($this->type == 'Intervention')
145        $nom = $object->getIntervenant()->nom;
146      if ($nom != '') {
147        if (preg_match('/^[AEIOUYÉÈÊ]/', $nom)) $nom = '\''.$nom;
148        else $nom = 'e '.$nom;
149        $present .= $nom;
150      }
151      $present .= ' le '.date('d/m/Y', strtotime($object->date));
152    }
153    $commentaire->presentation = $present;
154    $commentaire->citoyen_id = $citoyen_id;
155    $commentaire->is_public = $is_active;
156    $commentaire->ip_address = $ip;
157    $commentaire->save();
158
159    $alerte = new Alerte();
160    $alerte->citoyen_id = $citoyen_id;
161    $alerte->query = "object_name:Commentaire tag:object_type=".$commentaire->object_type." tag:object_id=".$commentaire->object_id;
162    $alerte->no_human_query = 1;
163    $alerte->period = 'HOUR';
164    $alerte->titre = "Suivi de votre conversation sur $present";
165    $alerte->save();
166
167    $object->updateNbCommentaires();
168    $object->save();
169
170    if (isset($object->parlementaire_id)) {
171      if ($object->parlementaire_id)
172        $commentaire->addObject('Parlementaire', $object->parlementaire_id);
173    } else if ($this->type === 'Amendement' || $this->type === 'Texteloi') {
174      $parlementaires = $object->getParlementaires();
175      if ($parlementaires) foreach($parlementaires as $p)
176        $commentaire->addObject('Parlementaire', $p->id);
177    }
178    if ($this->type === 'Amendement' && !($seance = $object->getIntervention($object->numero))) {
179      $identiques = Doctrine::getTable('Amendement')->createQuery('a')
180        ->where('content_md5 = ?', $object->content_md5)
181        ->orderBy('numero')->execute();
182      foreach($identiques as $a) {
183        if ($seance) break;
184        $seance = $object->getIntervention($a->numero);
185      }
186    }
187    if (isset($seance))
188      $commentaire->addObject('Seance', $seance['seance_id']);
189    if ($this->type === 'Amendement' && isset($titreloi)) {
190      if (preg_match('/^Article\s+(.*)$/', $object->sujet, $match)) {
191        $art = preg_replace('/premier/i', '1er', $match[1]);
192        if ($art_obj = Doctrine::getTable('ArticleLoi')->findOneByLoiTitre($object->texteloi_id,$art))
193          $commentaire->addObject('ArticleLoi', $art_obj->id);
194      } else $commentaire->addObject('TitreLoi', $titreloi->id);
195      $commentaire->addObject('Texteloi', $titreloi->texteloi_id);
196    }
197    if (($this->type === "Titreloi" && $section = $object->getDossier()) || (($this->type === "TexteLoi" || $this->type === "Amendement") && $section = $object->getSection()))
198      $commentaire->addObject('Section', $section->getSection(1)->id);
199    if (isset($object->seance_id)) {
200      if ($object->seance_id)
201        $commentaire->addObject('Seance', $object->seance_id);
202    }
203    if (isset($object->section_id)) {
204      if ($object->section_id)
205        $commentaire->addObject('Section', $object->section_id);
206    }
207    if (isset($object->article_loi_id)) {
208      if ($object->article_loi_id)
209        $commentaire->addObject('ArticleLoi', $object->article_loi_id);
210    }
211    if (isset($object->titre_loi_id)) {
212      if ($object->titre_loi_id)
213        $commentaire->addObject('TitreLoi', $object->titre_loi_id);
214    }
215    if (isset($object->texteloi_id)) {
216      if ($object->texteloi_id)
217        $commentaire->addObject('Texteloi', $object->texteloi_id);
218    }
219
220     
221    $pas_confirme_mail = '';
222    if (!$is_active) {
223      $pas_confirme_mail = ', pour le rendre public, cliquez sur le lien d\'activation contenu dans l\'email que nous vous avons envoyé afin de terminer votre inscription.';
224    }
225    $this->getUser()->setFlash('notice', 'Votre commentaire a été enregistré'.$pas_confirme_mail);
226    $this->getUser()->getAttributeHolder()->remove('commentaire_'.$this->type.'_'.$this->id);
227
228    return $this->redirect($commentaire->lien);
229  }
230
231  public function executeJson(sfWebRequest $request) {
232    $this->setLayout(false);
233    if ($seance_id = $request->getParameter('seance'))
234      $query = Doctrine::getTable('Intervention')->createQuery('i');
235    else if ($article_id = $request->getParameter('article'))
236      $query = Doctrine::getTable('Alinea')->createQuery('i');
237    else $this->forward404();
238    $query->select('i.id, i.nb_commentaires');
239    if ($seance_id)
240      $query->where('seance_id = ?', $seance_id);
241    else $query->where('article_loi_id = ?', $article_id);
242    $this->commentaires = $query->fetchArray();
243    $this->getResponse()->setHttpHeader('content-type', 'text/plain');
244  }
245
246  public function executeShowAjax(sfWebRequest $request) {
247    $this->setLayout(false);
248    $this->id = $request->getParameter('id');
249    $this->forward404Unless($this->id);
250    $query = Doctrine::getTable('Commentaire')->createQuery('c')
251      ->where('object_id = ?', $this->id)
252      ->andWhere('is_public = ?', 1);
253    if ($request->getParameter('intervention')) {
254      $query->andWhere('object_type = ?', 'Intervention');
255      $this->type = 'Intervention';
256    } else if ($request->getParameter('alinea')) {
257      $query->andWhere('object_type = ?', 'Alinea');
258      $this->type = 'Alinea';
259    } else $this->forward404();
260    if ($this->limit = $request->getParameter('limit'))
261      $query->orderBy('created_at DESC')
262        ->limit($this->limit);
263    else $query->orderBy('created_at');
264    $this->comments = $query->execute();
265    $this->getResponse()->setHttpHeader('content-type', 'text/plain');
266  }
267
268  public function executeList(sfWebRequest $request) {
269    $this->commentaires = Doctrine::getTable('Commentaire')->createQuery('c')
270      ->leftJoin('c.Objects co')
271      ->andWhere('is_public = 1')
272      ->orderBy('created_at DESC');
273    $this->titre = 'Les derniers commentaires';
274    $this->url_link = '';
275    if ($slug = $request->getParameter('slug')) {
276      $this->type = 'Parlementaire';
277      $this->object = Doctrine::getTable('Parlementaire')->findOneBySlug($slug);
278      $this->presentation = 'noauteur';
279      $this->linkrss = '@parlementaire_rss_commentaires?slug='.$slug;
280      $this->titre .= ' sur l\'activité';
281    } else if ($id = $request->getParameter('id')) {
282      $this->type = 'Section';
283      $this->object = Doctrine::getTable('Section')->find($id);
284      $this->presentation = 'nodossier';
285      $this->linkrss = '@section_rss_commentaires?id='.$id;
286      $this->url_link = '@section?id=';
287    } else if ($loi = $request->getParameter('loi')) {
288      $this->type = 'TitreLoi';
289      $this->object = Doctrine::getTable('TitreLoi')->findLoi($loi);
290      $this->presentation = 'noloi';
291      $this->linkrss = '@loi_rss_commentaires?loi='.$loi;
292      $this->url_link = '@loi?loi=';
293    } else {
294      $this->type = 'all';
295      $this->linkrss = '@commentaires_rss';
296      $this->presentation = '';
297    }
298    if ($this->type != 'all') {
299      $this->forward404Unless($this->object);
300      if ($this->type != 'Parlementaire') {
301        $this->titre .= ' sur '.$this->object->titre;
302        if ($this->type == 'Section')
303          $this->url_link .= $this->object->id;
304        else if ($this->type == 'TitreLoi')
305          $this->url_link .= $this->object->texteloi_id;
306      }
307      $this->commentaires->andWhere('co.object_type = ?', $this->type)
308        ->andWhere('co.object_id = ?', $this->object->id);
309    }
310    if ($request->getParameter('rss')) {
311      if ($this->type == 'all') $this->titre .= ' de NosDéputés.fr';
312      $this->comments = $this->commentaires->limit(10)->execute();
313      $this->setTemplate('rss');
314      $this->feed = new sfRssFeed();
315    } else {
316      $request->setParameter('rss', array(array('link' => $this->link, 'title'=>'Les derniers commentaires en RSS')));
317      if ($this->type == 'Parlementaire')
318        $this->response->setTitle($this->titre.' de '.$this->object->nom.' - NosDéputés.fr');
319      else $this->response->setTitle(strip_tags($this->titre).' - NosDéputés.fr');
320    }
321
322  }
323  public function executeWidget() {
324    $this->setLayout(false);
325  }
326
327}
Note: See TracBrowser for help on using the repository browser.