0011968: shared calendars filter leads to sql error with pgsql
[tine20] / tine20 / Tinebase / Model / Filter / ForeignId.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) 2009-2011 Metaways Infosystems GmbH (http://www.metaways.de)
9  * @author      Cornelius Weiss <c.weiss@metaways.de>
10  */
11
12 /**
13  * foreign id filter
14  * 
15  * Expects:
16  * - a filtergroup in options->filtergroup
17  * - a controller  in options->controller
18  * 
19  * Hands over all options to filtergroup
20  * Hands over AclFilter functions to filtergroup
21  *
22  * @package     Tinebase
23  * @subpackage  Filter
24  */
25 class Tinebase_Model_Filter_ForeignId extends Tinebase_Model_Filter_ForeignRecord
26 {
27     /**
28      * @var string class name of this filter group
29      *      this is needed to overcome the static late binding
30      *      limitation in php < 5.3
31      */
32     protected $_className = 'Tinebase_Model_Filter_ForeignId';
33     
34     /**
35      * get foreign controller
36      * 
37      * @return Tinebase_Controller_Record_Abstract
38      */
39     protected function _getController()
40     {
41         if ($this->_controller === NULL) {
42             $this->_controller = call_user_func($this->_options['controller'] . '::getInstance');
43         }
44         
45         return $this->_controller;
46     }
47     
48     /**
49      * set options 
50      *
51      * @param array $_options
52      */
53     protected function _setOptions(array $_options)
54     {
55         if (! (isset($_options['controller']) || array_key_exists('controller', $_options)) || ! (isset($_options['filtergroup']) || array_key_exists('filtergroup', $_options))) {
56             throw new Tinebase_Exception_InvalidArgument('a controller and a filtergroup must be specified in the options');
57         }
58         parent::_setOptions($_options);
59     }
60     
61     /**
62      * appends sql to given select statement
63      *
64      * @param Zend_Db_Select                $_select
65      * @param Tinebase_Backend_Sql_Abstract $_backend
66      */
67     public function appendFilterSql($_select, $_backend)
68     {
69         $db = Tinebase_Core::getDb();
70         
71         if (! is_array($this->_foreignIds)) {
72             $this->_foreignIds = $this->_getController()->search($this->_filterGroup, new Tinebase_Model_Pagination(), FALSE, TRUE);
73         }
74         
75         $_select->where($this->_getQuotedFieldName($_backend) . ' IN (?)', empty($this->_foreignIds) ? new Zend_Db_Expr('NULL') : $this->_foreignIds);
76     }
77     
78     /**
79      * set required grants
80      * 
81      * @param array $_grants
82      */
83     public function setRequiredGrants(array $_grants)
84     {
85         $this->_filterGroup->setRequiredGrants($_grants);
86     }
87     
88     /**
89      * get filter information for toArray()
90      * 
91      * @return array
92      */
93     protected function _getGenericFilterInformation()
94     {
95         list($appName, $i, $filterName) = explode('_', $this->_className);
96         
97         $result = array(
98             'linkType'      => 'foreignId',
99             'appName'       => $appName,
100             'filterName'    => $filterName,
101         );
102         
103         if (isset($this->_options['modelName'])) {
104             list($appName, $i, $modelName) = explode('_', $this->_options['modelName']);
105             $result['modelName'] = $modelName;
106         }
107         
108         return $result;
109     }
110 }