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 приложения. И то, как производятся вызовы модулей. Так же, в модуле лежит прокомментированная библиотека. скачать с форума

  • Последняя версия: 5.2.14
  • Последняя опробованная в бою версия: 5.1.40

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.
Личные инструменты