Merge branch '2013.10' into 2014.11
[tine20] / tine20 / Tinebase / Group / Typo3.php
1 <?php
2 /**
3  * Tine 2.0
4  * 
5  * @package     Tinebase
6  * @subpackage  Group
7  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
8  * @copyright   Copyright (c) 2008-2013 Metaways Infosystems GmbH (http://www.metaways.de)
9  * @author      Cornelius WeiƟ <c.weiss@metaways.de>
10  */
11
12 /**
13  * Simple Read-Only Typo3 Group Backend
14  * 
15  * NOTE: At the moment we assume typo3 and tine20 share a common database
16  * 
17  * NOTE: We assume the Tine 2.0 Installation to have the default user and admin groups
18  *       which are not part of the typo3 group system. Typo3 admins will be imported
19  *       into the default admin group, others into the default user group.
20  * 
21  * This class does nothing more than importing Typo3 groups / groupmembers
22  * into the Tine 2.0 group / groupmembers tables.
23  * 
24  * @package     Tinebase
25  * @subpackage  Group
26  */
27 class Tinebase_Group_Typo3 extends Tinebase_Group_Sql
28 {
29     /**
30      * @var Zend_Db_Adapter_Abstract
31      */
32     protected $_t3db;
33     
34     /**
35      * construct a typo3 user backend
36      */
37     public function __construct()
38     {
39         parent::__construct();
40         
41         $this->_t3db = $this->_db;
42     }
43     
44     /**
45      * replace all current groupmembers with the new groupmembers list
46      *
47      * @param int $_groupId
48      * @param array $_groupMembers
49      * @return unknown
50      */
51     public function setGroupMembers($_groupId, $_groupMembers)
52     {
53         throw new Tinebase_Exception_AccessDenied();
54     }
55
56     /**
57      * add a new groupmember to the group
58      *
59      * @param int $_groupId
60      * @param int $_accountId
61      * @return unknown
62      */
63     public function addGroupMember($_groupId, $_accountId)
64     {
65         throw new Tinebase_Exception_AccessDenied();
66     }
67
68     /**
69      * remove one groupmember from the group
70      *
71      * @param int $_groupId
72      * @param int $_accountId
73      * @return unknown
74      */
75     public function removeGroupMember($_groupId, $_accountId)
76     {
77         throw new Tinebase_Exception_AccessDenied();
78     }
79     
80     /**
81      * create a new group
82      *
83      * @param string $_groupName
84      * @return unknown
85      */
86     public function addGroup(Tinebase_Model_Group $_group)
87     {
88         throw new Tinebase_Exception_AccessDenied();
89     }
90     
91     /**
92      * updates an existing group
93      *
94      * @param Tinebase_Model_Group $_account
95      * @return Tinebase_Model_Group
96      */
97     public function updateGroup(Tinebase_Model_Group $_group)
98     {
99         throw new Tinebase_Exception_AccessDenied();
100     }
101
102     /**
103      * remove groups
104      *
105      * @param mixed $_groupId
106      * 
107      */
108     public function deleteGroups($_groupId)
109     {
110         throw new Tinebase_Exception_AccessDenied();
111     }
112     
113     /**
114      * import groups from typo3 
115      * 
116      * @return void
117      */
118     public function importGroups()
119     {
120         $select = $this->_t3db->select()
121             ->from('be_groups');
122             //->where('deleted = 0'))
123             
124         $groups = $select->query()->fetchAll(Zend_Db::FETCH_ASSOC);
125         
126         foreach($groups as $group) {
127             $groupObject = new Tinebase_Model_Group(array(
128                 'id'            => $group['uid'],
129                 'name'          => $group['title'],
130                 'description'   => null
131             ));
132
133             if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ .' add group: ' . print_r($groupObject->toArray(), TRUE));
134             try {
135                 parent::addGroup($groupObject);
136             } catch (Exception $e) {
137                 Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ .' Could not add group: ' . $groupObject->name . ' Error message: ' . $e->getMessage());
138             }
139         }
140     }
141     
142     /**
143      * import groupmembers from typo3
144      * 
145      * NOTE: in typo3 the user object/dbrow knows the group memberships
146      * 
147      * @return void
148      */
149     public function importGroupMembers()
150     {
151         $select = $this->_t3db->select()
152             ->from('be_users');
153             
154         $usersData = $select->query()->fetchAll(Zend_Db::FETCH_ASSOC);
155         
156         // build a groupMap
157         $userGroup = Tinebase_Group::getInstance()->getDefaultGroup()->getId();
158         $adminGroup = Tinebase_Group::getInstance()->getDefaultAdminGroup()->getId();
159         $groupMap = array(
160             $userGroup => array(),    //typo3 admin flag set
161             $adminGroup => array(),   //typo3 admin flag not set
162             //typo3GroupN             //typo3 defined groups
163         );
164         foreach($usersData as $t3user) {
165             $userId = $t3user['uid'];
166             
167             // put user in default user OR admin group
168             $groupMap[$t3user['admin'] == 1 ? $adminGroup : $userGroup][] = $userId;
169             
170             // evaluate typo3 groups
171             if (empty($t3user['usergroup'])) continue;
172             
173             $t3userGroups = explode(',', $t3user['usergroup']);
174                         
175             foreach((array) $t3userGroups as $groupId) {
176                 if (! (isset($groupMap[$groupId]) || array_key_exists($groupId, $groupMap))) {
177                     $groupMap[$groupId] = array();
178                 }
179                 
180                 $groupMap[$groupId][] = $userId;
181             }
182         }
183         
184         $sqlGroupBackend = new Tinebase_Group_Sql();
185         
186         foreach($groupMap as $groupId => $groupMembers) {
187             try {
188                 $sqlGroupBackend->setGroupMembers($groupId, $groupMembers);
189             } catch (Exception $e) {
190                 // ignore errors
191                 Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ .' could not set groupmembers: ' . $e->getMessage());
192             }
193         }
194     }
195     
196  }
197