How to create a widget system in Codeigniter
Here's Widget library from Wiredesignz
/** * Widget Plugin * * Install this file as application/plugins/widget_pi.php * * @version: 0.21 * $copyright Copyright (c) Wiredesignz 2009-09-07 * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */class Widget{ public $module_path; function run($file) { $args = func_get_args(); $module = ''; /* is module in filename? */ if (($pos = strrpos($file, '/')) !== FALSE) { $module = substr($file, 0, $pos); $file = substr($file, $pos + 1); } list($path, $file) = Modules::find($file, $module, 'widgets/'); if ($path === FALSE) { $path = APPPATH.'widgets/'; } Modules::load_file($file, $path); $file = ucfirst($file); $widget = new $file(); $widget->module_path = $path; return call_user_func_array(array($widget, 'run'), array_slice($args, 1)); } function render($view, $data = array()) { extract($data); include $this->module_path.'views/'.$view.EXT; } function load($object) { $this->$object = load_class(ucfirst($object)); } function __get($var) { global $CI; return $CI->$var; }}
Example
// application/widgets/Hello_world.phpclass Hello_world extends Widget{ function run() { $this->render('hello_world'); }}
In your view call the static “run” method on the widget class:
widget::run('hello_world');
What if you want to see some widgets in some controllers? In my opinion, something basic and simple is to keep the widgets of the CMS in a database with the name and a boolean active and inactive.
Finally, in a query, you get an array of widgets. We can extend the main controller and display all the default widgets (using an array, and a global variable)
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');public $cms_widget = array();class CMS_Controller extends CI_Controller { function __construct() { parent::__construct(); $this->cms_widget = array( 'msg' => TRUE, 'chat' => TRUE, 'video' => TRUE, 'games' => TRUE ); }}
When you call the template of your CMS, you should make a conditional all your widgets to appear in the desired location. For example in column view template:
if($this->cms_widget['msg']) $this->load->view('widget/msg_view');if($this->cms_widget['chat']) $this->load->view('widget/chat_view');if($this->cms_widget['video']) $this->load->view('widget/video_view');if($this->cms_widget['games']) $this->load->view('widget/games_view');
Now, for example. If you are in sight "Games", will show only the corresponding widget.Suppose I want to see the widget "Games" and "Videos". We would only have to disable the remaining widgets
<?phpclass Game extends CMS_Controller { function __construct() { parent::__construct(); } function index() { // Hidden widgets, replacing the values in the array $this->cms_widget = array_merge($this->cms_widget, array( 'msg' => FALSE, 'chat' => FALSE )); $this->load->view('game_view'); } } }