set json api functions parameter names
[tine20] / tine20 / Tinebase / State.php
1 <?php
2 /**
3  * Tine 2.0
4  *
5  * @package     Tinebase
6  * @subpackage  State
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) 2009-2011 Metaways Infosystems GmbH (http://www.metaways.de)
10  * 
11  */
12
13 /**
14  * controller for Extjs client State management
15  *
16  * @package     Tinebase
17  * @subpackage  State
18  */
19 class Tinebase_State
20 {
21     /**
22      * @var Tinebase_Backend_Sql
23      */
24     protected $_backend;
25     
26     /**
27      * holds the instance of the singleton
28      *
29      * @var Tinebase_State
30      */
31     private static $instance = NULL;
32     
33     /**
34      * the constructor
35      *
36      */
37     private function __construct()
38     {
39         $this->_backend = new Tinebase_Backend_Sql(array(
40             'modelName' => 'Tinebase_Model_State', 
41             'tableName' => 'state',
42         ));
43     }
44     
45     /**
46      * the singleton pattern
47      *
48      * @return Tinebase_State
49      */
50     public static function getInstance() 
51     {
52         if (self::$instance === NULL) {
53             self::$instance = new Tinebase_State();
54         }
55         return self::$instance;
56     }
57     
58     /**************************** public functions *********************************/
59     
60     /**
61      * returns a filter for searching in backend by stateId and the current user
62      * 
63      * @param string $stateId
64      * @param string $userId
65      * @return Tinebase_Model_StateFilter
66      */
67     protected function _getFilter($stateId, $userId = NULL)
68     {
69         if (! $userId) {
70             $userId = Tinebase_Core::getUser()->getId();
71         }
72         
73         return new Tinebase_Model_StateFilter(array(
74             array('field' => 'state_id', 'operator' => 'equals', 'value' => $stateId),
75             array('field' => 'user_id',  'operator' => 'equals', 'value' => $userId)
76         ));
77     }
78     
79     /**
80      * clears a single state entry
81      * 
82      * @param string $_name
83      * @return void
84      */
85     public function clearState($_name)
86     {
87         if (! Tinebase_Core::getUser()->hasRight('Tinebase', Tinebase_Acl_Rights::MANAGE_OWN_STATE)) {
88             throw new Tinebase_Exception_AccessDenied("You don't have the right to manage your client state");
89         }
90         
91         $recordToDelete = $this->_backend->search($this->_getFilter($_name))->getFirstRecord();
92         
93         if ($recordToDelete) {
94             $this->_backend->delete($recordToDelete->getId());
95         }
96     }
97     
98     /**
99      * saves a single state entry
100      * 
101      * @param string $_name
102      * @param string $_value
103      * @return void
104      */
105     public function setState($_name, $_value)
106     {
107         if (! Tinebase_Core::getUser()->hasRight('Tinebase', Tinebase_Acl_Rights::MANAGE_OWN_STATE)) {
108             throw new Tinebase_Exception_AccessDenied("You don't have the right to manage your client state");
109         }
110         
111         $userId = Tinebase_Core::getUser()->getId();
112         
113         $results = $this->_backend->search($this->_getFilter($_name, $userId));
114         
115         if ($results->count() == 0) {
116             $record = new Tinebase_Model_State(array(
117                 'user_id'   => $userId,
118                 'state_id'  => $_name,
119                 'data'      => $_value
120             ));
121             $this->_backend->create($record);
122         } else {
123             $record = $results->getFirstRecord();
124             $record->data = $_value;
125             $this->_backend->update($record);
126         }
127     }
128
129     /**
130      * load state data
131      *
132      * @return array
133      */
134     public function loadStateInfo()
135     {
136         $result = array();
137         
138         if (Tinebase_Core::getUser()) {
139             $userId = Tinebase_Core::getUser()->getId();
140             $states = $this->_backend->search(new Tinebase_Model_StateFilter(array(
141                 array('field' => 'user_id', 'operator' => 'equals', 'value' => $userId)
142             )));
143             foreach ($states as $stateRecord) {
144                 $result[$stateRecord->state_id] = $stateRecord->data;
145             }
146         }
147         
148         return $result;
149     }
150     
151     /**
152      * decoder for the extjs state encoder
153      * 
154      * @param  mixed $_value
155      * @return mixed
156      */
157     public static function decode($_value)
158     {
159         $val = urldecode($_value);
160         list ($type, $data) = explode(':', $val);
161         
162         switch ($type) {
163             case 'a': //array
164                 $array = array();
165                 
166                 $entries = explode('^', $data);
167                 foreach ($entries as $entry) {
168                     $array[] = self::decode($entry);
169                 }
170                 return $array;
171                 break;
172                 
173             case 'n': // number
174             case 's': //string
175                 return $data;
176                 break;
177                 
178             case 'o': //object
179                 $object = array();
180                 
181                 $entries = explode('^', $data);
182                 foreach ($entries as $entry) {
183                     list ($p, $v) = explode ('=', $entry);
184                     $object[$p] = self::decode($v);
185                 }
186                 return $object;
187                 break;
188         }
189     }
190 }