CI(Codeigniter)的Setting增强配置类实例


Posted in PHP onJanuary 06, 2016

本文实例讲述了Codeigniter的Setting增强配置类。分享给大家供大家参考,具体如下:

该增强配置类适用配置项要求比较灵活的项目。可实现预加载配置、组配置、单项调取、增、删、改配置,无需在改动config文档。

使用:

在需要的地方

$this->load->library('setting');

对于预加载项可以使用
$this->config->item();
进行获取
对于临时调取项可以使用
$this->setting->item();
进行获取

首先,创建数据表

CREATE TABLE `system_settings` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `key` varchar(64) NOT NULL DEFAULT '',
 `value` mediumtext NOT NULL,
 `group` varchar(55) NOT NULL DEFAULT 'site',
 `autoload` enum('no','yes') NOT NULL DEFAULT 'yes',
 PRIMARY KEY (`id`,`key`),
 KEY `name` (`key`),
 KEY `autoload` (`autoload`)
) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

然后,在application/libraries目录下创建setting.php,内容如下

<?php
if (!defined('BASEPATH'))
  exit('No direct script access allowed');
class Setting {
  private $_ci;
  private $settings_autoloaded;
  private $settings = array();
  private $settings_group = array();
  private $settings_db;
  public function __construct() {
    $this->_ci = &get_instance();
    $this->settings_db = $this->_ci->config->item('settings_table');
    $this->autoload();
  }
  // ------------------------------------------------------------------------
  // 华丽的分割线 正式开始
  // ------------------------------------------------------------------------
  /**
   * 从数据库获取所有自动加载的设置
   */
  public function autoload() {
    //如果存在则直接返回
    if (!empty($this->settings)) {
      return $this->settings;
    }
    //如果系统不存在数据表则返回false
    if (!$this->_ci->db->table_exists($this->settings_db)) {
      return FALSE;
    }
    //查询标记为自动加载的项
    $this->_ci->db->select('key,value')->from($this->settings_db)->where('autoload', 'yes');
    $query = $this->_ci->db->get();
    if ($query->num_rows() == 0) {
      return FALSE;
    }
    //循环写入系统配置
    foreach ($query->result() as $k => $row) {
      $this->settings[$row->key] = $row->value;
      $this->_ci->config->set_item($row->key, $row->value);
    }
    //标记会话,避免重复读库
    //$this->_ci->session->set_userdata('settings_autoloaded', TRUE);
    return $this->settings;
  }
  // ------------------------------------------------------------------------
  /**
   * 获取单个设定
   *
   * <code>
   * <?php $this->settings->get('config_item');
   ?>
   * </code>
   */
  public function item($key) {
    if (!$key) {
      return FALSE;
    }
    //首先检查是否系统已经自动加载
    if (isset($this->settings[$key])) {
      return $this->settings[$key];
    }
    //查询数据库
    $this->_ci->db->select('value')->from($this->settings_db)->where('key', $key);
    $query = $this->_ci->db->get();
    if ($query->num_rows() > 0) {
      $row = $query->row();
      $this->settings[$key] = $row->value;
      return $row->value;
    }
    // 查询不到结果则查找系统config,返回值或者false
    return $this->_ci->config->item($key);
  }
  // ------------------------------------------------------------------------
  /**
   * 获取组配置
   */
  public function group($group = '') {
    if (!$group) {
      return FALSE;
    }
    $this->_ci->db->select('key,value')->from($this->settings_db)->where('group', $group);
    $query = $this->_ci->db->get();
    if ($query->num_rows() == 0) {
      return FALSE;
    }
    foreach ($query->result() as $k => $row) {
      $this->settings[$row->key] = $row->value;
      $arr[$row->key] = $row->value;
    }
    return $arr;
  }
  // ------------------------------------------------------------------------
  /**
   * 更改设置
   */
  public function edit($key, $value) {
    $this->_ci->db->where('key', $key);
    $this->_ci->db->update($this->settings_db, array('value' => $value));
    if ($this->_ci->db->affected_rows() == 0) {
      return FALSE;
    }
    return TRUE;
  }
  // ------------------------------------------------------------------------
  /**
   * 新增设置
   */
  public function insert($key, $value = '', $group = 'addon', $autoload = 'no') {
    // 检查是否已经被添加的设置
    $this->_ci->db->select('value')->from($this->settings_db)->where('key', $key);
    $query = $this->_ci->db->get();
    if ($query->num_rows() > 0) {
      return $this->edit($key, $value);
    }
    $data = array('key' => $key, 'value' => $value, 'group' => $group, 'autoload' => $autoload, );
    $this->_ci->db->insert($this->settings_db, $data);
    if ($this->_ci->db->affected_rows() == 0) {
      return FALSE;
    }
    return TRUE;
  }
  // ------------------------------------------------------------------------
  /**
   * 删除设置
   */
  public function delete($key) {
    $this->_ci->db->delete($this->settings_db, array('key' => $key));
    if ($this->_ci->db->affected_rows() == 0) {
      return FALSE;
    }
    return TRUE;
  }
  // ------------------------------------------------------------------------
  /**
   * 删除设置组及成员配置
   */
  public function delete_group($group) {
    $this->_ci->db->delete($this->settings_db, array('group' => $group));
    if ($this->_ci->db->affected_rows() == 0) {
      return FALSE;
    }
    return TRUE;
  }
}
/* End of file Setting.php */
/* Location: ./application/libraries/Setting.php */

