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将数据库中所有内容生成静态html文档的代码
Apr 12 PHP
PHP spl_autoload_register实现自动加载研究
Dec 06 PHP
关于PHP递归算法和应用方法介绍
Apr 15 PHP
具有时效性的php加密解密函数代码
Jun 19 PHP
页面乱码问题的根源及其分析
Aug 09 PHP
typecho插件编写教程(六):调用接口
May 28 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
Mar 17 PHP
PHP 中常量的知识整理
Apr 14 PHP
PHP7扩展开发教程之Hello World实现方法示例
Aug 03 PHP
使用XHProf查找PHP性能瓶颈的实例
Dec 13 PHP
PHP chr()函数讲解
Feb 11 PHP
PHP数组基本用法与知识点总结
Jun 02 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
模仿OSO的论坛(二)
2006/10/09 PHP
php分页示例代码
2007/03/19 PHP
php实现随机生成易于记忆的密码
2015/06/19 PHP
功能强大的php文件上传类
2016/08/29 PHP
PHP autoload使用方法及步骤详解
2020/09/05 PHP
JMenuTab简单使用说明
2008/03/13 Javascript
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
jquery实现滑动图片自己测试的例子
2013/11/05 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
canvas实现爱心和彩虹雨效果
2017/03/09 Javascript
Vue infinite update loop的问题解决
2019/04/23 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
2019/09/10 Javascript
通过GASP让vue实现动态效果实例代码详解
2019/11/24 Javascript
js实现鼠标拖拽div左右滑动
2020/01/15 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
2020/12/19 Vue.js
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
python中__call__内置函数用法实例
2015/06/04 Python
Python的Django框架中URLconf相关的一些技巧整理
2015/07/18 Python
tensorflow: 查看 tensor详细数值方法
2018/06/13 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
2019/02/13 Python
python图像处理入门(一)
2019/04/04 Python
Python+Selenium使用Page Object实现页面自动化测试
2019/07/14 Python
python列表推导式入门学习解析
2019/12/02 Python
使用python检查yaml配置文件是否符合要求
2020/04/09 Python
Python unittest装饰器实现原理及代码
2020/09/08 Python
ivx平台开发之不用代码实现一个九宫格抽奖功能
2021/01/27 HTML / CSS
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
外企办公室竞聘演讲稿
2013/12/29 职场文书
中学教师培训制度
2014/01/31 职场文书
警示教育活动总结
2014/05/05 职场文书
区政府领导班子个人对照检查材料
2014/09/25 职场文书
销售经理工作失职检讨书
2014/10/24 职场文书
2014年服务行业工作总结
2014/11/18 职场文书
小学新教师个人总结
2015/02/05 职场文书
python实现简单的井字棋
2021/05/26 Python
openGauss数据库JDBC环境连接配置的详细过程(Eclipse)
2022/06/01 Java/Android