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实现多服务器共享SESSION数据的方法
Mar 16 PHP
基于PHP文件操作的详解
Jun 05 PHP
php中并发读写文件冲突的解决方案
Oct 25 PHP
php Calender(日历)代码分享
Jan 03 PHP
PHP多文件上传类实例
Mar 07 PHP
PHP实现获取中英文首字母
Jun 19 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
Apr 27 PHP
Laravel与CI框架中截取字符串函数
May 08 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
Mar 12 PHP
PHP 无限级分类
May 04 PHP
Laravel学习基础之migrate的使用教程
Oct 11 PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
Oct 24 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中使用CURL伪造来路抓取页面或文件
2011/05/04 PHP
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
php中使用sftp教程
2015/03/30 PHP
[原创]php集成安装包wampserver修改密码后phpmyadmin无法登陆的解决方法
2016/11/23 PHP
PHP常用header头定义代码示例汇总
2020/08/29 PHP
js实现ASP分页函数 HTML分页函数
2006/09/22 Javascript
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
2009/11/24 Javascript
js中关于String对象的replace使用详解
2011/05/24 Javascript
EditPlus注册码生成器(js代码实现)
2013/03/25 Javascript
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
JS实现超精简响应鼠标显示二级菜单代码
2015/09/12 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
2016/11/01 Javascript
基于Javascript实现的不重复ID的生成器
2016/12/25 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
2017/08/16 Javascript
Vue.js搭建移动端购物车界面
2020/06/28 Javascript
详解基于Koa2开发微信二维码扫码支付相关流程
2018/05/16 Javascript
微信小程序之判断页面滚动方向的示例代码
2018/08/30 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
模块化react-router配置方法详解
2019/06/03 Javascript
解决vue elementUI 使用el-select 时 change事件的触发问题
2020/11/17 Vue.js
[02:08]什么藏在DOTA2 TI9“小紫本”里?斧王历险记告诉你!
2019/05/17 DOTA
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
分分钟入门python语言
2018/03/20 Python
一文读懂Python 枚举
2020/08/25 Python
美国农场鲜花速递:The Bouqs
2018/07/13 全球购物
演讲稿怎么写才完美
2014/01/02 职场文书
人力资源管理专业自荐书范文
2014/02/10 职场文书
乡镇干部先进性教育活动个人整改措施
2014/09/16 职场文书
有关朝花夕拾的读书笔记
2015/06/29 职场文书
2016年春季运动会加油稿
2015/07/22 职场文书
初中同学会致辞
2015/08/01 职场文书
环境卫生标语
2015/08/03 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
SpringBoot 集成Redis 过程
2021/06/02 Redis
Selenium浏览器自动化如何上传文件
2022/04/06 Python