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

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

Mieux comme ca

File size: 8.7 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      $jours_max = 90; // Seuil en nb de jours qui détermine l'affichage par jour ou par mois
128     
129      $comp_date_from = explode("T", $from);
130      $comp_date_from = explode("-", $comp_date_from[0]);
131      $comp_date_from = mktime(0, 0, 0, $comp_date_from[1] + 1, $comp_date_from[2], $comp_date_from[0]);
132      $comp_date_from = date("Y-m-d", $comp_date_from).'T00:00:00Z';
133     
134      // Affichage d'un jour
135      if($from == $to) {
136        $period = 'DAY'; 
137        $this->vue = 'ce jour'; 
138      }
139      // Affichage d'un mois
140      if($comp_date_from == $to) {
141        $period = 'DAY';
142        $this->vue = 'le mois de';
143      }
144      // Affichage d'une période
145      if(($nbjours < $jours_max) and ($from != $to) and ($comp_date_from != $to)) { 
146        $period = 'DAY';
147        $to = $to.'+1DAY';
148        $this->vue = 'par jour';
149      } 
150      if($nbjours > $jours_max) { 
151        $period = 'MONTH';
152        $to = $to.'+1MONTH';
153        $this->vue = 'par mois';
154      }
155     
156      $query .= ' date:['.$from.' TO '.$to.']';
157      $params['facet.date.start'] = $from;
158      $params['facet.date.end'] = $to;
159      $params['facet.date.gap'] = '+1'.$period;
160    }
161   
162    $this->start = $params['facet.date.start'];
163    $this->end = $params['facet.date.end'];
164
165    try {
166      $s = new SolrConnector();
167      $results = $s->search($query, $params, $deb, $nb);
168    }
169    catch(Exception $e) {
170      $results = array('response' => array('docs' => array(), 'numFound' => 0));
171      $this->getUser()->setFlash('error', 'Désolé, le moteur de recherche est indisponible pour le moment');
172    }
173   
174    //Reconstitut les résultats
175    $this->results = $results['response'];
176    for($i = 0 ; $i < count($this->results['docs']) ; $i++) {
177      $res = $this->results['docs'][$i];
178      $obj = $res['object'];
179      $this->results['docs'][$i]['link'] = $obj->getLink();
180      $this->results['docs'][$i]['photo'] = $this->getPhoto($obj);
181      $this->results['docs'][$i]['titre'] = $obj->getTitre();
182      $this->results['docs'][$i]['personne'] = $obj->getPersonne();
183      if (isset($results['highlighting'][$res['id']]['text'])) {
184        $high_res = array();
185        foreach($results['highlighting'][$res['id']]['text'] as $h) {
186          $h = preg_replace('/.*=/', '', $h); 
187          array_push($high_res, $h);
188        }
189        $this->results['docs'][$i]['highlighting'] = preg_replace('/^'."$this->results['docs'][$i]['personne']".'/', '', implode('...', $high_res));
190      } 
191      else $this->results['docs'][$i]['highlighting'] = '';
192    }
193   
194    $this->results['end'] = $deb + $nb;
195    $this->results['page'] = $deb/$nb + 1;
196    if ($this->results['end'] > $this->results['numFound'] && $this->results['numFound']) {
197      $this->results['end'] = $this->results['numFound'] + 1;
198    }
199
200    //Prépare les facets
201    $this->facet['parlementaire']['prefix'] = 'parlementaire=';
202    $this->facet['parlementaire']['facet_field'] = 'tag';
203    $this->facet['parlementaire']['name'] = 'Parlementaire';
204
205    if (isset($results['facet_counts'])) {
206      $this->facet['type']['prefix'] = '';
207      $this->facet['type']['facet_field'] = 'object_name';
208      $this->facet['type']['name'] = 'Types';
209      $this->facet['type']['values'] = $results['facet_counts']['facet_fields']['object_name'];
210     
211      $tags = $results['facet_counts']['facet_fields']['tag'];
212      $this->facet['tag']['prefix'] = '';
213      $this->facet['tag']['facet_field'] = 'tag';
214      $this->facet['tag']['name'] = 'Tags';
215      foreach($tags as $tag => $nb ) {
216        if (!$nb)
217        continue;
218        if (!preg_match('/=/', $tag))
219          $this->facet['tag']['values'][$tag] = $nb;
220        if (preg_match('/^parlementaire=(.*)/', $tag, $matches)) {
221          $this->facet['parlementaire']['values'][$matches[1]] = $nb;
222        }
223      }
224    }
225   
226    if (!$results['response']['numFound']) {
227      if ($format)
228      return ;
229      return $this->setTemplate('noresults');
230    }
231    $this->fdates = array();
232    $this->fdates['max'] = 1;
233    foreach($results['facet_counts']['facet_dates']['date'] as $date => $nb) {
234      if (preg_match('/^20/', $date)) {
235        $pc = $nb/$results['response']['numFound'];
236        $this->fdates['values'][$date] = array('nb' => $nb, 'pc' => $pc);
237        if ($this->fdates['max'] < $pc) {
238          $this->fdates['max'] = $pc;
239        }
240      }
241    }
242  }
243 
244  public function executeRedirect(sfWebRequest $request)
245  {
246    $add = '';
247    if ($p = $request->getParameter('format')) {
248      $add .= '&format='.$p;
249    }
250    if ($p = $request->getParameter('object_name')) {
251      $add .= '&object_name='.$p;
252    }
253    if ($p = $request->getParameter('slug')) {
254      $add .= '&tag=parlementaire='.preg_replace('/\-/', '+', $p);
255    }
256    return $this->redirect('solr/search?query='.$request->getParameter('query').$add);
257  }
258}
Note: See TracBrowser for help on using the repository browser.