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

Last change on this file since 1530 was 1530, checked in by popeye, 11 years ago

Nouvelle gestion des dates (casse la recherche mais pas pour longtemps)

File size: 8.5 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" src="'.url_for('@photo_citoyen?slug='.$obj->getCitoyen()->getSlug()).'"/>';
29    case 'Citoyen':
30      return '<img width="53" src="'.url_for('@photo_citoyen?slug='.$obj->getSlug()).'"/>';
31    }
32  }
33 /**
34  * Executes index action
35  *
36  * @param sfRequest $request A request object
37  */
38  public function executeSearch(sfWebRequest $request)
39  {
40    if ($search = $request->getParameter('search')) {
41      return $this->redirect('solr/search?query='.$search);
42    }
43    $this->query = $request->getParameter('query');
44   
45    $query = preg_replace('/\*/', '', $this->query);
46
47    if (!strlen($query)) {
48      $query = '*';
49    }
50
51    $nb = 20;
52    $deb = ($request->getParameter('page', 1) - 1) * $nb ;
53    $fq = '';
54    $this->facet = array();
55
56    $this->selected = array();
57    if ($on = $request->getParameter('object_name')) {
58      $this->selected['object_name'][$on] = 1;
59      $fq .= " object_name:$on";
60    }
61    if ($tags = $request->getParameter('tag')) {
62      foreach(explode(',', $tags) as $tag) {
63              $this->selected['tag'][$tag] = 1;
64              $fq .= ' tag:"'.$tag.'"';
65      }
66    }
67    //Récupère les résultats auprès de SolR
68    $params = array('hl'=>'true', 'fl' => 'id,object_id,object_name,date', '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);
69    $this->sort_type = 'pertinence';
70
71    $this->sort = $request->getParameter('sort');
72    $date = $request->getParameter('date');
73    $from = $request->getParameter('from');
74    $format = $request->getParameter('format');
75
76    $this->tags = 0;
77    if ($format) {
78      sfConfig::set('sf_web_debug', false);
79      $this->tags = $request->getParameter('tags');
80      $this->format = $format;
81    }
82
83    $this->title = $request->getParameter('title');
84
85    if ($format == 'rss') {
86      $this->setTemplate('rss');
87      $this->feed = new sfRssFeed();
88      $this->feed->setLanguage('fr');
89      $this->sort = 1;
90      $date = null;
91      $from = null;
92    }
93
94    if ($format == 'json') {
95      $this->getResponse()->setContentType('text/plain; charset=utf-8');
96      $this->setTemplate('json');
97      $this->setLayout(false);
98    }
99
100    if ($format == 'xml') {
101      $this->getResponse()->setContentType('text/xml; charset=utf-8');
102      $this->setTemplate('xml');
103      $this->setLayout(false);
104    }
105
106    if ($format == 'csv') {
107      //      $this->getResponse()->setContentType('application/csv; charset=utf-8');
108      $this->getResponse()->setContentType('text/plain; charset=utf-8');
109      $this->setTemplate('csv');
110      $this->setLayout(false);
111    }
112
113    if ($this->sort) {
114      $this->selected['sort'] = 1;
115      $params['sort'] = "date desc";
116      $this->sort_type = 'date';
117    }
118   
119    $this->vue = 'par mois';
120   
121    if ($date) {
122      $this->selected['date'][$date] = $date;
123      $dates = explode(',', $date);
124      list($from, $to) = $dates;
125     
126      $nbjours = round((strtotime($to) - strtotime($from))/(60*60*24)-1);
127     
128      $comp_date_from = explode("T", $from);
129      $comp_date_from = explode("-", $comp_date_from[0]);
130      $comp_date_from = mktime(0, 0, 0, $comp_date_from[1] + 1, $comp_date_from[2], $comp_date_from[0]);
131      $comp_date_from = date("Y-m-d", $comp_date_from);
132     
133      $period = 'DAY'; 
134      $this->vue = 'par jour';
135      $this->limit = $to;
136     
137      // Affichage d'un mois
138      if($comp_date_from.'T00:00:00Z' == $to) {
139        $period = 'DAY';
140        $this->vue = 'le mois de';
141      }
142      // Affichage d'une période
143      else if(($nbjours > 90) and ($from != $to)) { 
144        $period = 'MONTH'; 
145        $this->vue = 'par mois';
146      } 
147      // Affichage d'un jour
148      if($from == $to) {
149        $period = 'DAY'; 
150        $this->vue = 'ce jour'; 
151      }
152     
153      $query .= ' date:['.$from.' TO '.$to.']';
154      $params['facet.date.start'] = $from;
155            $params['facet.date.end'] = $to;
156      $params['facet.date.gap'] = '+1'.$period;
157    }
158   
159    $this->start = $params['facet.date.start'];
160    $this->end = $params['facet.date.end'];
161
162    try {
163      $s = new SolrConnector();
164      $results = $s->search($query, $params, $deb, $nb);
165    }
166    catch(Exception $e) {
167      $results = array('response' => array('docs' => array(), 'numFound' => 0));
168      $this->getUser()->setFlash('error', 'Désolé, le moteur de recherche est indisponible pour le moment');
169    }
170   
171    //Reconstitut les résultats
172    $this->results = $results['response'];
173    for($i = 0 ; $i < count($this->results['docs']) ; $i++) {
174      $res = $this->results['docs'][$i];
175      $obj = $res['object'];
176      $this->results['docs'][$i]['link'] = $obj->getLink();
177      $this->results['docs'][$i]['photo'] = $this->getPhoto($obj);
178      $this->results['docs'][$i]['titre'] = $obj->getTitre();
179      $this->results['docs'][$i]['personne'] = $obj->getPersonne();
180      if (isset($results['highlighting'][$res['id']]['text'])) {
181              $high_res = array();
182              foreach($results['highlighting'][$res['id']]['text'] as $h) {
183                $h = preg_replace('/.*=/', '', $h); 
184                array_push($high_res, $h);
185              }
186              $this->results['docs'][$i]['highlighting'] = preg_replace('/^'."$this->results['docs'][$i]['personne']".'/', '', implode('...', $high_res));
187      } 
188      else $this->results['docs'][$i]['highlighting'] = '';
189    }
190   
191    $this->results['end'] = $deb + $nb;
192    $this->results['page'] = $deb/$nb + 1;
193    if ($this->results['end'] > $this->results['numFound'] && $this->results['numFound']) {
194      $this->results['end'] = $this->results['numFound'] + 1;
195    }
196
197    //Prépare les facets
198    $this->facet['parlementaire']['prefix'] = 'parlementaire=';
199    $this->facet['parlementaire']['facet_field'] = 'tag';
200    $this->facet['parlementaire']['name'] = 'Parlementaire';
201
202    if (isset($results['facet_counts'])) {
203      $this->facet['type']['prefix'] = '';
204      $this->facet['type']['facet_field'] = 'object_name';
205      $this->facet['type']['name'] = 'Types';
206      $this->facet['type']['values'] = $results['facet_counts']['facet_fields']['object_name'];
207     
208      $tags = $results['facet_counts']['facet_fields']['tag'];
209      $this->facet['tag']['prefix'] = '';
210      $this->facet['tag']['facet_field'] = 'tag';
211      $this->facet['tag']['name'] = 'Tags';
212      foreach($tags as $tag => $nb ) {
213              if (!$nb)
214              continue;
215              if (!preg_match('/=/', $tag))
216                $this->facet['tag']['values'][$tag] = $nb;
217              if (preg_match('/^parlementaire=(.*)/', $tag, $matches)) {
218                $this->facet['parlementaire']['values'][$matches[1]] = $nb;
219              }
220      }
221    }
222   
223    if (!$results['response']['numFound']) {
224      if ($format)
225            return ;
226      return $this->setTemplate('noresults');
227    }
228    $this->fdates = array();
229    $this->fdates['max'] = 1;
230    foreach($results['facet_counts']['facet_dates']['date'] as $date => $nb) {
231      if (preg_match('/^20/', $date)) {
232              $pc = $nb/$results['response']['numFound'];
233              $this->fdates['values'][$date] = array('nb' => $nb, 'pc' => $pc);
234              if ($this->fdates['max'] < $pc) {
235                $this->fdates['max'] = $pc;
236              }
237      }
238    }
239  }
240 
241  public function executeRedirect(sfWebRequest $request)
242  {
243    $add = '';
244    if ($p = $request->getParameter('format')) {
245      $add .= '&format='.$p;
246    }
247    if ($p = $request->getParameter('object_name')) {
248      $add .= '&object_name='.$p;
249    }
250    if ($p = $request->getParameter('slug')) {
251      $add .= '&tag=parlementaire='.preg_replace('/\-/', '+', $p);
252    }
253    return $this->redirect('solr/search?query='.$request->getParameter('query').$add);
254  }
255}
Note: See TracBrowser for help on using the repository browser.