Modular Extensions - HMVC 5
Материал из Wiki
Содержание |
Для чего нужна библиотека
ME делает CodeIgniter модульным. Модуль — группа независимых компонент CI (обычно это модели, контроллер и отображения, собранные в одной папке), которые можно легко перемещать из одного проекта в другой.
Использовать модули можно непосредственно в качестве модулей, либо подключать их как части отображений.
Лицензия: MIT
Установка
Поместить содержимое архива в папку libraries приложения.
!!! Внимание !!!
Установка HMVC на CI ветки 2.х отличается от установки на ветку 1.х. Для корректной установки, прочтите мануал на англоязычной Wiki
Структура папок
Для хранения модулей используется папка 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 приложения. И то, как производятся вызовы модулей. Так же, в модуле лежит прокомментированная библиотека. скачать с форума
- Последняя версия: 5.2.14
- Последняя опробованная в бою версия: 5.1.40
- Версия адаптированная под ветку 2.x CI Bitbucket
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.