Как создать систему виджетов в Codeigniter

Я создаю пользовательскую CMS в Codeigniter, и я хотел бы иметь систему виджетов, похожую на то, что используется в WordPress.

Например, я хотел бы иметь виджет, который показывает последние 5 сообщений, отображаемых на боковой панели. Я также хотел бы иметь возможность контролировать, какие страницы этот виджет отображается на странице за страницей.

Я использую библиотеку шаблонов Phil Sturgeon , поэтому пример контроллера выглядит так:

$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); 

Я хотел бы придерживаться шаблона MVC, поэтому я не хочу ставить логику в виде боковой панели, о которой я сейчас могу думать.

Является ли HMVC чем-то, что я должен использовать для этого?

Как я могу указать боковую панель, которую виджетов отображать?

Вот библиотека Widget от 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; } } 

пример

 // application/widgets/Hello_world.php class Hello_world extends Widget { function run() { $this->render('hello_world'); } } 

В вашем представлении вызовите статический метод «run» в классе виджетов:

 widget::run('hello_world'); 

Что делать, если вы хотите увидеть некоторые виджеты в некоторых контроллерах? На мой взгляд, что-то основное и простое – сохранить виджеты CMS в базе данных с именем и логическим активным и неактивным.

Наконец, в запросе вы получаете массив виджетов. Мы можем расширить основной контроллер и отобразить все виджеты по умолчанию (используя массив и глобальную переменную)

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

Когда вы вызываете шаблон своей CMS, вы должны сделать условие, чтобы все ваши виджеты отображались в нужном месте. Например, в шаблоне просмотра столбцов:

 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'); 

Теперь, например. Если вы видите «Игры», отобразится только соответствующий виджет. Предположим, я хочу увидеть виджет «Игры» и «Видео». Нам осталось только отключить оставшиеся виджеты

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