2013-02-18 18 views
8

Wyciągam wszystkie włosy z głowy ... Szukałem każdej nitki, byłbym wdzięczny, gdyby ktoś mógł wskazać mi działający przykład.codeigniter + HMVC cross module call controller-> method

accroding do doc: https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc mogę wywołać inną module-> Regulator użyciu

modules::run('module/controller/method', $params); 
modules::load('module/controller/method', $params); 
or 
$this->load->module('module/controller'); 
$this->controller->method(); 

Problem: "metoda()" nie jest tzw. tylko konstruktor kontrolera jest wywoływany za każdym razem.

Celem jest zbudowanie samodzielnych MVC jako modułów i używanie ich przez inne kontrolery. Ale bez względu na to, co robię, wywołuje ona tylko konstruktora, metoda nie jest wywoływana. Zacząłem używać HMVC kilka tygodni temu, czy tęskniłem za czymś w dokumencie lub nie było używane w ten sposób?
Oto konfiguracja:

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 

dodatkowa uwaga: nie ma błędu lub ostrzeżenia ze skryptu. Po prostu cicho dzwoni do konstruktora.

Odpowiedz

2

Ten HMVC działa dobrze dla mnie. Pracuję teraz nad projektem używającym tego HMVC. Po prostu edytuj third_party/MX/Modules.php, jak pokazano w tym linku poniżej i powiedz mi odpowiedź.

https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/pull-request/5/return-error-messages-instead-of-logging/diff

+0

Dzięki za link! Otrzymałem tę wiadomość: Kontroler modułu nie działa: ztest2/c2/testc2/ – Reed

+0

Twój problem został rozwiązany? –

+0

Jest rozwiązany. Moje odpowiedzi znalazłem poniżej. Przyjąłem twoją odpowiedź, ponieważ pomogło mi to usunąć błąd. Nie wiedziałem, że HMVC wyświetla błąd tylko do zalogowania. dzięki! – Reed

19

Dzięki za końcówki MC, ale w końcu zorientowali się przyczynę. W dokumentacji HMVC rzeczywiście brakuje niektórych przykładów dla początkujących.

Dla każdego, kto może wybrać ten wątek w przyszłości, prawidłową eksploatację tutaj:

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(); 

Nie rozumiem dlaczego metoda 3 zawiodły, kiedy pierwszy raz spróbować ... może dlatego, że wznowiona HTTPD?

+0

Dziękuję Reed. Pomoże to początkującym. UPVOTE :) –

+0

To nie działa dla mnie :-( –

+0

@MostafaShahverdy co nie działa dla Ciebie? Wszystkie 3 metody? – Reed

0

Jestem również nowy w CI i pomyślałem, że mam ten sam problem. Wydawało się, że skrypt nie działa. (brak danych wyjściowych 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); 

Może to być oczywiste dla wielu z was - ale zmarnowałem dwie godziny na szukanie odpowiedzi.

0

więc Zgodnie z dokumentacją, którą mówią, skopiuj sterownik do domyślnego folderu kontrolera i przejdź do kontrolera modułów.

Więc jak uruchomić kontroler, który został przeniesiony do modułów, gdy uruchamiam jego działanie z domyślnego pliku kontrolera, jeśli nie działa, to w jaki sposób sprawić, aby uruchamiał moduł kontrolny wewnątrz jako domyślny kontroler do uruchomienia.

Tak Czy muszę wymienić nazwę moduły też w trasie

1

wpadłem na ten sam problem. Upewnij się, że sprawdzasz wielkie litery w swoich katalogach i kontrolerach. Nie rozróżniana jest wielkość liter w przypadku różnic między modułem a nazwą kontrolera.

//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 
1

Po pewnych próbach uzyskania wywołania kontroler, który nie znajduje się w żadnym module.

Moduły :: uruchom ("../ Controller/method ");