Tinebase_Model_Filter_GrantsFilterGroup - fix recursive join issue
[tine20] / tine20 / Tinebase / Model / Filter / GrantsFilterGroup.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) 2014 Metaways Infosystems GmbH (http://www.metaways.de)
9  * @author      Philipp Schüle <p.schuele@metaways.de>
10  */
11
12 /**
13  * Tinebase_Model_Filter_GrantsFilterGroup 
14  * @package     Tinebase
15  * @subpackage  Filter
16  */
17 class Tinebase_Model_Filter_GrantsFilterGroup extends Tinebase_Model_Filter_FilterGroup implements Tinebase_Model_Filter_AclFilter
18 {
19     /**
20      * @var string acl table name
21      */
22     protected $_aclTableName = null;
23
24     /**
25      * @var string the alias for the acl table name
26      */
27     protected $_joinedTableAlias = null;
28
29     /**
30      * @var string acl record column for join with acl table
31      */
32     protected $_aclIdColumn = 'id';
33
34     /**
35      * @var array one of these grants must be met
36      */
37     protected $_requiredGrants = array(
38         Tinebase_Model_PersistentFilterGrant::GRANT_READ
39     );
40
41     /**
42      * is acl filter resolved?
43      *
44      * TODO needed here?
45      *
46      * @var boolean
47      */
48     protected $_isResolved = FALSE;
49
50     /**
51      * sets the grants this filter needs to assure
52      *
53      * @param array $_grants
54      */
55     public function setRequiredGrants(array $_grants)
56     {
57         $this->_requiredGrants = $_grants;
58         $this->_isResolved = FALSE;
59     }
60
61     /**
62      * appends custom filters to a given select object
63      *
64      * @param  Zend_Db_Select                    $select
65      * @param  Tinebase_Backend_Sql_Abstract     $backend
66      * @return void
67      */
68     public function appendFilterSql($select, $backend)
69     {
70         $this->_appendAclSqlFilter($select, $backend);
71     }
72
73     /**
74      * add account id to filter
75      *
76      * @param Zend_Db_Select $select
77      * @param Tinebase_Backend_Sql_Abstract $backend
78      */
79     protected function _appendAclSqlFilter($select, $backend)
80     {
81         if (! $this->_isResolved) {
82             $this->_appendGrantsFilter($select, $backend);
83
84             $this->_isResolved = TRUE;
85         }
86     }
87
88     /**
89      * append grants acl filter
90      * 
91      * @param Zend_Db_Select $select
92      * @param Tinebase_Backend_Sql_Abstract $backend
93      * @param Tinebase_Model_User $user
94      */
95     protected function _appendGrantsFilter($select, $backend, $user = null)
96     {
97         if ($this->_ignoreAcl) {
98             return;
99         }
100
101         if (! $user) {
102             $user = isset($this->_options['user']) ? $this->_options['user'] : Tinebase_Core::getUser();
103         }
104
105         $this->_joinedTableAlias = uniqid($this->_aclTableName);
106         $db = $backend->getAdapter();
107         $select->join(array(
108             /* table  */ $this->_joinedTableAlias => SQL_TABLE_PREFIX . $this->_aclTableName),
109             /* on     */ "{$db->quoteIdentifier($this->_joinedTableAlias . '.record_id')} = {$db->quoteIdentifier($backend->getTableName() . '.' . $this->_aclIdColumn)}",
110             /* select */ array()
111         );
112         
113         Tinebase_Container::addGrantsSql($select, $user, $this->_requiredGrants, $this->_joinedTableAlias);
114         
115         if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ 
116             . ' $select after appending grants sql: ' . $select);
117     }
118 }