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