source: cpc/trunk/project/lib/model/solr/SolrListener.php @ 1369

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

Correction bug index_if
+ clarification des droits sur le log solr

File size: 3.8 KB
Line 
1<?php
2
3class SolrListener extends Doctrine_Record_Listener
4{
5  /**
6     * Array of timestampable options
7     *
8     * @var string
9     */
10    protected $_options = array();
11
12    private $command = null;
13
14    /**
15     * __construct
16     *
17     * @param string $options
18     * @return void
19     */
20    public function __construct($options)
21    {
22      $this->_options = $options;
23    }
24
25    protected $solr = NULL;
26    protected function getSolrConnector() {
27      if (!$this->solr)
28        $this->solr = new SolrConnector($this->_options);
29      return $this->solr;
30    }
31
32    private function get_and_strip($obj, $field) {
33      $f = $obj->get($field);
34      if ($f) {
35      if (get_class($f) && ! $f->id)
36        return ;
37      return strip_tags($f);
38    }
39    return ;
40  }
41
42  private function getObjFieldsValue($obj, $fields)
43  {
44    if (!is_array($fields)) {
45      return $this->get_and_strip($obj, $fields);
46    }
47    $s = '';
48    foreach($fields as $f) {
49      $s .= $this->get_and_strip($obj, $f).' ';
50    }
51    return $s;
52  }
53 
54  private function getLuceneObjId($obj) 
55  {
56    return get_class($obj).'/'.$obj->getId();
57  }
58 
59  // Réindexation après une création / modification
60  public function postSave(Doctrine_Event $event)
61  {
62    $obj = $event->getInvoker();
63
64    $t = null;
65    if (isset( $this->_options['index_if']) && $t = $this->_options['index_if'] && $t && !$obj->get($t))
66      return ;
67   
68    $json = array();
69    $json['id'] = $this->getLuceneObjId($obj);
70    $json['object_id'] =  $obj->getId();
71    $json['object_name'] = get_class($obj);
72   
73    if (isset($this->_options['description']) && $t = $this->_options['description']) {
74      $content = $this->getObjFieldsValue($obj, $t);
75      $wordcount = str_word_count($content);
76    }
77   
78    if (isset($this->_options['extra_weight'])) 
79      $extra_weight = $this->_options['extra_weight'];
80    else
81      $extra_weight = 1;
82
83    if (isset($this->_options['devaluate_if_wordcount_under']) && ($wclimit = $this->_options['devaluate_if_wordcount_under'])) {
84       if ($wclimit > $wordcount)
85         $extra_weight *=  0.5 ;
86    }
87   
88    // On donne un poids plus important au titre
89    if (isset($this->_options['title']) && $t = $this->_options['title']) {
90      $json['title']['content'] = $this->getObjFieldsValue($obj, $t);
91      $json['title']['weight'] =  1.2 * $extra_weight;
92    }
93   
94    // La description
95    if (isset($content)) {
96      $json['description']['content'] = $content;
97      $json['description']['weight'] = $extra_weight;
98      $json['wordcount'] = $wordcount;
99    }
100     
101    // par default la date est la created_at
102    if (!isset($this->_options['date']) || !($t = $this->_options['date'])) {
103      $t = 'created_at';
104    }
105    $d = preg_replace('/\+.*/', 'Z', date('c', strtotime($this->getObjFieldsValue($obj, $t))));
106    $json['date']['content'] = $d;
107    $json['date']['weight'] = $extra_weight;
108   
109
110    $json['tags']['content'] = array();
111    try {
112      foreach($obj->getTags() as $tag) if ($tag)  {
113        $json['tags']['content'][] =  preg_replace('/:/', '=', $tag);
114      }
115    }catch (Exception $e) {}
116   
117    if (isset($this->_options['moretags']) && $t = $this->_options['moretags']) {
118      if (!is_array($t)) {
119        $s = $this->get_and_strip($obj, $t);
120        if ($s)
121          $json['tags']['content'][] = $t.'='.$s;
122      }else{
123        foreach ($t as $i) {
124          $s = $this->get_and_strip($obj, $i);
125          if (strlen($s)) {
126            $s = strip_tags($s);
127            $json['tags']['content'][] = $i.'='.$s;
128          }
129        }
130      }
131    }
132   
133    $json['tags']['weight'] = $extra_weight;
134   
135    SolrCommands::getInstance()->addCommand('UPDATE', $json);
136  }
137 
138  // Désindexation après une suppression
139  public function postDelete(Doctrine_Event $event)
140  {
141    $obj = $event->getInvoker();
142    $json = new stdClass();
143    $json->id = $this->getLuceneObjId($obj);
144    SolrCommands::getInstance()->addCommand('DELETE', $json);
145  }
146 
147}
Note: See TracBrowser for help on using the repository browser.