How to create a widget system in Codeigniter
Asked Answered
P

2

13

I am creating a custom CMS in Codeigniter and I'd like to have a widget system similar to what is used in Wordpress.

For example, I'd like to have a widget that shows the last 5 posts displayed on the sidebar. I'd also like to be able to control what pages this widget appears on page-by-page basis.

I am using Phil Sturgeon's Template library, so an example controller looks like:

$this->template->set_partial('header', 'layouts/header');
$this->template->set_partial('footer', 'layouts/footer');
$this->template->set_partial('sidebar', 'layouts/sidebar');

$this->data['title'] = "Create Post";
$this->template->build('create', $this->data);

I'd like to stick with the MVC pattern, so I don't want to put logic in the sidebar view, which is the only thing I can think of right now.

Is HMVC something I should be using for this?

How can I tell the sidebar which widgets to display?

Pavyer answered 19/6, 2012 at 15:46 Comment(2)
you would need to write a library to handle this for you.. and then call the library in your controller, define some configs in the controller and then generate the code in the view.Characharabanc
Hope this might be useful: ellislab.com/forums/viewthread/109584Kuhns
M
12

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.php
class 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');
Misbeliever answered 19/6, 2012 at 16:55 Comment(2)
I am newbie in CI. "Read more information" link is not working. and where to put Widget class. I am getting "Class 'Widget' not found" error. I Placed file into widget folder. Any helpWeisler
2012 post dude.. CodeIgniter Version 2.1.3. Now 2017 CodeIgniter Version 3.1.5. You need to see changelog.Misbeliever
J
7

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

<?php
class 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');
            }
        }

    }
Jollity answered 19/6, 2012 at 17:11 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.