source: cpc/trunk/project/apps/frontend/modules/solr/actions/actions.class.php @ 1648

Last change on this file since 1648 was 1648, checked in by roux, 10 years ago

titre rss comments deputes

File size: 10.0 KB
Line 
1<?php
2
3/**
4 * solr actions.
5 *
6 * @package    cpc
7 * @subpackage solr
8 * @author     Your name here
9 * @version    SVN: $Id: actions.class.php 12479 2008-10-31 10:54:40Z fabien $
10 */
11class solrActions extends sfActions
12{
13
14  private function getPhoto($obj) {
15    sfProjectConfiguration::getActive()->loadHelpers(array('Url')); 
16    switch(get_class($obj)) {
17    case 'Intervention':
18      if ($obj->getParlementaire()->__toString()) {
19        return $this->getPartial('parlementaire/photoParlementaire', array('parlementaire'=>$obj->getParlementaire(), 'height'=>70));
20      }
21    case 'QuestionEcrite':
22      return $this->getPartial('parlementaire/photoParlementaire', array('parlementaire'=>$obj->getParlementaire(), 'height'=>70));
23    case 'Amendement':
24      return '';
25    case 'Parlementaire':
26      return $this->getPartial('parlementaire/photoParlementaire', array('parlementaire'=>$obj, 'height'=>70));
27    case 'Commentaire':
28      return '<img width="53" class="jstitle" title="'.$obj->getCitoyen()->getLogin().'" alt="'.$obj->getCitoyen()->getLogin().'" src="'.url_for('@photo_citoyen?slug='.$obj->getCitoyen()->getSlug()).'"/>';
29    case 'Citoyen':
30      return '<img width="53" class="jstitle" title="'.$obj->getLogin().'" alt="'.$obj->getLogin().'" src="'.url_for('@photo_citoyen?slug='.$obj->getSlug()).'"/>';
31    case 'NonObjectPage':
32      return $obj->getImage();
33    }
34  }
35 /**
36  * Executes index action
37  *
38  * @param sfRequest $request A request object
39  */
40  public function executeSearch(sfWebRequest $request)
41  {
42    if ($search = $request->getParameter('search')) {
43      if ($ob = $request->getParameter('object_name'))
44        $ob = '&object_name='.$ob;
45      return $this->redirect('solr/search?query='.$search.$ob);
46    }
47    $this->query = $request->getParameter('query');
48   
49    $query = preg_replace('/\*/', '', $this->query);
50
51    if (!strlen($query)) {
52      $query = '*';
53    }
54
55    $nb = 20;
56    $deb = ($request->getParameter('page', 1) - 1) * $nb ;
57    $fq = '';
58    $this->facet = array();
59
60    $this->selected = array();
61    if ($on = $request->getParameter('object_name')) {
62      $this->selected['object_name'][$on] = 1;
63      $fq .= " object_name:$on";
64    }
65    if ($tags = $request->getParameter('tag')) {
66      foreach(explode(',', $tags) as $tag) {
67        $this->selected['tag'][$tag] = 1;
68        $fq .= ' tag:"'.$tag.'"';
69      }
70    }
71
72    //Récupère les résultats auprès de SolR
73    $params = array('hl'=>'true', 'fl' => 'id,object_id,object_name,date,description', 'hl.fragsize'=>500, "facet"=>"true", "facet.field"=>array("object_name","tag"), "facet.date" => "date", "facet.date.start"=>"2007-05-01T00:00:00Z", "facet.date.end"=>"NOW", "facet.date.gap"=>"+1MONTH", 'fq' => $fq, "facet.date.include" => "edge");
74    $this->sort_type = 'pertinence';
75
76    $this->sort = $request->getParameter('sort');
77    $this->ajax = $request->getParameter('ajax');
78    $date = $request->getParameter('date');
79    $format = $request->getParameter('format');
80
81    $this->tags = 0;
82    if ($format) {
83      sfConfig::set('sf_web_debug', false);
84      $this->tags = $request->getParameter('tags');
85      $this->format = $format;
86    }
87
88    $this->title = $request->getParameter('title');
89
90    if ($format == 'rss') {
91      $ob = $request->getParameter('object_name');
92      $deputenom = $request->getParameter('deputenom');
93      if (preg_match('/commentaire/i', $ob) && $deputenom)
94        $this->rsstitle = "Les derniers commentaires sur l'activité parlementaire de ".$deputenom;
95      $this->setTemplate('rss');
96      $this->feed = new sfRssFeed();
97      $this->feed->setLanguage('fr');
98      $this->sort = 1;
99      $date = null;
100      $from = null;
101    }
102
103    if ($format == 'json') {
104      $this->getResponse()->setContentType('text/plain; charset=utf-8');
105      $this->setTemplate('json');
106      $this->setLayout(false);
107    }
108
109    if ($format == 'xml') {
110      $this->getResponse()->setContentType('text/xml; charset=utf-8');
111      $this->setTemplate('xml');
112      $this->setLayout(false);
113    }
114
115    if ($format == 'csv') {
116      // $this->getResponse()->setContentType('application/csv; charset=utf-8');
117      $this->getResponse()->setContentType('text/plain; charset=utf-8');
118      $this->setTemplate('csv');
119      $this->setLayout(false);
120    }
121
122    if ($this->sort) {
123      $this->selected['sort'] = 1;
124      $params['sort'] = "date desc";
125      $this->sort_type = 'date';
126    }
127   
128    $this->vue = 'par_mois';
129   
130    $period = '';
131
132    if ($date) {
133      $this->selected['date'][$date] = $date;
134      if (preg_match('/\d{8}/',$date)) {
135        $date = preg_replace('/(\d{4})(\d{2})(\d{2})/', '\1-\2-\3T00:00:00Z', $date);
136      }
137      $dates = explode(',', $date);
138      list($from, $to) = $dates;
139     
140      $nbjours = round((strtotime($to) - strtotime($from))/(60*60*24)-1);
141      $jours_max = 90; // Seuil en nb de jours qui détermine l'affichage par jour ou par mois d'une période
142     
143      $comp_date_from = explode("T", $from);
144      $comp_date_from = explode("-", $comp_date_from[0]);
145      $comp_date_from = mktime(0, 0, 0, $comp_date_from[1] + 1, $comp_date_from[2], $comp_date_from[0]);
146      $comp_date_from = date("Y-m-d", $comp_date_from).'T00:00:00Z';
147     
148      // Affichage d'une période
149      if(($nbjours < $jours_max) and ($from != $to) and ($comp_date_from != $to)) { 
150        $period = 'DAY';
151        $this->vue = 'par_jour';
152      } 
153      if($nbjours > $jours_max) { 
154        $period = 'MONTH';
155        $to = $to.'+1MONTH';
156        $this->vue = 'par_mois';
157      }
158      // Affichage d'un jour
159      if($from == $to) {
160        $period = 'DAY';
161        $this->vue = 'jour'; 
162      }
163      // Affichage d'un mois
164      if($comp_date_from == $to) {
165        $period = 'DAY';
166        $this->vue = 'mois';
167      }
168     
169      if ($period == 'DAY') {
170        $from = date ('Y-m-d', strtotime($from)-(3600*2+1)).'T23:59:59Z';
171      }
172
173      $query .= ' date:['.$from.' TO '.$to.']';
174      $params['facet.date.start'] = $from;
175      $params['facet.date.end'] = $to;
176      $params['facet.date.gap'] = '+1'.$period;
177    }
178   
179    $this->start = $params['facet.date.start'];
180    if ($period == 'DAY') {
181      $this->start = date ('Ymd', strtotime($this->start)+1);
182    }
183    $this->end = $params['facet.date.end'];
184    if($this->end == 'NOW') { 
185      $this->end = date("Ymd"); 
186    }
187
188
189    try {
190      $s = new SolrConnector();
191      $results = $s->search($query, $params, $deb, $nb);
192    }
193    catch(Exception $e) {
194      $results = array('response' => array('docs' => array(), 'numFound' => 0));
195      $this->getUser()->setFlash('error', 'Désolé, le moteur de recherche est indisponible pour le moment');
196    }
197   
198    if  (!$format && count($results['response']['docs']) == 1 && $results['response']['docs'][0]['object_name'] == 'Parlementaire') {
199      return $this->redirect($results['response']['docs'][0]['object']->getLink());
200    }
201
202    //Reconstitut les résultats
203    $this->results = $results['response'];
204    for($i = 0 ; $i < count($this->results['docs']) ; $i++) {
205      $res = $this->results['docs'][$i];
206      $obj = $res['object'];
207      $this->results['docs'][$i]['link'] = $obj->getLink();
208      $this->results['docs'][$i]['photo'] = $this->getPhoto($obj);
209      $this->results['docs'][$i]['titre'] = $obj->getTitre();
210      $this->results['docs'][$i]['personne'] = $obj->getPersonne();
211      if (isset($results['highlighting'][$res['id']]['text'])) {
212        $high_res = array();
213        foreach($results['highlighting'][$res['id']]['text'] as $h) {
214          $h = preg_replace('/.*=/', '', $h); 
215          array_push($high_res, $h);
216        }
217        $this->results['docs'][$i]['highlighting'] = preg_replace('/^'."$this->results['docs'][$i]['personne']".'/', '', implode('...', $high_res));
218      } 
219      else $this->results['docs'][$i]['highlighting'] = $this->results['docs'][$i]['description'];
220    }
221   
222    $this->results['end'] = $deb + $nb;
223    $this->results['page'] = $deb/$nb + 1;
224    if ($this->results['end'] > $this->results['numFound'] && $this->results['numFound']) {
225      $this->results['end'] = $this->results['numFound'] + 1;
226    }
227
228    if (isset($results['facet_counts'])) {
229      $this->facet['type']['prefix'] = '';
230      $this->facet['type']['facet_field'] = 'object_name';
231      $this->facet['type']['name'] = 'Types';
232      $this->facet['type']['values'] = $results['facet_counts']['facet_fields']['object_name'];
233     
234      //Prépare les facets des parlementaires
235      $this->facet['parlementaires']['prefix'] = 'parlementaire=';
236      $this->facet['parlementaires']['facet_field'] = 'tag';
237      $this->facet['parlementaires']['name'] = 'Parlementaires';
238     
239      $tags = $results['facet_counts']['facet_fields']['tag'];
240      $this->facet['tag']['prefix'] = '';
241      $this->facet['tag']['facet_field'] = 'tag';
242      $this->facet['tag']['name'] = 'Tags';
243      foreach($tags as $tag => $nb ) {
244        if (!$nb)
245        continue;
246        if (!preg_match('/=/', $tag))
247          $this->facet['tag']['values'][$tag] = $nb;
248        if (preg_match('/^parlementaire=(.*)/', $tag, $matches)) {
249          $this->facet['parlementaires']['values'][$matches[1]] = $nb;
250        }
251      }
252    }
253   
254    if (!$results['response']['numFound']) {
255      if ($format)
256      return ;
257      return $this->setTemplate('noresults');
258    }
259    $this->fdates = array();
260    $this->fdates['max'] = 1;
261    foreach($results['facet_counts']['facet_dates']['date'] as $date => $nb) {
262      if ($period == 'DAY') {
263        $date = date ('Ymd', strtotime($date)+1);
264      }else{
265        $date = date ('Ymd', strtotime($date));
266      }
267      if (preg_match('/^20/', $date)) {
268        $pc = $nb/$results['response']['numFound'];
269        $this->fdates['values'][$date] = array('nb' => $nb, 'pc' => $pc);
270        if ($this->fdates['max'] < $pc) {
271          $this->fdates['max'] = $pc;
272        }
273      }
274    }
275  }
276 
277  public function executeRedirect(sfWebRequest $request)
278  {
279    if ($p = $request->getParameter('slug')) {
280      $parlementaire = Doctrine::getTable('Parlementaire')->findOneBySlug($p);
281      $request->setParameter('tag', 'parlementaire='.$parlementaire);
282      $request->setParameter('deputenom', $parlementaire->getNom());
283    }
284
285    return $this->forward('solr', 'search');
286  }
287}
Note: See TracBrowser for help on using the repository browser.