2009-10-06 7 views
6

Czy istnieje sposób na modele dla każdego modułu? Mam 3 moduły, jeden to moduł "kontakty". stworzyłem model dla niego w modułach/Kontakty/modeli/Codes.php Kody ControllerAplikacja modularna Zend Framework, nie może załadować modeli dla każdego modułu, autoloading modeli?

class Contacts_CodesController extends Zend_Controller_Action 
{ 

    public function init() 
    { 
     /* Initialize action controller here */ 
    $this->view->messages = $this->_helper->flashMessenger->getMessages(); 

    } 

    public function indexAction() 
    { 

    $codesTable = new Contacts_Model_Codes(); 

    } 

Kody Model:

class Contacts_Model_Codes extends Zend_Db_Table 
{ 
    protected $_name = 'codes'; 
} 

Błąd pojawia się: krytyczny error: Klasa 'Contacts_Model_Codes' nie została znaleziona w /Applications/MAMP/htdocs/zf_site/application/modules/contacts/controllers/CodesController.php on line 26

dziękuję

Odpowiedz

5

Musisz zarejestrować przestrzeń nazw "Kontakty" za pomocą automatycznego programu ładującego. Możesz użyć Zend_Application_Module_Autoloader do tego.

$autoloader = new Zend_Application_Module_Autoloader(array(
     'namespace' => 'Contacts_', 
     'basePath' => dirname(__FILE__) . '/modules/cotacts', 
    )); 

Spowoduje to utworzenie następujących odwzorowań dla twojego modułu w podanej przez ciebie bazie.

api/   => Api 
forms/  => Form 
models/  => Model 
    DbTable/ => Model_DbTable 
plugins/  => Plugin 

Jeśli używasz Zend_Application do boostrap swoją aplikację i to moduły nie ma potrzeby tego powodu docs powiedzieć, że:

When using module bootstraps with Zend_Application, an instance of Zend_Application_Module_Autoloader will be created by default for each discrete module, allowing you to autoload module resources.

+1

To tylko prawdziwe dla ZF 1.8, w tej wersji dodano moduł autoloader i Zend_Application używa go do bootstrap modułów. W starszych wersjach będziesz musiał użyć Zend_Application_Resource_Modules – NDM

2

używam wersji 1.9. To jest część mojego bootstrap:

protected function _initAutoload() { 
    $modelLoader = new Zend_Application_Module_Autoloader(array(
        'namespace' => '', 
        'basePath' => APPLICATION_PATH.'/modules/default') 

     ); 
} 

    protected function _initAutoloaders() 
    { 
     $this->getApplication()->setAutoloaderNamespaces(array('Eric_')); 
     return $this; 
    } 

    protected function _initPlugins() 
    { 
     $this->bootstrap('autoloaders'); 
     $this->bootstrap('frontController'); 

     // register the plugin for setting layouts per module 
     $plugin = new Eric_Plugin_Modularlayout(); 
     $this->frontController->registerPlugin($plugin); 
      return $modelLoader; 
    } 

Eric_Plugin_Modularlayout Wtyczka ustawia prawidłowy układ dla każdego modułu.

Mam 3 moduły: domyślny, ez, kontakty. Zabawne jest to, że w akcji kontaktów mogę nazwać modele w katalogu ez/models reż. bez problemu.

18

Znalazłem problem. Zapomniałem umieścić plik bootstrap w moim module kontaktów. Teraz wszystko działa i mogę mieć moje moduły używać własnych modeli.

class Contacts_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 

} 
+5

Dodaj także "resources.modules [] =" do twojego application.ini –

+0

Dzięki, pomogło mi to. Zastanawiam się, dlaczego obie te rzeczy nie zostały załatwione przez "zf create module x". Czy istnieje przypadek, w którym nie chcesz ich? – LinusR

5

dodać

resources.modules[] = 

do swojej konfiguracji ini

6

Znalazłem rozwiązanie, myślę! :) Jest to problem, gdy dodasz kolejny zasób w pliku application.ini

resources.frontController.defaultModule = "Default" 

a także użyć pewnego rodzaju parametrów. Myślę, że to jest błąd.

Poprawny sposób do wdrożenia modułów:

1 - Tworzenie odpowiednich modułów i 'Domyślne' Module z narzędzia zf

2 - W apllication.ini powiedzieć ZF gdzie moduły i gdzie regulatory tych modułów są, z

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" 
resources.frontController.moduleControllerDirectoryName = "controllers" 

zastosowanie znanych

resources.modules = "" 

I set:

resources.frontController.params.prefixDefaultModule = "" 

Jest to ważne, ponieważ narzędzie zf ustawić ją na "1". Oto błąd. :)

I pamiętaj NIE UMIESZCZAJCIE MODUŁU DOMYŚLNEGO!

3 - Tworzenie pliku bootstrap dla każdego modułu i umieścić:

Jeśli mój moduł jest 'Evacol':

<?php 
class Evacol_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 
} 

zapisać go/moduły/Evacol/ oczywiście

Zwróć uwagę na: Evacol_ ... i ... Module_Bootstr ... NAZWA MOJEGO MODUŁU PRZEDŁUŻAJĄCEGO PRAWIDŁOWĄ KLASĘ. Nie używaj domyślnej wartości pliku bootstrap utworzonego za pomocą narzędzia zf. Zrobiłem to :)

NIE ZMIENIAJ WSZYSTKICH INNYCH. TO NIE JEST NIEZALEŻNE.

I voila! Zaufaj mi. To działa!

Było Zend Framework 1.10.8

Powiązane problemy