2009-10-06 14 views
6

C'è un modo per avere modelli per ogni modulo? Ho 3 moduli, uno è un modulo "contatti". Ho creato un modello per essa in moduli/contatti/modelli/Codes.php Codici controllerL'app modulare Zend Framework, non è in grado di caricare modelli per ogni modulo, caricare automaticamente i modelli?

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

    } 

Codici Modello:

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

L'errore che ottengo: Fatal errore: classe 'Contacts_Model_Codes' non trovata in /Applications/MAMP/htdocs/zf_site/application/modules/contacts/controllers/CodesController.php sulla riga 26

grazie

risposta

5

È necessario registrare lo spazio dei nomi "Contatti_" con il caricatore automatico. Puoi usare Zend_Application_Module_Autoloader per questo.

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

Ciò creerà i seguenti mapping per il modulo all'interno del file di base fornito.

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

Se si utilizza Zend_Application al bootstarp l'applicazione e ne' moduli non dovreste avere bisogno di questo perché i documenti dicono che:

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

Questo è vero solo per ZF 1.8, in questa versione è stato aggiunto il caricatore automatico modulo e Zend_Application utilizza per bootstrap moduli. Nelle versioni precedenti è necessario utilizzare Zend_Application_Resource_Modules – NDM

2

Sto utilizzando la versione 1.9. Questo fa parte del mio 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; 
    } 

L'Eric_Plugin_Modularlayout plug imposta il layout corretto per ogni modulo.

Ho 3 moduli: predefinito, ez, contatti. La cosa divertente è che, in un'azione di contatto, posso chiamare i modelli nella directory ez/models. senza problemi

18

Ho trovato il problema. Ho dimenticato di mettere un file bootstrap con il mio modulo contatti. Ora tutto funziona e posso avere i miei moduli utilizzare i propri modelli.

class Contacts_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 

} 
+5

Aggiungere anche "resources.modules [] =" alla propria applicazione.ini –

+0

Grazie, questo mi ha aiutato. Mi chiedo perché entrambe queste cose non siano state curate da "zf create module x". C'è un caso in cui non li vorresti? – LinusR

5

aggiungere

resources.modules[] = 

Per la vostra configurazione ini

6

ho trovato la soluzione, immagino! :) E 'un problema quando si aggiunge il prossimo risorsa nel file Application.ini

resources.frontController.defaultModule = "Default" 

e anche di utilizzare un qualche tipo di parametri. Penso che sia un Bug.

Il modo corretto per implementare moduli è:

1 - Creare i moduli desiderati e il 'predefinito' Modulo con strumento ZF

2 - In apllication.ini dire ZF in cui i moduli e dove sono i controllori di questi moduli sono, con

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

Utilizza la nota

resources.modules = "" 

e impostare:

resources.frontController.params.prefixDefaultModule = "" 

E 'importante perché strumento di ZF impostarlo su "1". Ecco l'errore. :)

E ricorda NON INSERIRE IL MODULO PREDEFINITO !!

3 - Creare il file di bootstrap per ogni modulo e mettere:

Se il mio modulo è 'Evacol':

<?php 
class Evacol_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 
} 

Salva in/modules/Evacol/ ovviamente

Prendere nota di Evacol_ ... e ..._ Module_Bootstr ... IL NOME DEL MIO MODULO CHE ESTENDE LA CLASSE CORRETTA. Non utilizzare il valore predefinito del file di bootstrap creato con lo strumento zf. L'ho fatto :)

NON MODIFICARE NULLA ALTRO. NON È NECESSARIO.

E voilà! Fidati di me. Funziona!

Era Zend Framework 1.10.8

Problemi correlati