0byt3m1n1-V2
Path:
/
home
/
magalijoj
/
www
/
blog
/
inc
/
core
/
[
Home
]
File: class.dc.settings.php
<?php # ***** BEGIN LICENSE BLOCK ***** # This file is part of DotClear. # Copyright (c) 2005 Olivier Meunier and contributors. All rights # reserved. # # DotClear is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # DotClear is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with DotClear; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # ***** END LICENSE BLOCK ***** /** @ingroup DC_CORE @brief Blog settings handler dcSettings provides blog settings management. This class instance exists as dcBlog $settings property. You should create a new settings instance when updating another blog settings. */ class dcSettings { protected $con; ///< <b>connection</b> Database connection object protected $table; ///< <b>string</b> Permission table name protected $blog_id; ///< <b>string</b> Blog ID protected $settings = array(); ///< <b>array</b> Associative settings array protected $global_settings = array(); ///< <b>array</b> Global settings array protected $local_settings = array(); ///< <b>array</b> Local settings array protected $ns; ///< <b>string</b> Current namespace /** Object constructor. Retrieves blog settings and puts them in $settings array. Local (blog) settings have a highest priority than global settings. @param core <b>dcCore</b> dcCore object @param blog_id <b>string</b> Blog ID */ public function __construct(&$core,$blog_id) { $this->con =& $core->con; $this->table = $core->prefix.'setting'; $this->blog_id =& $blog_id; $this->getSettings(); } private function getSettings() { $strReq = 'SELECT blog_id, setting_id, setting_ns, setting_value, '. 'setting_type, setting_label '. 'FROM '.$this->table.' '. "WHERE blog_id = '".$this->con->escape($this->blog_id)."' ". 'OR blog_id IS NULL '. 'ORDER BY setting_ns, setting_id DESC '; try { $rs = $this->con->select($strReq); } catch (Exception $e) { trigger_error(__('Unable to retrieve settings: ').$this->con->error(), E_USER_ERROR); } while ($rs->fetch()) { $id = trim($rs->f('setting_id')); $value = $rs->f('setting_value'); $type = $rs->f('setting_type'); if ($type == 'float' || $type == 'double') { $type = 'float'; } elseif ($type != 'boolean' && $type != 'integer') { $type = 'string'; } settype($value,$type); $array = $rs->blog_id ? 'local' : 'global'; $this->{$array.'_settings'}[$id] = array( 'ns' => $rs->f('setting_ns'), 'value' => $value, 'type' => $type, 'label' => (string) $rs->f('setting_label'), 'global' => $rs->blog_id == '' ); } $this->settings = $this->global_settings; foreach ($this->local_settings as $id => $v) { $this->settings[$id] = $v; } return true; } private function settingExists($id,$global=false) { $array = $global ? 'global' : 'local'; return isset($this->{$array.'_settings'}[$id]); } /** Sets a working namespace. You should do this before adding any setting. @param ns <b>string</b> Namespace name */ public function setNamespace($ns) { if (preg_match('/^[a-z]+$/',$ns)) { $this->ns = $ns; } } /** Creates or updates a setting. $type could be 'string', 'integer', 'float', 'boolean' or null. If $type is null and setting exists, it will keep current setting type. $value_change allow you to not change setting. Useful if you need to change a setting label or type and don't want to change its value. Don't forget to set namespace before calling this method. @param id <b>string</b> Setting ID @param value <b>mixed</b> Setting value @param type <b>string</b> Setting type @param label <b>string</b> Setting label @param value_change <b>boolean</b> Change setting value or not @param global <b>boolean</b> Setting is global */ public function put($id,$value,$type=null,$label=null,$value_change=true,$global=false) { if (!$this->ns) { throw new Exception(__('No namespace specified')); } if (!preg_match('/^[a-zA-Z][a-zA-Z0-9_]+$/',$id)) { throw new Exception(sprintf(__('%s is not a valid setting id'),$id)); } # We don't want to change setting value if (!$value_change) { if (!$global && $this->settingExists($id,false)) { $value = $this->local_settings[$id]['value']; } elseif ($this->settingExists($id,true)) { $value = $this->global_settings[$id]['value']; } } # Setting type if ($type == 'double') { $type = 'float'; } elseif ($type === null) { if (!$global && $this->settingExists($id,false)) { $type = $this->local_settings[$id]['type']; } elseif ($this->settingExists($id,true)) { $type = $this->global_settings[$id]['type']; } else { $type = 'string'; } } elseif ($type != 'boolean' && $type != 'integer' && $type != 'float') { $type = 'string'; } # We don't change label if ($label == null) { if (!$global && $this->settingExists($id,false)) { $label = $this->local_settings[$id]['label']; } elseif ($this->settingExists($id,true)) { $label = $this->global_settings[$id]['label']; } } settype($value,$type); $cur = $this->con->openCursor($this->table); $cur->setting_value = ($type == 'boolean') ? (string) (integer) $value : (string) $value; $cur->setting_type = $type; $cur->setting_label = $label; #If we are local, compare to global value if (!$global && $this->settingExists($id,true)) { $g = $this->global_settings[$id]; $same_setting = $g['ns'] == $this->ns && $g['value'] == $value && $g['type'] == $type && $g['label'] == $label; # Drop setting if same value as global if ($same_setting && $this->settingExists($id,false)) { $this->drop($id); } elseif ($same_setting) { return; } } if ($this->settingExists($id,$global) && $this->ns == $this->settings[$id]['ns']) { if ($global) { $where = 'WHERE blog_id IS NULL '; } else { $where = "WHERE blog_id = '".$this->con->escape($this->blog_id)."' "; } $cur->update($where."AND setting_id = '".$this->con->escape($id)."' "); } else { $cur->setting_id = $id; $cur->blog_id = $global ? null : $this->blog_id; $cur->setting_ns = $this->ns; $cur->insert(); } } /** Removes an existing setting. Namespace @param id <b>string</b> Setting ID */ public function drop($id) { $strReq = 'DELETE FROM '.$this->table.' '; if ($this->blog_id === null) { $strReq .= 'WHERE blog_id IS NULL '; } else { $strReq .= "WHERE blog_id = '".$this->con->escape($this->blog_id)."' "; } $strReq .= "AND setting_id = '".$this->con->escape($id)."' "; $this->con->execute($strReq); } /** Returns setting value if exists. @param n <b>string</b> Setting name @return <b>mixed</b> */ public function get($n) { if (isset($this->settings[$n]['value'])) { return $this->settings[$n]['value']; } return null; } /** Magic __get method. @copydoc ::get */ public function __get($n) { return $this->get($n); } /** Sets a setting in $settings property. This sets the setting for script execution time only and if setting exists. @param n <b>string</b> Setting name @param v <b>mixed</b> Setting value */ public function set($n,$v) { if (isset($this->settings[$n])) { $this->settings[$n]['value'] = $v; } } /** Magic __set method. @copydoc ::set */ public function __set($n,$v) { $this->set($n,$v); } /** Returns $settings property content. @return <b>array</b> */ public function dumpSettings() { return $this->settings; } /** Returns $global_settings property content. @return <b>array</b> */ public function dumpGlobalSettings() { return $this->global_settings; } /** @pre toto @endpre */ } ?>
©
2018.