好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

CI简单实现Widget程序代码

周末看了看wordpress,感觉到旁边的小工具很好用,然后回想drupal,yii中都有那么个东西,然而我们目前使用的CI中却没有,所以简单实现了一个。 同事之前的实现是在views中用require的方法实现的。感觉这样不爽,而且那样就缺少了和数据库之间的交互,就算你可以用当前控制器传递过来的数据,但是总归有些东西还是分开的比较好。 想法是这样的,widget作为一个libary的形式存在,这样就可以用CI的load了,然后控制器中传递键值型数组,分别配置controller,method。这样我们将指定一个默认的叫做default的widget。想要多个widget,那么就调用他的register吧!传递的参数包括一个名字和一堆参数,该参数数组和构造函数中的参数数组是一样的。 这样我们也不用特意的实现继承,而且不用改变CI的开发思路。比较简单吧!最后在需要的地方调用Widget的run方法。就可以输出那个控制器的那一部分了。 run方法有一个名称参数,显示之前需要在之前用register注册过该名字的widget,否则将报错。该参数默认为default。 类的 代码 如下:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /** * 单独区块的渲染 * @author istrone */ class Widget { /** * 控制器 * @var string */ private $_controller; /** * 方法名 * @var string */ private $_method; /** * 参数 * @var array */ private $_params; /** * 构造函数 * @param array $params 传递的参数包括controller,method,params的键的数组, */ public function __construct($params=array()){ if(count($params)!=0) $this->init('default', $params); } /** * 注册widget * @param string $name widget的名字 * @param array $params 传递的参数包括controller,method,params的键的数组 */ public function register($name,$params){ $this->init($name, $params); } /** * 类的内部数据初始化 * @param string $name widget的名字 * @param array $params 传递的参数包括controller,method,params的键的数组 */ private function init($name,$params){ if(array_key_exists('controller', $params) && array_key_exists('method', $params)){ extract($params); if(class_exists($controller)){ $c = new $controller(); if(is_a($c, 'CI_Controller') && method_exists($c, $method)){ $this->_controller[$name] = $controller; $this->_method[$name] = $method; $this->_params[$name] = isset($params['params']) ? $params: NULL; } } }else{ show_error('您传递的参数不合法!'); } } /** * 运行输出区块 */ public function run($name='default'){ if(array_key_exists($name, $this->_controller)){ $c = $this->_controller[$name]; $m = $this->_method[$name]; $c = new $c(); $c->$m($this->_params[$name]); }else { show_error('您的widget調用沒有初始化!'); } }

}

将以上文件保存为widget.php,放到application下的library中,然后使用。简单使用如下:

$this->load->library('widget',array('controller'=>'welcome','method'=>'test','params'=>array())); //其中params可以省略 $this->widget->run(); //默认渲染default的widget $this->widget->register('first',array('controller'=>'welcome','method'=>'test','params'=>array())); $this->load->view('welcome_message'); $this->widget->run('first'); //渲染first的widget

查看更多关于CI简单实现Widget程序代码的详细内容...

  阅读:48次