Modular Extensions - HMVC 5
Материал из Wiki
Содержание |
Для чего нужна библиотека
ME делает CodeIgniter модульным. Модуль — группа независимых компонент CI (обычно это модели, контроллер и отображения, собранные в одной папке), которые можно легко перемещать из одного проекта в другой.
Использовать модули можно непосредственно в качестве модулей, либо подключать их как части отображений.
Лицензия: MIT
Установка
Поместить содержимое архива в папку libraries приложения.
Структура папок
Для хранения модулей используется папка application/modules, которую вам необходимо создать.
application
config
…
modules
welcome
controllers
views
models
blog
controllers
Возможности
Каждый контроллер может содержать массив $autoload, в котором можно задать элементы для их загрузки перед запуском конструктора. Данная возможность может быть использована совместно с module/config/autoload.php, однако использование $autolaod действует в рамках одного контроллера.
Вызов Modules::run() буферизуется. Всё, что было выведено при помощи print и echo возвращается run(). $this->load->view() можно использовать без return, как в обычном контроллере.
Контролеры могут быть загружены как переменные класса или как отдельные контроллеры при помощи $this->load->module('module/controller'); или просто $this->load->module('module'), если имя контроллера совпадает с именем модуля.
Каждый загруженный контроллер может быть использован как библиотека: $this->module_controller->do_something(), но у него есть доступ к собственным методом и библиотекам не зависимо от того, как его вызвали.
Все контроллеры модулей доступны по URL вида module/controller/method или module/method если имена модуля и контроллера совпадают.
Метод _remap() можно всё так же использовать для контроля доступа к контроллеру или для того, чтобы показать ошибку.
Замечания
Контроллеры всё так же можно загружать из подпапок application/controllers.
Для базовых контроллеров вместо MY_Controller используйте application/libraries/MX_Controller.php.
MX_Loader с версии 5.2.05 — штука устаревшая.
modules::run() теперь предназначена только для того, чтобы возвращать отрендеренные части View. Синтаксис:modules::run('module/controller/method', $var1, $var2, …, $varN).
Для вызова однго контроллера из другого можно использовать $this->load->module() или modules::load().
У Loader-а можно использовать method chaining: $this->load->library('validation')->run().
spl_autoload PHP5 позволяет свободно расширять контроллеры, модели и библиотеки из application/libraries, не требуя при этом явно их подключать через include или require.
$config = $this->load->config('config_file'), загружает файл конфигурации (в т.ч. из папки модуля).
Модули и библиотеки также загружаются из поддиректорий.
Примеры
Вывод результата работы контроллера в отображении
<?php echo modules::run('module/controller/method', $var_1, ...$var_n); ?>
Пример:
views/layout.php
<?php modules::run('taglist') ?>
modules/taglist/controllers/taglist.php
<?php
class Taglist extends Controller {
function index(){
$this->load->model('post');
$tags = $this->post->getTagList();
$this->load->view('taglist/index', array('tags' => $tags));
}
}
Использование языковых файлов
application/modules/home/language/home_lang.php
Контроллер:
$this->load->language('home');
Отображение:
<?php echo $this->lang->line('name'); ?>
Если требуется указать язык файла:
$this->load->language('home', 'english');
Перекрытие конфигурационных файлов
В модуле можно перекрыть стандартные конфигурационные файлы, создав директорию config и положив туда одноимённые файлы:
application
|-modules
|-blog
|-config
|-controllers
Использование базового контроллера
config/autoload.php
$autoload['libraries'] = array('Base_Controller');
libraries/Base_Controller.php
class Base_Controller extends Controller {
function say_hello($name){
echo 'Hello, '.$name;
}
}
controllers/test.php
class Test extends Base_Controller {
function index(){
$this->say_hello('Alexander');
}
}
Вызов контроллера в контроллере
Для вызова модульного контроллера можно использовать $this->load->module() или modules::load(). При этом можно сразу же вызывать методы загруженного контроллера:
$this->load->module('mymodule')->run().
Вызов профайлера
Профайлер возможно вызвать двумя способами.
Стандартный для CI:
$this->output->enable_profiler(TRUE);
Для всех контроллеров, задав значение в config.php (только ME):
$config['enable_profiler'] = true;
Расширение Loader
MX_Loader с версии 5.2.05 — штука устаревшая. Иногда требуется свой алгоритм подгрузки. Чтобы каждый раз не править код ME, можно расширить класс Loader. Создаём файл MX_Loader:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* Modular Extensions loader class extension
*
* install this file as application/libraries/MX_Loader.php
*
**/
class MX_Loader extends Loader {
}
Конструктор использовать не рекомендуется.
Известные неприятности
Использование Parser
class Blog extends Controller {
function index(){
$this->load->module('news')
$this->parser->parse('tpl', array(), TRUE);
}
}
Выполняется в контексте первого загруженного контроллера, который отдаётся get_instance() библиотеки Parser, а не текущего модуля. Возможное решение: переписать Parser.
Полезняшки
Куда сообщать об ошибках
На русском сообщать можно Sam Dark-у или на русскоязычном форуме в разделе «Баг-репорты». На английском — в тему поддержки HMVC на официальном форуме.
Файлы и список изменений
Минимальное приложение демонстрирующее базовую структуру для HMVC приложения. И то, как производятся вызовы модулей. Так же, в модуле лежит прокомментированная библиотека. скачать с форума
2009-06-30, 5.2.10
- Контроллеры можно располагать в поддиректориях (module/controllers/subdir)
- Модели, отображения можно загружать из других модулей.
2009-05-19, 5.2.09
2009-02-25, 5.2.01
2008.11.04, 5.1.40
- modules::run() теперь буферизуется и возвращается.
2008.11.04, 5.1.39
- Полные пути при ошибках загрузки чего-либо.
- Loader ME теперь можно расширить (см. выше).
2008.11.02, 5.1.38
- Оптимизирован modules::find.
- Исправлена неправильная загрузка database.
2008.10.31, 5.1.37
- Исправлен баг при загрузке библиотек.
2008.10.29, 5.1.36
- Улучшена совместимость loader-а с CI 1.7. (фикс для form_validation).
- Файлы модулей можно загружать из подпапок. Загрузка файлов из других модулей не рекомендуется.
$this->load->library('subdir/some_lib'); // modules/{$module}/libraries/subdir/some_lib.php
2008.10.21, 5.1.35
- Соместимость с CI 1.7 SVN.