最后,打开application/config/config.php,新增

/**
 * 系统配置表名
 */
$config['settings_table'] = "system_settings";

希望本文所述对大家基于Codeigniter框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP树的代码,可以嵌套任意层
Oct 09 PHP
据说是雅虎的一份PHP面试题附答案
Jan 07 PHP
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
Jun 09 PHP
PHP 面向对象详解
Sep 13 PHP
php安装xdebug/php安装pear/phpunit详解步骤(图)
Dec 22 PHP
PHP中文竖排转换实现方法
Oct 23 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
Jan 05 PHP
使用symfony命令创建项目的方法
Mar 17 PHP
深入讲解PHP的Yii框架中的属性(Property)
Mar 18 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
Mar 21 PHP
PHP实现的字符串匹配算法示例【sunday算法】
Dec 19 PHP
详解php用static方法的原因
Sep 12 PHP
WordPress开发中短代码的实现及相关函数使用技巧
Jan 05 #PHP
WordPress开发中用于获取近期文章的PHP函数使用解析
Jan 05 #PHP
Yii中表单用法实例详解
Jan 05 #PHP
php实现购物车功能(下)
Jan 05 #PHP
Yii中创建自己的Widget实例
Jan 05 #PHP
php实现购物车功能(上)
Jul 23 #PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
Jan 05 #PHP
You might like
PHP删除特定数组内容并且重建数组索引的方法.
2011/03/25 PHP
php绘图之在图片上写中文和英文的方法
2015/01/24 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
2019/04/02 PHP
js 鼠标点击事件及其它捕获
2009/06/04 Javascript
javascript preload&amp;lazy load
2010/05/13 Javascript
JS原型对象通俗&quot;唱法&quot;
2012/12/27 Javascript
jQuery学习笔记(1)--用jQuery实现异步通信(用json传值)具体思路
2013/04/08 Javascript
javascript截取字符串(通过substring实现并支持中英文混合)
2013/06/24 Javascript
SinaEditor使用方法详解
2013/12/28 Javascript
常见的原始JS选择器使用方法总结
2014/04/09 Javascript
JSON取值前判断
2014/12/23 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
JAVASCRIPT代码编写俄罗斯方块网页版
2015/11/26 Javascript
form表单转Json提交的方法(推荐)
2016/09/23 Javascript
基于Vue实现支持按周切换的日历
2020/09/24 Javascript
浅析JS抽象工厂模式
2017/12/14 Javascript
vue.js 实现评价五角星组件的实例代码
2018/08/13 Javascript
对layer弹出框中icon数字参数的说明介绍
2019/09/04 Javascript
js实现简单的点名器随机色实例代码
2020/09/20 Javascript
[46:44]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
[02:51]DOTA2 Supermajor小组分组对阵抽签仪式
2018/06/01 DOTA
Python 时间处理datetime实例
2008/09/06 Python
Python实现Linux监控的方法
2019/05/16 Python
python实现对服务器脚本敏感信息的加密解密功能
2019/08/13 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
实例讲解使用CSS实现多边框和透明边框的方法
2015/09/08 HTML / CSS
HTML5实现QQ聊天气泡效果
2017/06/26 HTML / CSS
国外平面设计第一市场:99designs
2016/10/25 全球购物
Shopee新加坡:东南亚与台湾电商平台
2019/01/25 全球购物
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
医学生职业生涯规划书范文
2014/03/13 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
2014大学辅导员工作总结
2014/12/02 职场文书
客户答谢会致辞
2015/07/30 职场文书
PHP获取学生成绩的方法
2021/11/17 PHP