Ответ 1
Этот HMVC хорошо работает для меня. Сейчас я работаю над проектом, использующим этот HMVC.
Просто отредактируйте third_party/MX/Modules.php
, как показано в этой ссылке ниже, и сообщите мне ответ.
Я снимаю все свои волосы... Я искал каждую тему, был бы признателен, если бы кто-нибудь мог указать мне на рабочий пример.
Подтверждение документа: https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc Я могу вызвать другой модуль- > контроллер, используя
modules::run('module/controller/method', $params);
modules::load('module/controller/method', $params);
or
$this->load->module('module/controller');
$this->controller->method();
Проблема: "method()" никогда не вызывается. только конструктор контроллера вызывается каждый раз.
Целью является создание автономных MVC в качестве модуля и использование другими контроллерами.
Но независимо от того, что я делаю, он вызывает только конструктор, метод не вызывается.
Я начал использовать HMVC несколько недель назад, пропустил ли я что-то в документе или не использовал этот способ?
Вот настройка:
modules
|--ztest1
| |--controller/c1.php
|--ztest2
|--controller/c2.php
class C1 extends MX_Controller {
function __construct() {
parent::__construct();
}
function index () {
Modules::run('ztest2/c2/testc2/');
//Modules::load('ztest2/c2/testc2/');
//$this->load->module('ztest2/c2/testc2/');
//$this->c2->testc2();
}
}
class C2 extends MX_Controller {
function __construct() {
parent::__construct();
echo __FILE__." // ".__CLASS__."/".__FUNCTION__.PHP_EOL;
}
function testc2(){
echo __FILE__." // ".__CLASS__."/".__FUNCTION__.PHP_EOL;
}
}
output:
/app/modules/ztest2/controllers/c2.php // C2/__construct
дополнительное примечание: нет ошибки или предупреждения с помощью script. Он просто вызывает конструктор.
Этот HMVC хорошо работает для меня. Сейчас я работаю над проектом, использующим этот HMVC.
Просто отредактируйте third_party/MX/Modules.php
, как показано в этой ссылке ниже, и сообщите мне ответ.
Спасибо за подсказку MC, я наконец выяснил причину. В документе HMVC действительно нет примеров для начинающих.
Для тех, кто может найти этот поток в будущем, исправьте использование здесь:
to call module01/controller01/method00:
//method 1 CORRECT:
$ctlObj = modules::load('module01/controller01/');
$ctlObj->method00();
//or you could use chaining:
modules::load('module01/controller01/')->method00();
//method 1 WRONG:
modules::load('module01/controller01/method00'); //this will only load contructor
---
//method 2 CORRECT:
modules::run('module01/controller01/method00'); //no trailing slash!
//method 2 WRONG:
modules::run('module01/controller01/method00/');
---
//method 3 CORRECT:
$this->load->module('module01/controller01');
$this->controller01->method00();
Я не понимаю, почему метод 3 не удался, когда я впервые попытался... возможно, потому что я перезапустил HTTPD?
Я столкнулся с той же проблемой. Убедитесь, что вы проверяете капитализацию своих каталогов и контроллеров. Он не чувствителен к регистру для различения между модулем и именем контроллера.
//In my case the below did not work
$this->load->module('dashboard/Dashboard');
$this->Dashboard->method();
//but
$this->load->module('dashboard');
$this->Dashboard->method();
//worked
После некоторых попыток добиться вызова контроллера, который не находится ни в одном модуле.
Modules::run('../Controller/method');
Я тоже новичок в CI, и я думал, что у меня такая же проблема. Script казалось, не работает. (без вывода html).
//This did NOT work (did not produce output)
modules::run('module_name/method_name',$data);
// but this DID work??? didn't know why
modules::run('module_name/method_name',$data);
exit();
// turns out you need the echo for output
echo modules::run('templates/login_template',$data);
Это может быть очевидным для многих из вас, но я потратил два часа на поиски ответа.
Таким образом, согласно документации, они говорят, что копируют контроллер в папку контроллера по умолчанию и переходят к контроллеру модулей.
Итак, как мне запустить контроллер, который был перемещен в модули, когда я запускаю его запуск из файла контроллера по умолчанию, если его удалить, не работает, поэтому, чтобы заставить его запускать контроллер внутри модуля в качестве контроллера по умолчанию для запуска.
Итак, нужно ли упоминать имя модуля в маршруте
//echo Modules::run("modulename/controller name of module/method or function name");
echo Modules::run("another/Welcome/callit");
/*echo Modules::run("controller name of a module which you want to call/and its.. function name");*/
echo Modules::run("Second/callit");
или же
$this->load->module('Second');
$this->second->callit();
Но... имя контроллера должно отличаться.. от одного модуля к другому модулю..
**(parameter passing)**
echo "<hr>";
//echo Modules::run("controller name of a module which you want to call/and its.. function name");
$data="peter";
echo Modules::run("Second/callit",$data);
echo "<hr>";
$this->load->module('Second');
$this->second->callit($data);
echo "<hr>";