Modular Extensions - HMVC 5

Каждый топик здесь посвящен конкретной библиотеке или наработкам конкретного проекта

Re: Modular Extensions - HMVC 5

Сообщение evil63 » 28 апр 2009, 16:10

Разница будет лишь в том что ты просто скопируешь одну папку или 3 папки например=).
evil63
 
Сообщения: 43
Зарегистрирован: 08 апр 2009, 09:15

Re: Modular Extensions - HMVC 5

Сообщение enshteyns » 10 май 2009, 22:44

Проблема с подгрузкой файла конфига модуля в либе модуля. Раньше работала подгрузка
Код: Выделить всё
$this->ci->load->module($this->module)->load->config('auth'TRUE); 

а с версии 5209 ни
Код: Выделить всё
$this->ci->load->module($this->module)->load->config('auth'TRUE); 
ни
Код: Выделить всё
$this->ci->load->config('auth'TRUE); 


Может кто знает как реализовать сиё? :)
enshteyns
 
Сообщения: 8
Зарегистрирован: 13 ноя 2008, 19:00

Re: Modular Extensions - HMVC 5

Сообщение Sam Dark » 19 май 2009, 20:28

Привёл документацию в актуальное состояние: http://code-igniter.ru/wiki/Modular_Extensions_-_HMVC_5

enshteyns
Код: Выделить всё
$config $this->ci->load->config('auth');  
Аватара пользователя
Sam Dark
 
Сообщения: 824
Зарегистрирован: 16 апр 2008, 19:23
Откуда: Воронеж

Re: Modular Extensions - HMVC 5

Сообщение Be3 » 19 май 2009, 21:32

На сколько актульна сейчас библиотека hmvc? Мне предстоит реализовать проект регионального типа, с большим количеством хитов и сервисов.
Конечно хочется все разбить на модули, пока в качестве модулей использую просто библиотеки, не рашаясь юзаять hmvc ввиду своих багов.
Аватара пользователя
Be3
Киборг убийца
 
Сообщения: 287
Зарегистрирован: 02 июл 2008, 06:25
Откуда: NSK

Re: Modular Extensions - HMVC 5

Сообщение andead » 19 май 2009, 22:20

если проект единичный то думаю смысла использовать hmvc нет
Аватара пользователя
andead
 
Сообщения: 97
Зарегистрирован: 02 фев 2009, 18:49

Re: Modular Extensions - HMVC 5

Сообщение raqystyle » 21 май 2009, 11:12

Господа, помогите!
Во-первых, в самом начале, после копирования файлов, при обращении к приложению, появилась ошибка:
Fatal error: Class 'Router' not found in Z:\home\test4.ru\www\system\libraries\Modules.php on line 91
я ее решил путем дописывания в файле Modules.php после
Код: Выделить всё
<?php (defined('BASEPATH')) OR exit('No direct script access allowed');
/* PHP5 spl_autoload */
spl_autoload_register('modules::load');
spl_autoload_register('modules::autoload'); 

строки
Код: Выделить всё
include_once('system/libraries/MY_Router.php'); 


Но это еще не все. В папке application/modules/texts/controllers/ создаю файл texts.php, в нем класс Texts:
Код: Выделить всё
<?php
class Texts extends Controller {
    function 
index($id) {
        echo 
'text';
        
$this->load->models('mtexts');
        echo 
$this->mtexts->getText($id);
    }
}
?>

модель описал в application/modules/texts/models/mtexts.php
Код: Выделить всё

<?php
class Mtexts extends Model {
    function 
Mtexts() {
        
parent::Model();
    }
    
    function 
getText($id) {
        
$query $this->db->query(select from....);
        
$res $query->row();
        return 
$res->text;
    }
}
?>


в коде основного контроллера вызываю модуль так: $blockCode .= modules::run($module, $id);
где $module = 'texts';

получаю ошибки:
Код: Выделить всё
A PHP Error was encountered

Severity
Warning

Message
Invalid argument supplied for foreach()

Filenamelibraries/Controller.php

Line Number
244

Код: Выделить всё

A PHP Error was encountered

Severity
Notice

