| 1 | <?php | 
|---|
| 2 | # -- BEGIN LICENSE BLOCK --------------------------------------- | 
|---|
| 3 | # | 
|---|
| 4 | # This file is part of Dotclear 2. | 
|---|
| 5 | # | 
|---|
| 6 | # Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear | 
|---|
| 7 | # Licensed under the GPL version 2.0 license. | 
|---|
| 8 | # See LICENSE file or | 
|---|
| 9 | # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html | 
|---|
| 10 | # | 
|---|
| 11 | # -- END LICENSE BLOCK ----------------------------------------- | 
|---|
| 12 | if (!defined('DC_RC_PATH')) { return; } | 
|---|
| 13 |  | 
|---|
| 14 | /** | 
|---|
| 15 | @ingroup DC_CORE | 
|---|
| 16 | @brief User prefs handler | 
|---|
| 17 |  | 
|---|
| 18 | dcPrefs provides user preferences management. This class instance exists as | 
|---|
| 19 | dcAuth $prefs property. You should create a new prefs instance when | 
|---|
| 20 | updating another user prefs. | 
|---|
| 21 | */ | 
|---|
| 22 | class dcPrefs | 
|---|
| 23 | { | 
|---|
| 24 |      protected $con;          ///< <b>connection</b> Database connection object | 
|---|
| 25 |      protected $table;        ///< <b>string</b> Prefs table name | 
|---|
| 26 |      protected $user_id;      ///< <b>string</b> User ID | 
|---|
| 27 |       | 
|---|
| 28 |      protected $workspaces = array();        ///< <b>array</b> Associative workspaces array | 
|---|
| 29 |       | 
|---|
| 30 |      protected $ws;           ///< <b>string</b> Current workspace | 
|---|
| 31 |       | 
|---|
| 32 |      /** | 
|---|
| 33 |      Object constructor. Retrieves user prefs and puts them in $workspaces | 
|---|
| 34 |      array. Local (user) prefs have a highest priority than global prefs. | 
|---|
| 35 |       | 
|---|
| 36 |      @param    core      <b>dcCore</b>       dcCore object | 
|---|
| 37 |      @param    user_id   <b>string</b>       User ID | 
|---|
| 38 |      */ | 
|---|
| 39 |      public function __construct($core,$user_id) | 
|---|
| 40 |      { | 
|---|
| 41 |           $this->con =& $core->con; | 
|---|
| 42 |           $this->table = $core->prefix.'pref'; | 
|---|
| 43 |           $this->user_id =& $user_id; | 
|---|
| 44 |           try {$this->loadPrefs();} catch (Exception $e) { | 
|---|
| 45 |                if (version_compare($core->getVersion('core'),'2.3','>')) { | 
|---|
| 46 |                     trigger_error(__('Unable to retrieve workspaces:').' '.$this->con->error(), E_USER_ERROR); | 
|---|
| 47 |                } | 
|---|
| 48 |           } | 
|---|
| 49 |      } | 
|---|
| 50 |       | 
|---|
| 51 |      /** | 
|---|
| 52 |      Retrieves all workspaces (and their prefs) from database, with one query.  | 
|---|
| 53 |      */ | 
|---|
| 54 |      private function loadPrefs() | 
|---|
| 55 |      { | 
|---|
| 56 |           $strReq = 'SELECT user_id, pref_id, pref_value, '. | 
|---|
| 57 |                     'pref_type, pref_label, pref_ws '. | 
|---|
| 58 |                     'FROM '.$this->table.' '. | 
|---|
| 59 |                     "WHERE user_id = '".$this->con->escape($this->user_id)."' ". | 
|---|
| 60 |                     'OR user_id IS NULL '. | 
|---|
| 61 |                     'ORDER BY pref_ws ASC, pref_id ASC'; | 
|---|
| 62 |           try { | 
|---|
| 63 |                $rs = $this->con->select($strReq); | 
|---|
| 64 |           } catch (Exception $e) { | 
|---|
| 65 |                throw $e; | 
|---|
| 66 |           } | 
|---|
| 67 |            | 
|---|
| 68 |           /* Prevent empty tables (install phase, for instance) */ | 
|---|
| 69 |           if ($rs->isEmpty()) { | 
|---|
| 70 |                return; | 
|---|
| 71 |           } | 
|---|
| 72 |            | 
|---|
| 73 |           do { | 
|---|
| 74 |                $ws = trim($rs->f('pref_ws')); | 
|---|
| 75 |                if (!$rs->isStart()) { | 
|---|
| 76 |                     // we have to go up 1 step, since workspaces construction performs a fetch() | 
|---|
| 77 |                     // at very first time | 
|---|
| 78 |                     $rs->movePrev(); | 
|---|
| 79 |                } | 
|---|
| 80 |                $this->workspaces[$ws] = new dcWorkspace($GLOBALS['core'], $this->user_id, $ws,$rs); | 
|---|
| 81 |           } while(!$rs->isStart()); | 
|---|
| 82 |      } | 
|---|
| 83 |            | 
|---|
| 84 |       | 
|---|
| 85 |      /** | 
|---|
| 86 |      Create a new workspace. If the workspace already exists, return it without modification. | 
|---|
| 87 |       | 
|---|
| 88 |      @param    ws   <b>string</b>       Workspace name | 
|---|
| 89 |      @return   <b>dcWorkspace</b>  The workspace created | 
|---|
| 90 |      */ | 
|---|
| 91 |      public function addWorkspace($ws) | 
|---|
| 92 |      { | 
|---|
| 93 |           if (!array_key_exists($ws, $this->workspaces)) { | 
|---|
| 94 |                $this->workspaces[$ws] = new dcWorkspace($GLOBALS['core'], $this->user_id, $ws); | 
|---|
| 95 |           } | 
|---|
| 96 |           return $this->workspaces[$ws]; | 
|---|
| 97 |      } | 
|---|
| 98 |       | 
|---|
| 99 |      /** | 
|---|
| 100 |      Rename a workspace. | 
|---|
| 101 |  | 
|---|
| 102 |      @param    oldWs     <b>string</b>  Old workspace name | 
|---|
| 103 |      @param    newws     <b>string</b>  New workspace name | 
|---|
| 104 |      @return   <b>boolean</b> | 
|---|
| 105 |      */ | 
|---|
| 106 |      public function renWorkspace($oldNs,$newNs) | 
|---|
| 107 |      { | 
|---|
| 108 |           if (!array_key_exists($oldWs, $this->workspaces) || array_key_exists($newWs, $this->workspaces)) { | 
|---|
| 109 |                return false; | 
|---|
| 110 |           } | 
|---|
| 111 |  | 
|---|
| 112 |           // Rename the workspace in the workspace array | 
|---|
| 113 |           $this->workspaces[$newWs] = $this->workspaces[$oldWs]; | 
|---|
| 114 |           unset($this->workspaces[$oldWs]); | 
|---|
| 115 |  | 
|---|
| 116 |           // Rename the workspace in the database | 
|---|
| 117 |           $strReq = 'UPDATE '.$this->table. | 
|---|
| 118 |                " SET pref_ws = '".$this->con->escape($newWs)."' ". | 
|---|
| 119 |                " WHERE pref_ws = '".$this->con->escape($oldWs)."' "; | 
|---|
| 120 |           $this->con->execute($strReq); | 
|---|
| 121 |           return true; | 
|---|
| 122 |      } | 
|---|
| 123 |  | 
|---|
| 124 |      /** | 
|---|
| 125 |      Delete a whole workspace with all preferences pertaining to it. | 
|---|
| 126 |  | 
|---|
| 127 |      @param    ws   <b>string</b>  Workspace name | 
|---|
| 128 |      @return   <b>boolean</b> | 
|---|
| 129 |      */ | 
|---|
| 130 |      public function delWorkspace($ws) | 
|---|
| 131 |      { | 
|---|
| 132 |           if (!array_key_exists($ws, $this->workspaces)) { | 
|---|
| 133 |                return false; | 
|---|
| 134 |           } | 
|---|
| 135 |  | 
|---|
| 136 |           // Remove the workspace from the workspace array | 
|---|
| 137 |           unset($this->workspaces[$ws]); | 
|---|
| 138 |  | 
|---|
| 139 |           // Delete all preferences from the workspace in the database | 
|---|
| 140 |           $strReq = 'DELETE FROM '.$this->table. | 
|---|
| 141 |                " WHERE pref_ws = '".$this->con->escape($ws)."' "; | 
|---|
| 142 |           $this->con->execute($strReq); | 
|---|
| 143 |           return true; | 
|---|
| 144 |      } | 
|---|
| 145 |       | 
|---|
| 146 |      /** | 
|---|
| 147 |      Returns full workspace with all prefs pertaining to it. | 
|---|
| 148 |       | 
|---|
| 149 |      @param    ws   <b>string</b>       Workspace name | 
|---|
| 150 |      @return   <b>dcWorkspace</b> | 
|---|
| 151 |      */ | 
|---|
| 152 |      public function get($ws) | 
|---|
| 153 |      { | 
|---|
| 154 |           if (array_key_exists($ws, $this->workspaces)) { | 
|---|
| 155 |                return $this->workspaces[$ws]; | 
|---|
| 156 |           } | 
|---|
| 157 |            | 
|---|
| 158 |           return null; | 
|---|
| 159 |      } | 
|---|
| 160 |       | 
|---|
| 161 |      /** | 
|---|
| 162 |      Magic __get method. | 
|---|
| 163 |      @copydoc ::get | 
|---|
| 164 |      */ | 
|---|
| 165 |      public function __get($n) | 
|---|
| 166 |      { | 
|---|
| 167 |           return $this->get($n); | 
|---|
| 168 |      } | 
|---|
| 169 |       | 
|---|
| 170 |      /** | 
|---|
| 171 |      Returns $workspaces property content. | 
|---|
| 172 |       | 
|---|
| 173 |      @return   <b>array</b> | 
|---|
| 174 |      */ | 
|---|
| 175 |      public function dumpWorkspaces() | 
|---|
| 176 |      { | 
|---|
| 177 |           return $this->workspaces; | 
|---|
| 178 |      } | 
|---|
| 179 |       | 
|---|
| 180 | } | 
|---|
| 181 | ?> | 
|---|