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

Last change on this file since 1317 was 1317, checked in by teymour, 10 years ago

Presentation des résultats de recherche solr

File size: 6.1 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 getLink($obj) {
15    sfProjectConfiguration::getActive()->loadHelpers(array('Url'));
16    switch(get_class($obj)) {
17    case 'Intervention':
18      return url_for('@interventions_seance?seance='.$obj->getSeance()->id).'#inter_'.$obj->getMd5();
19    case 'QuestionEcrite':
20      return url_for('@question_numero?numero='.$obj->numero);
21    case 'Amendement':
22      return url_for('@amendement?loi='.$obj->loi.'&numero='.$obj->numero);
23    case 'Parlementaire':
24      return url_for('@parlementaire?slug='.$obj->slug);
25    case 'Commentaire':
26      return $obj->lien;
27    }
28  }
29  private function getPersonne($obj) {
30    sfProjectConfiguration::getActive()->loadHelpers(array('Url'));
31    switch(get_class($obj)) {
32    case 'Intervention':
33      return $obj->getIntervenant()->getNom();
34    case 'QuestionEcrite':
35      return $obj->getParlementaire()->getNom();
36    case 'Amendement':
37      return '';
38    case 'Parlementaire':
39      return '';
40    case 'Commentaire':
41      return $obj->getCitoyen()->getLogin();
42    }
43  }
44  private function getPhoto($obj) {
45    sfProjectConfiguration::getActive()->loadHelpers(array('Url'));
46    switch(get_class($obj)) {
47    case 'Intervention':
48      if ($obj->getParlementaire())
49        return url_for('@resized_photo_parlementaire?height=70&slug='.$obj->getIntervenant()->getSlug());
50      return '';
51    case 'QuestionEcrite':
52      return url_for('@resized_photo_parlementaire?height=70&slug='.$obj->getParlementaire()->getSlug());
53    case 'Amendement':
54      return '';
55    case 'Parlementaire':
56      return url_for('@resized_photo_parlementaire?height=70&slug='.$obj->getSlug());
57    case 'Commentaire':
58      return url_for('@photo_citoyen?slug='.$obj->getCitoyen()->getSlug());
59    }
60  }
61 /**
62  * Executes index action
63  *
64  * @param sfRequest $request A request object
65  */
66  public function executeSearch(sfWebRequest $request)
67  {
68    if ($search = $request->getParameter('search')) {
69      return $this->redirect('solr/search?query='.$search);
70    }
71    $this->query = $request->getParameter('query');
72   
73    $query = preg_replace('/\*/', '', $this->query);
74
75    if (!strlen($query)) {
76      $query = '*';
77    }
78
79    $nb = 20;
80    $deb = ($request->getParameter('page', 1) - 1) * $nb ;
81    $fq = '';
82    $this->facet = array();
83
84    $this->selected = array();
85    if ($on = $request->getParameter('object_name')) {
86      $this->selected['object_name'][$on] = 1;
87      $fq .= " object_name:$on";
88    }
89    if ($tags = $request->getParameter('tag')) {
90      foreach(explode(',', $tags) as $tag) {
91        $this->selected['tag'][$tag] = 1;
92        $fq .= ' tag:"'.$tag.'"';
93      }
94    }
95    //Récupère les résultats auprès de SolR
96    $s = new SolrConnector();
97    $params = array('hl'=>'true', 'fl' => 'id,object_id,object_name', '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);
98    $this->sort_type = 'pertinence';
99    if ($request->getParameter('sort')) {
100      $params['sort'] = "date desc";
101      $this->sort_type = 'date';
102    }
103    if ($date = $request->getParameter('date')) {
104      $dates = explode(',', $date);
105      $date = array_pop($dates);
106      $period = 'MONTH';
107      if (count($dates) == 1)
108        $period = 'DAY';
109      $query .= ' date:['.$date.' TO '.$date.'+1'.$period.']';
110      $this->selected['date'][$date] = 1;
111      $params['facet.date.start']=$date;
112      $params['facet.date.end'] = $date.'+1'.$period;
113      $params['facet.date.gap'] = '+1DAY';
114    }
115    $results = $s->search($query, $params, $deb, $nb);
116    //Reconstitut les résultats
117    $this->results = $results['response'];
118    for($i = 0 ; $i < count($this->results['docs']) ; $i++) {
119      $res = $this->results['docs'][$i];
120      $obj = Doctrine::getTable($res['object_name'])->find($res['object_id']);
121      $this->results['docs'][$i]['link'] = $this->getLink($obj);
122      $this->results['docs'][$i]['photo'] = $this->getPhoto($obj);
123      $this->results['docs'][$i]['titre'] = $obj->getTitre();
124      $this->results['docs'][$i]['personne'] = $this->getPersonne($obj);
125      $this->results['docs'][$i]['highlighting'] = preg_replace('/^'.$this->results['docs'][$i]['personne'].'/', '', implode('...', $results['highlighting'][$res['id']]['text']));
126     
127    }
128    $this->results['end'] = $deb + $nb;
129    $this->results['page'] = $deb/$nb + 1;
130    if ($this->results['end'] > $this->results['numFound']) {
131      $this->results['end'] = $this->results['numFound'] + 1;
132    }
133
134    //Prépare les facets
135    $this->facet['parlementaire']['prefix'] = 'parlementaire=';
136    $this->facet['parlementaire']['facet_field'] = 'tag';
137    $this->facet['parlementaire']['name'] = 'Parlementaire';
138
139    $this->facet['type']['prefix'] = '';
140    $this->facet['type']['facet_field'] = 'object_name';
141    $this->facet['type']['name'] = 'Types';
142    $this->facet['type']['values'] = $results['facet_counts']['facet_fields']['object_name'];
143
144    $tags = $results['facet_counts']['facet_fields']['tag'];
145    $this->facet['tag']['prefix'] = '';
146    $this->facet['tag']['facet_field'] = 'tag';
147    $this->facet['tag']['name'] = 'Tags';
148    foreach($tags as $tag => $nb ) {
149      if (!$nb)
150        continue;
151      if (!preg_match('/=/', $tag))
152        $this->facet['tag']['values'][$tag] = $nb;
153      if (preg_match('/^parlementaire=(.*)/', $tag, $matches)) {
154        $this->facet['parlementaire']['values'][$matches[1]] = $nb;
155      }
156    }
157    if (!$results['response']['numFound']) {
158      $this->setTemplate('noresults');
159    }else{
160      $this->fdates = array();
161      $this->fdates['max'] = 1;
162      foreach($results['facet_counts']['facet_dates']['date'] as $date => $nb) {
163        if (preg_match('/^20/', $date)) {
164          $pc = $nb/$results['response']['numFound'];
165          $this->fdates['values'][$date] = array('nb' => $nb, 'pc' => $pc);
166          if ($this->fdates['max'] < $pc) {
167            $this->fdates['max'] = $pc;
168          }
169        }
170      }
171    }
172  }
173}
Note: See TracBrowser for help on using the repository browser.