Message
Undefined propertyCI::$mtexts

Filename
libraries/Controller.php

Line Number
378

Код: Выделить всё
Fatal errorCall to a member function getText() on a non-object in Z:hometest4.ruwwwsystemapplicationmodulestextscontrollerstexts.php on line 10


КАК БЫТЬ?
raqystyle
 
Сообщения: 7
Зарегистрирован: 21 май 2009, 10:47

Re: Modular Extensions - HMVC 5

Сообщение Tovit » 22 май 2009, 07:51

Из той аброкадабры, что Вы написали, я сделал лишь один вывод -- Вы что-то напутали в путях и базовой настройке CI (вплане пути до папки application).

Второстепенные выводы:
-- Вы не разобрались с методикой подключения библиотек в приложение (в самой основе, даже без ME) -- использовать include_once('system/libraries/MY_Router.php'); -- грубейшее нарушение -- папка system неприкасаемая (за исключением, когда в ней лежит application).

-- Вам следовало бы указать версии CI и ME которые Вы используете.

Что бы не разводить в этой теме флуд на косвенно связанные темы, предлагаю скинуть мне в РМ адрес Вашей электронной почты и я вышлю вам минимальный комплект работающего приложения, в том числе и с ME.
Фантазия! Фантазия! Она поможет... не форум!
Аватара пользователя
Tovit
Модератор
 
Сообщения: 1362
Зарегистрирован: 15 фев 2009, 17:18

Re: Modular Extensions - HMVC 5

Сообщение Tovit » 23 май 2009, 10:43

Натолкнулся на проблему -- не срабатывают роутинги из модулей.

Объяснение простое -- они подгружаются через MY_Router и, далее, вызывается метод предка CI_Router, но переменная $route просто не "переходит" в метод предка.

Решение -- вместо вызова метода предка, перенести код оригинального _set_routing() в MY_Router и расположить его сразу после кода загрузки роутинга модулей.

Возможно, у кого-то есть более красивое и правильное решение?

P.S. Возможно, другие не сталкивались с этой проблемой, я у себя использую свое расширение роутинга для автоматического формирования строки адреса.
Фантазия! Фантазия! Она поможет... не форум!
Аватара пользователя
Tovit
Модератор
 
Сообщения: 1362
Зарегистрирован: 15 фев 2009, 17:18

Re: Modular Extensions - HMVC 5

Сообщение Tovit » 23 май 2009, 23:58

Для контроллеров модулей нет возможности использовать механизм _remap($method)
Немного поразмыслив нашел примитивное решение:

Modules.php строка 59
Код: Выделить всё

    if
