How to create a widget system in Codeigniter How to create a widget system in Codeigniter codeigniter codeigniter

How to create a widget system in Codeigniter


Here's Widget library from Wiredesignz

Read more information

/** * 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');            }        }    }