1df3be636c80347da8146b9d32d9cc82d860d3a5
[tine20] / tine20 / Addressbook / Model / List.php
1 <?php
2 /**
3  * Tine 2.0
4  * 
5  * @package     Addressbook
6  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
7  * @author      Lars Kneschke <l.kneschke@metaways.de>
8  * @copyright   Copyright (c) 2010-2016 Metaways Infosystems GmbH (http://www.metaways.de)
9  */
10
11 /**
12  * class to hold addressbook list data
13  *
14  * @package     Addressbook
15  *
16  * @property    string      $id
17  * @property    string      $container_id
18  * @property    string      $name
19  * @property    string      $description
20  * @property    array       $members
21  * @property    array       $memberroles
22  * @property    string      $email
23  * @property    string      $type                 type of list
24  */
25 class Addressbook_Model_List extends Tinebase_Record_Abstract
26 {
27     /**
28      * key in $_validators/$_properties array for the filed which 
29      * represents the identifier
30      * 
31      * @var string
32      */
33     protected $_identifier = 'id';
34     
35     /**
36      * application the record belongs to
37      *
38      * @var string
39      */
40     protected $_application = 'Addressbook';
41     
42     /**
43      * list type: list (user defined lists)
44      * 
45      * @var string
46      */
47     const LISTTYPE_LIST = 'list';
48     
49     /**
50      * list type: group (lists matching a system group)
51      * 
52      * @var string
53      */
54     const LISTTYPE_GROUP = 'group';
55
56     /**
57      * name of fields which require manage accounts to be updated
58      *
59      * @var array list of fields which require manage accounts to be updated
60      */
61     protected static $_manageAccountsFields = array(
62         'name',
63         'description',
64         'email',
65     );
66     
67     /**
68      * list of zend validator
69      * 
70      * this validators get used when validating user generated content with Zend_Input_Filter
71      *
72      * @var array
73      */
74     protected $_validators = array (
75         // tine 2.0 generic fields
76         'id'                    => array(Zend_Filter_Input::ALLOW_EMPTY => true, Zend_Filter_Input::DEFAULT_VALUE => NULL),
77         'container_id'          => array(Zend_Filter_Input::ALLOW_EMPTY => true),
78         // modlog fields
79         'created_by'            => array(Zend_Filter_Input::ALLOW_EMPTY => true),
80         'creation_time'         => array(Zend_Filter_Input::ALLOW_EMPTY => true),
81         'last_modified_by'      => array(Zend_Filter_Input::ALLOW_EMPTY => true),
82         'last_modified_time'    => array(Zend_Filter_Input::ALLOW_EMPTY => true),
83         'is_deleted'            => array(Zend_Filter_Input::ALLOW_EMPTY => true),
84         'deleted_time'          => array(Zend_Filter_Input::ALLOW_EMPTY => true),
85         'deleted_by'            => array(Zend_Filter_Input::ALLOW_EMPTY => true),
86         'seq'                   => array(Zend_Filter_Input::ALLOW_EMPTY => true, Zend_Filter_Input::DEFAULT_VALUE => 0),
87         
88         // list specific fields
89         'name'                  => array('presence' => 'required'),
90         'description'           => array(Zend_Filter_Input::ALLOW_EMPTY => true),
91         'members'               => array(Zend_Filter_Input::ALLOW_EMPTY => true, Zend_Filter_Input::DEFAULT_VALUE => array()),
92         'email'                 => array(Zend_Filter_Input::ALLOW_EMPTY => true),
93         'type'                  => array(
94             Zend_Filter_Input::ALLOW_EMPTY => true,
95             Zend_Filter_Input::DEFAULT_VALUE => self::LISTTYPE_LIST,
96             array('InArray', array(self::LISTTYPE_LIST, self::LISTTYPE_GROUP)),
97         ),
98         'list_type'             => array(Zend_Filter_Input::ALLOW_EMPTY => true),
99         'group_id'              => array(Zend_Filter_Input::ALLOW_EMPTY => true),
100         'emails'                => array(Zend_Filter_Input::ALLOW_EMPTY => true),
101         'memberroles'           => array(Zend_Filter_Input::ALLOW_EMPTY => true),
102
103         // tine 2.0 generic fields
104         'tags'                  => array(Zend_Filter_Input::ALLOW_EMPTY => true),
105         'notes'                 => array(Zend_Filter_Input::ALLOW_EMPTY => true),
106         'relations'             => array(Zend_Filter_Input::ALLOW_EMPTY => true),
107         'customfields'          => array(Zend_Filter_Input::ALLOW_EMPTY => true, Zend_Filter_Input::DEFAULT_VALUE => array()),
108         'paths'                 => array(Zend_Filter_Input::ALLOW_EMPTY => true),
109     );
110     
111     /**
112      * name of fields containing datetime or or an array of datetime information
113      *
114      * @var array list of datetime fields
115      */
116     protected $_datetimeFields = array(
117         'creation_time',
118         'last_modified_time',
119         'deleted_time'
120     );
121
122     /**
123      * @return array
124      */
125     static public function getManageAccountFields()
126     {
127         return self::$_manageAccountsFields;
128     }
129
130     /**
131      * converts a string or Addressbook_Model_List to a list id
132      *
133      * @param   string|Addressbook_Model_List  $_listId  the contact id to convert
134      * 
135      * @return  string
136      * @throws  UnexpectedValueException  if no list id set 
137      */
138     static public function convertListIdToInt($_listId)
139     {
140         if ($_listId instanceof self) {
141             if ($_listId->getId() == null) {
142                 throw new UnexpectedValueException('No identifier set.');
143             }
144             $id = (string) $_listId->getId();
145         } else {
146             $id = (string) $_listId;
147         }
148         
149         if (empty($id)) {
150             throw new UnexpectedValueException('Identifier can not be empty.');
151         }
152         
153         return $id;
154     }
155
156     /**
157      * returns an array containing the parent neighbours relation objects or record(s) (ids) in the key 'parents'
158      * and containing the children neighbours in the key 'children'
159      *
160      * @return array
161      */
162     public function getPathNeighbours()
163     {
164         if (!empty($this->members)) {
165             foreach(Addressbook_Controller_Contact::getInstance()->getMultiple($this->members, true) as $member) {
166                 $members[$member->getId()] = $member;
167             }
168         } else {
169             $members = array();
170         }
171
172         if (!empty($this->memberroles)) {
173
174             $listRoles = array();
175             /** @var Addressbook_Model_ListMemberRole $role */
176             foreach($this->memberroles as $role)
177             {
178                 $listRoles[$role->list_role_id] = $role->list_role_id;
179                 if (isset($members[$role->contact_id])) {
180                     unset($members[$role->contact_id]);
181                 }
182             }
183
184             $pathController = Tinebase_Record_Path::getInstance();
185             $pathController->addAfterRebuildQueueHook(array(array('Addressbook_Model_ListRole', 'setParent')));
186             Addressbook_Model_ListRole::setParent($this);
187
188             $memberRoles = Addressbook_Controller_ListRole::getInstance()->getMultiple($listRoles, true)->asArray();
189             foreach($memberRoles as $memberRole) {
190                 $pathController->addToRebuildQueue(array($memberRole));
191                 $members[] = $memberRole;
192             }
193
194         }
195
196         $result = array(
197             'parents' => array(),
198             'children' => $members
199         );
200
201         return $result;
202     }
203 }