How to create a widget system in Codeigniter

后端 未结 2 836
谎友^
谎友^ 2021-02-02 17:00

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

相关标签:
2条回答
  • 2021-02-02 17:41

    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');
                }
            }
    
        }
    
    0 讨论(0)
  • 2021-02-02 18:01

    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');
    
    0 讨论(0)
提交回复
热议问题