672396c430fe9bda714edf89801846e8a5ee24c5
[tine20] / tine20 / Tinebase / Backend / Sql / Grants.php
1 <?php
2 /**
3  * Tine 2.0
4  *
5  * @package     Tinebase
6  * @subpackage  Backend
7  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
8  * @author      Philipp Schüle <p.schuele@metaways.de>
9  * @copyright   Copyright (c) 2014 Metaways Infosystems GmbH (http://www.metaways.de)
10  */
11
12 /**
13  * backend for records with grants
14  *
15  * @package     Tinebase
16  * @subpackage  Backend
17  */
18 class Tinebase_Backend_Sql_Grants extends Tinebase_Backend_Sql
19 {
20     /**
21      * get grants for records
22      * 
23      * @param Tinebase_Record_RecordSet $records
24      */
25     public function getGrantsForRecords(Tinebase_Record_RecordSet $records)
26     {
27         $recordIds = $records->getArrayOfIds();
28         if (empty($recordIds)) {
29             return;
30         }
31         
32         $select = $this->_getAclSelectByRecordIds($recordIds)
33             ->group(array('record_id', 'account_type', 'account_id'));
34         
35         Tinebase_Backend_Sql_Abstract::traitGroup($select);
36         
37         if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ 
38             . ' ' . $select);
39         
40         $stmt = $this->_db->query($select);
41
42         $grantsData = $stmt->fetchAll(Zend_Db::FETCH_ASSOC);
43         
44         if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ 
45             . ' grantsData: ' . print_r($grantsData, true));
46
47         foreach ($grantsData as $grantData) {
48             $givenGrants = explode(',', $grantData['account_grants']);
49             foreach ($givenGrants as $grant) {
50                 $grantData[$grant] = TRUE;
51             }
52             
53             $recordGrant = new $this->_modelName($grantData, true);
54             unset($recordGrant->account_grant);
55             
56             $record = $records->getById($recordGrant->record_id);
57             if (! $record->grants instanceof Tinebase_Record_RecordSet) {
58                 $record->grants = new Tinebase_Record_RecordSet($this->_modelName);
59             }
60             $record->grants->addRecord($recordGrant);
61         }
62         
63         if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ 
64             . ' Records with grants: ' . print_r($records->toArray(), true));
65     }
66     
67     /**
68      * get select with acl (grants) by record
69      * 
70      * @param string|array $recordId
71      * @return Zend_Db_Select
72      */
73     protected function _getAclSelectByRecordIds($recordIds)
74     {
75          $select = $this->_db->select()
76             ->from(
77                 array($this->getTableName() => SQL_TABLE_PREFIX . $this->getTableName()),
78                 array('*', 'account_grants' => $this->_dbCommand->getAggregate('account_grant'))
79             )
80             ->where("{$this->_db->quoteIdentifier('record_id')} IN (?)", (array)$recordIds);
81          return $select;
82     }
83 }