0013214: allow to set fixed calendars as user preference
[tine20] / tine20 / Tinebase / Model / Preference.php
1 <?php
2 /**
3  * Tine 2.0
4  * 
5  * @package     Tinebase
6  * @subpackage  Record
7  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
8  * @copyright   Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
9  * @author      Philipp Schuele <p.schuele@metaways.de>
10  * 
11  * @todo        add 'grouping' property?
12  */
13
14 /**
15  * class Tinebase_Model_Preference
16  * 
17  * @package     Tinebase
18  * @subpackage  Record
19  */
20 class Tinebase_Model_Preference extends Tinebase_Record_Abstract 
21 {
22     /**
23      * normal user/group preference
24      *
25      */
26     const TYPE_USER = 'user';
27     
28     /**
29      * default preference for anyone who has no specific preference
30      *
31      */
32     const TYPE_DEFAULT = 'default';
33
34     /**
35      * admin default preference
36      *
37      */
38     const TYPE_ADMIN = 'admin';
39     
40     /**
41      * admin forced preference (can not be changed by users)
42      *
43      */
44     const TYPE_FORCED = 'forced';
45
46     /**
47      * default preference value
48      *
49      */
50     const DEFAULT_VALUE = '_default_';
51     
52     /**
53      * identifier field name
54      *
55      * @var string
56      */
57     protected $_identifier = 'id';
58     
59     /**
60      * application the record belongs to
61      *
62      * @var string
63      */
64     protected $_application = 'Tinebase';
65     
66     /**
67      * record validators
68      *
69      * @var array
70      */
71     protected $_validators = array(
72         'id'                => array('allowEmpty' => TRUE),
73         'account_id'        => array('presence' => 'required', 'allowEmpty' => TRUE, 'default' => '0'),
74         'account_type'      => array('presence' => 'required', 'allowEmpty' => FALSE, array('InArray', array(
75             Tinebase_Acl_Rights::ACCOUNT_TYPE_ANYONE,
76             Tinebase_Acl_Rights::ACCOUNT_TYPE_USER,
77             Tinebase_Acl_Rights::ACCOUNT_TYPE_GROUP
78         ))),
79         'application_id'    => array('presence' => 'required', 'allowEmpty' => FALSE, 'Alnum'),
80         'name'              => array('presence' => 'required', 'allowEmpty' => FALSE, 'Alnum'),
81         'value'             => array('presence' => 'required', 'allowEmpty' => TRUE),
82         'type'              => array('presence' => 'required', 'allowEmpty' => FALSE, array('InArray', array(
83             self::TYPE_USER,        // user defined
84             self::TYPE_DEFAULT,     // code default
85             self::TYPE_ADMIN,       // admin default
86             self::TYPE_FORCED,      // admin forced
87         ))),
88     // xml field with select options for this preference => only available in TYPE_DEFAULT prefs
89         'options'            => array('allowEmpty' => TRUE),
90     // don't allow to set this preference in admin mode
91         'personal_only'      => array(Zend_Filter_Input::ALLOW_EMPTY => true, Zend_Filter_Input::DEFAULT_VALUE => 0),
92     // don't allow user to change value
93         'locked'      => array(Zend_Filter_Input::ALLOW_EMPTY => true, Zend_Filter_Input::DEFAULT_VALUE => 0),
94         // multiselection preference
95         //'multiselect'        =>  array(Zend_Filter_Input::ALLOW_EMPTY => true, Zend_Filter_Input::DEFAULT_VALUE => false),
96         'uiconfig'        =>  array(Zend_Filter_Input::ALLOW_EMPTY => true, Zend_Filter_Input::DEFAULT_VALUE => array()),
97         'recordConfig'    =>  array(Zend_Filter_Input::ALLOW_EMPTY => true, Zend_Filter_Input::DEFAULT_VALUE => array()),
98     );
99
100     /**
101      * TODO remove when converted to ModelConfig
102      * TODO generalize / support other models
103      */
104     public function runConvertToRecord()
105     {
106         // convert value property if necessary
107         if (Tinebase_Helper::is_json($this->value)) {
108             $value = Tinebase_Helper::jsonDecode($this->value);
109             switch ($value['modelName']) {
110                 case 'Tinebase_Model_Container':
111                     $containers = array();
112                     foreach ($value['ids'] as $containerId) {
113                         try {
114                             $container = Tinebase_Container::getInstance()->getContainerById($containerId);
115                             // TODO should be converted to array by json frontend
116                             $containers[] = $container->toArray();
117                         } catch (Exception $e) {
118                             // not found / no access / ...
119                         }
120                     }
121                     $this->value = $containers;
122                     break;
123                 default:
124                     throw new Tinebase_Exception_InvalidArgument('model not supported');
125
126             }
127         } else {
128             parent::runConvertToRecord();
129         }
130     }
131
132     /**
133      * TODO remove when converted to ModelConfig
134      * TODO generalize / support other models
135      */
136     public function runConvertToData()
137     {
138         // convert value property if necessary
139         if (is_array($this->value) && is_array($this->recordConfig) && isset($this->recordConfig['modelName'])) {
140             $value = array(
141                 'modelName' => $this->recordConfig['modelName'],
142                 'ids' => array(),
143             );
144             foreach ($this->value as $record) {
145                 if (isset($record['id'])) {
146                     $value['ids'][] = $record['id'];
147                 }
148             }
149             $this->value = json_encode($value);
150         } else {
151             parent::runConvertToData();
152         }
153     }
154 }