fae9748dac6a0fa75a9e283df03233b43c216a8f
[tine20] / tine20 / Tinebase / Model / Filter / Path.php
1 <?php
2 /**
3  * Tine 2.0
4  * 
5  * @package     Tinebase
6  * @subpackage  Filter
7  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
8  * @copyright   Copyright (c) 2016-2017 Metaways Infosystems GmbH (http://www.metaways.de)
9  * @author      Philipp Schüle <p.schuele@metaways.de>
10  */
11
12 /**
13  * Tinebase_Model_Filter_Path
14  * 
15  * filters own ids match result of path search
16  * 
17  * <code>
18  *      'contact'        => array('filter' => 'Tinebase_Model_Filter_Path', 'options' => array(
19  *      )
20  * </code>     
21  * 
22  * @package     Tinebase
23  * @subpackage  Filter
24  */
25 class Tinebase_Model_Filter_Path extends Tinebase_Model_Filter_Text
26 {
27     protected $_controller = null;
28
29     /**
30      * @var array
31      */
32     protected $_pathRecordIds = null;
33
34     /**
35      * get path controller
36      * 
37      * @return Tinebase_Record_Path
38      */
39     protected function _getController()
40     {
41         if ($this->_controller === null) {
42             $this->_controller = Tinebase_Record_Path::getInstance();
43         }
44         
45         return $this->_controller;
46     }
47     
48     /**
49      * appends sql to given select statement
50      *
51      * @param Zend_Db_Select                $_select
52      * @param Tinebase_Backend_Sql_Abstract $_backend
53      */
54     public function appendFilterSql($_select, $_backend)
55     {
56         if (true !== Tinebase_Config::getInstance()->featureEnabled(Tinebase_Config::FEATURE_SEARCH_PATH) ||
57             empty($this->_value)) {
58             $_select->where('1=1');
59             return;
60         }
61
62         $modelName = $_backend->getModelName();
63         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' 
64             . 'Adding Path filter for: ' . $modelName);
65         
66         $this->_resolvePathIds($modelName);
67
68         $idField = (isset($this->_options['idProperty']) || array_key_exists('idProperty', $this->_options)) ? $this->_options['idProperty'] : 'id';
69         $db = $_backend->getAdapter();
70         $qField = $db->quoteIdentifier($_backend->getTableName() . '.' . $idField);
71         if (empty($this->_pathRecordIds)) {
72             $_select->where('1=0');
73         } else {
74             $_select->where($db->quoteInto("$qField IN (?)", $this->_pathRecordIds));
75         }
76     }
77     
78     /**
79      * resolve foreign ids
80      */
81     protected function _resolvePathIds($_model)
82     {
83         if (! is_array($this->_pathRecordIds)) {
84             // TODO this should be improved if it turns out to be a performance issue:
85             //  we only need the record_ids here and not complete records, so we could directly use the path sql backend
86             //  and just request the property we need
87             $this->_pathRecordIds = $this->_getController()->search(new Tinebase_Model_PathFilter(array(
88                 array('field' => 'query', 'operator' => $this->_operator, 'value' => $this->_value)
89             )))->__call('getRecordIdsOfModel', array($_model));
90         }
91
92         if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' foreign ids: ' 
93             . print_r($this->_pathRecordIds, TRUE));
94     }
95 }