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

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

La mécanique des alertes mails :
Dans la table alerte :

  • query : est la query solr correspondant à l'alerte (mot clé et/ou filtre)
  • last_mail : la date du dernier object envoyé (soit du dernier envoi mais ca permet de ne pas rater d'object), ces changements de date sont générés par la tache d'envoi, il faut donc justr l'initialiser à la création avec la date courrante
  • titre : soit les mots clés soit une explication textuelle de l'alerte (pour les alertes complexe, genre « commentaire en réponse à votre commentaire du 10 juin »)

pour la query les filtres peuvent être :
object_name:<Table>
object_id:<tupple_id>
ou des tags
tag:<nom_tag>

un certains nombre de tags sont autogérés. Pour les commentaires, par exemple, la référence à l'object est généré par tag.
Pour s'abonner aux commentaires en réponse à Intervention/XXX car donne la query :
tag:object_type=Intervention tag:object_id=XXX

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