($class = self::load($module.'/'.$controller)) {

    if (method_exists($class, $method))    {
        ob_start();
        $args = func_get_args();
        $output = call_user_func_array(array($class, $method), array_slice($args, 1));
        $buffer = ob_get_clean();
        return ($output) ? $output : $buffer;
    }
 


Расширить до
Код: Выделить всё

    if
($class = self::load($module.'/'.$controller)) {

    if(method_exists($class, '_remap')){
        ob_start();
        $args = func_get_args();
        $output = call_user_func_array(array($class, '_remap'), array($args));
        $buffer = ob_get_clean();
        return ($output) ? $output : $buffer;
    }

    if (method_exists($class, $method))    {
        ob_start();
        $args = func_get_args();
        $output = call_user_func_array(array($class, $method), array_slice($args, 1));
        $buffer = ob_get_clean();
        return ($output) ? $output : $buffer;
    }
 

Минус -- в качестве $method в _remap передается массив параметров в виде списка. Т.е. в идеале, нужно реализовать еще и возможность производить повторный роутинг в пределах модуля.

Как считаете, следует ли настолько переделывать механизм? _remap -- на мой взгляд нужен, но нужен ли повторный роутинг в пределах модуля? И выполнить его, по сути, не сложно, но отвечает ли это логике такой архитектуры?

Для меня модуля в веб-приложении -- это самостоятельные сегменты системы. Если у меня есть модуль показывающий статические страницы, он должен иметь свой роутинг, но при этом, должен управляться из основного приложения. Т.е. основное приложение принимает запрос, проверяет, является ли вызов вызовом конкретного модуля и запускает нужный шаблон, где собраны вызовы как модуля статических страниц, так и модуля авторизации, ленты новостей и т.д. При этом, хотелось бы менять роутинг для модуля статических страниц независимо от главного роутинга всего приложения.
При таком подходе даже не нужно грузить роутинг модулей при запуске системы, а вызывать его только при запуске модуля со строкой переданной основным приложением, допустим, без имени самого модуля в строке url...
Фантазия! Фантазия! Она поможет... не форум!
Аватара пользователя
Tovit
Модератор
 
Сообщения: 1362
Зарегистрирован: 15 фев 2009, 17:18

Re: Modular Extensions - HMVC 5

Сообщение denis909 » 24 май 2009, 11:05

Tovit писал(а):...но нужен ли повторный роутинг в пределах модуля? И выполнить его, по сути, не сложно, но отвечает ли это логике такой архитектуры?
Для меня модуля в веб-приложении -- это самостоятельные сегменты системы.

У меня при модульной системе роутинга в модулях нет, хотя изначально он был. Убрал. Модуль - самостоятельная часть системы, работает без роутера по "техническим" url. Необходимость настройки адресной строки обычно специфична для конкретного сайта и смысла прятать эти настройки по модулям нет. Вообще получается удобно даже при модульной архитектуре все настройки хранить в одном месте.

По роутингу. Есть еще вариант. В системе создать контроллер module.php и вызовы модулей проводить через него, вообще не трогая код стандартного роутера. Мне именно этот вариант удобен, т.к. при вызове модуля видно что это модуль по uri(при дебаге), а на сервере уже включаю роутер.

Ниже код контроллера, возможно придется доработать напильником, т.к. писался он не под HMVC. Схема построения адреса такая:

http://www.example.com/module/mname/method
http://www.example.com/module/mname-mcontroller/method
http://www.example.com/module/mname/submod/method
http://www.example.com/module/mname/sub ... ler/method

На диске:

application/modules/mname/controllers/mname.php
application/modules/mname/controllers/mcontroller.php
application/modules/mname/modules/submod/controllers/submod.php
application/modules/mname/modules/submod/controllers/subcontroller.php

Код: Выделить всё

class module extends Controller 
{

    var $_controller = '';
    var $_folder     = APPPATH;
    var $_ci         = null;

    function _assign_libraries() {
        foreach (array_keys(get_object_vars($this)) as $key) {            
            if 
((isset($this->_ci->$key) === false) && (strcasecmp('module', $key) !== 0)) {
                $this->_ci->$key = null;
                $this->_ci->$key = & $this->$key;
            }
        }
    }

    function _remap($method) {
        $segments = array_slice($this->uri->rsegments, 1);
        $segments = $this->_locate_controller($segments);
        $filename = $this->_folder.'controllers/'.$this->_controller.EXT;
        if (is_file($filename) === false) {
            show_404();
        }
        $this->_create_controller();
        if (count($segments) > 0) {
            $method   = $segments[0];
            $segments = array_slice($segments, 1);
        } else {
            $method = 'index';
        }
        $this->_execute_controller($method, $segments);
    }

    function _get_folder($folder) {
        return $this->_folder . 'modules/' . $folder.'/';
    }

    function _set_folder($folder) {
        $this->_folder = $this->_get_folder($folder);    
    
}
    
    function _locate_controller
($segments) {
        foreach($segments as $segment) {
            $folder = preg_replace('/^([^\-]+?)-.*$/', '$1', $segment);
            $file   = preg_replace('/^.*?-([^\-]+)$/', '$1', $segment);
            $this->_controller = $file;
            $this->_set_folder($folder);
            $segments = array_slice($segments, 1);
            $s = $this->_locate_subcontroller($folder, $segments);
            if ($s === false) {
                break;
            } else {
                $segments = $s;
            }
        }
        return $segments;
    }

    function _locate_subcontroller($folder, $segments) {
        $foldername = $this->_get_folder($folder);
        if (is_dir($foldername) === true) {
            $segments = array_slice($segments, 1);
            $segments = $this->_set_folder($folder, $segments);
            $this->_controller = $file;
            return $segments;
        }
        return false;
    }

    function _create_controller() {
        $filename   = $this->_folder.'controllers/'.$this->_controller.EXT;
        $class_name = $this->_controller;
        include_once($filename);
        if (class_exists($class_name) === false) {
            show_error('Class ' . $class_name . ' is not found in controller.');
        }
        $this->_ci = new $class_name($this->_module);
        $this->_assign_libraries();
    }

    function _execute_controller($method, $segments) {
        if (method_exists($this->_ci, '_remap') === true) {
            $this->_ci->_remap($method);
        }
        if (method_exists($this->_ci, $method) === false) {
            show_error('Method ' . $method . ' is not exists in controller.');
        }
        call_user_func_array(array($this->_ci, $method), $segments);
    }
}

 
Аватара пользователя
denis909
 
Сообщения: 187
Зарегистрирован: 27 фев 2009, 00:58

Re: Modular Extensions - HMVC 5

Сообщение Tovit » 24 май 2009, 21:10

Столкнулся с проблемой.
В основном приложении для вывода используется собственная библиотека работающая через load->view, т.е. стандартный интерфейс. В модулях вывод производиться напрямую через load->view. Если вызовы происходят поочередно -- основной шаблон -> модуль со своим шаблоном , затем вызов под шаблона основного документа... вот на последнем шаге получаем ошибку -- файл не найден.

Спасибо, Sam Dark -- вместе с ним обратились на англоязычный форум, к автору надстройки где и получили ответ...
http://codeigniter.com/forums/viewthrea ... 40/#584372 -- обсуждение Проблема-Решение на английском форуме.

с версией 5.2.0.9 у кого-то были проблемы с валидацией форм? Вроде бы эта версия как раз выпущена с исправлениями для валидации, но вот... у меня в любом случае валидация успешна... или не найдены сообщения об ошибках.

Update: Валидация работает, но с накладками -- не срабатывает подгрузка правил из конфига, нужно указывать явно через set_rules. Не слишком удобно.

P.S. Я тут один?
Фантазия! Фантазия! Она поможет... не форум!
Аватара пользователя
Tovit
Модератор
 
Сообщения: 1362
Зарегистрирован: 15 фев 2009, 17:18

Re: Modular Extensions - HMVC 5

Сообщение wd19 » 28 май 2009, 11:27

Пытаюсь прикрутить DX Auth отдельным модулем, не гузятся модели

An Error Was Encountered
Unable to locate the model you have specified: login_attempts

UPD: отмена, сам победил
wd19
 
Сообщения: 6
Зарегистрирован: 28 май 2009, 10:40

Re: Modular Extensions - HMVC 5

Сообщение Tovit » 28 май 2009, 20:06

могли бы и сюда решение разместить -- может кто другой не спрашивал бы.
Фантазия! Фантазия! Она поможет... не форум!
Аватара пользователя
Tovit
Модератор
 
Сообщения: 1362
Зарегистрирован: 15 фев 2009, 17:18

Re: Modular Extensions - HMVC 5

Сообщение wd19 » 29 май 2009, 07:23

Tovit писал(а):могли бы и сюда решение разместить -- может кто другой не спрашивал бы.

Да помещать собственно нечего, больше тупил, но если кому надо:
сложил все в папку modules/auth, включая конфиг и либы, в DX_auth.php заменяем:
Код: Выделить всё
$this->ci =& get_instance(); 

на
Код: Выделить всё
$this->ci Modules::load('auth'); 

вот и вся заморока
wd19
 
Сообщения: 6
Зарегистрирован: 28 май 2009, 10:40

Re: Modular Extensions - HMVC 5

Сообщение Tovit » 01 июл 2009, 00:15

Что бы в будущем избежать вопросов по основам работы с ME. Т.к. получил пару писем.
Решил выложить сюда -- Базовый комплект показывающий разноплановый вызов модулей. Сборка произведена на CI 1.7.1 и ME 5.2.0.9.

Минимальное приложение демонстрирующее базовую структуру для HMVC приложения. И то, как производятся вызовы модулей. Так же, в модуле лежит прокомментированная библиотека.
Вложения
test.zip
Минимальное приложение демонстрирующее базовую структуру для HMVC приложения. И то, как производятся вызовы модулей. Так же, в модуле лежит прокомментированная библиотека.
(397.69 КБ) Скачиваний: 6307
Фантазия! Фантазия! Она поможет... не форум!
Аватара пользователя
Tovit
Модератор
 
Сообщения: 1362
Зарегистрирован: 15 фев 2009, 17:18

Re: Modular Extensions - HMVC 5

Сообщение Sam Dark » 01 июл 2009, 10:33

tovit
Хорошо бы в wiki добавить…
Аватара пользователя
Sam Dark
 
Сообщения: 824
Зарегистрирован: 16 апр 2008, 19:23
Откуда: Воронеж

Re: Modular Extensions - HMVC 5

Сообщение Tovit » 01 июл 2009, 20:16

Добавил в "Файлы и список изменений"... Не нашел возможность подключить файл к статье, потому дал ссылку на файл на форуме.
Фантазия! Фантазия! Она поможет... не форум!
Аватара пользователя
Tovit
Модератор
 
Сообщения: 1362
Зарегистрирован: 15 фев 2009, 17:18

Re: Modular Extensions - HMVC 5

Сообщение mixar » 04 июл 2009, 19:47

Начал разбираться с HMVC, но возникла проблема:
когда обращаюсь site.local, грузится главный view и вложенные view из подключенных модулей.
когда гружу site.local/news/ то грузится только news view, а мне надо чтоб в главном view грузился в контенте news.

структура:
- application
--views
---main_tpl.php
--controllers
---main.php
--modules
---news
----views
-----news_main_tpl.php
----controllers
-----news.php

news.php:
Код: Выделить всё
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class news extends Controller {
    function __construct(){
        parent::__construct();    
    
}
    
    function index
(){
        $this->load->view('news_main_tpl', null);
    }
    
    function widget
($news_count = 1){
        $this->load->view('news_widget_tpl', null);
    }
}
 


main.php:
Код: Выделить всё
class main extends Controller {
    function __construct(){
        parent::__construct();    
    
}
    
    function index
(){
        $this->module('news');
        $this->load->view('main_tpl');
    }
}
 


main_tpl.php:
Код: Выделить всё
<html>
<head>
</head>
<body>
<p>Главный шаблон</p>
<div>Контент</div>
<div><?php echo modules::run('news/widget'); ?></div>
</body>


Подскажите, может я что-то не так делаю?
mixar
 
Сообщения: 7
Зарегистрирован: 03 июл 2009, 17:16

Re: Modular Extensions - HMVC 5

Сообщение Tovit » 04 июл 2009, 23:35

В главном роутинге:
Код: Выделить всё
$route['(.+)'] = 'welcome/$1'; 


А дальше -- анализируете uri через _remap($first_segment).
Фантазия! Фантазия! Она поможет... не форум!
Аватара пользователя
Tovit
Модератор
 
Сообщения: 1362
Зарегистрирован: 15 фев 2009, 17:18

Re: Modular Extensions - HMVC 5

Сообщение mixar » 05 июл 2009, 10:19

Tovit писал(а):В главном роутинге:
Код: Выделить всё
$route['(.+)'] = 'welcome/$1'; 

Правильно ли я понимаю что это правило надо вставить в apllication/config/route.php после $route['default_controller']. Теперь при переходе по ссылке site.local/news/ пишет 404 Page Not Found. Хотя site.local/main/ пашет...

Tovit писал(а):А дальше -- анализируете uri через _remap($first_segment).

Анализировать надо в модулях или в контроллере main? Вроде вы писали что роутинг в контроллерах модулей не работает...

Кажись понял, как надо делать:
http://codeigniter.com/forums/viewreply/365278/
mixar
 
Сообщения: 7
Зарегистрирован: 03 июл 2009, 17:16

Пред.След.

Вернуться в Решения, авторский код и библиотеки

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0