2010-10-12 10 views
8

Ho una taglia di 250 punti su questo ma il sistema non mi consente di avviarlo immediatamente.Copione graduale alla struttura di cartelle basata su moduli per il progetto zend, bounty in arrivo

Sto cercando una spiegazione passo-passo su come andare dalla struttura delle cartelle normale sulla sinistra dove la cartella contiene applicationmodels,views,controllers, alla struttura di cartelle del modulo basata sulla destra dove application contiene una modules cartella che contiene i singoli moduli con il proprio models,views,controllers.

Dico "conversione" perché non credo che zend ci permetta di creare progetti usando l'architettura del modulo dall'inizio, ma se lo facesse, sarebbe bello e rimuoverebbe la necessità di fare manualmente le modifiche alla struttura delle cartelle.

http://img375.imageshack.us/img375/5582/foldersboth.jpg

Ecco la mia esperienza finora

  • Quando creo un modulo zf create module product, la cartella moduli viene generato e una cartella product viene generato al suo interno e la views,controllers,models per quel modulo sono anche generato.

  • Ma ho anche bisogno di spostare il principale views,controllers,models in una cartella modules/default. Se creo quella cartella manualmente e sposto lo views,models,controllers principale, ottengo un bug quando provo ad aggiungere nuovi controller a quel modulo default. Il problema è che ri-genera principale (oggi mancante) views,controllers,models in application e inserisce tale nuovo controller application/controllers/newcont perché non riconosce che la cartella controllori predefinita è stata spostata manualmente application/modules/default/controllers/.

  • Quindi la mia soluzione è stata quella di zf create module default quindi copiare il principale views,models,controllers lì. Finisce per sembrare uguale ma in qualche modo il metodo zf create module fa la differenza. Quando faccio in questo modo, nuovi controller vengono aggiunti correttamente nella application/modules/default/controllers e non application/controllers

metà del problema risolto. Ma quando provo a visualizzare l'applicazione, non vedo nulla dalla vista index/index. Neanche io ricevo errori, ma non vedo nulla. Sospetto che sia perché l'applicazione non sa che la vista index/index è stata spostata.

  • Questo era situato a application/views/scripts/index/index.phtml
  • ma ora è situato a application/modules/default/views/scripts/index/index.phtml

Sto indovinando ho bisogno di apportare modifiche per Application.ini o bootstrap.php o qualche altra posizione . Quindi, quali sono esattamente i passaggi per ottenere questo risultato senza intoppi e farlo funzionare? Sto usando l'ultimo ZF 1.10.8. Si prega di iniziare da creare un nuovo progetto di Zend quindi non c'è confusione sui passaggi esatti.

risposta

10

Ecco quello che ho fatto per cercare di seguire il vostro esempio (da zero):

$ zf create project . 
$ zf create module product 
$ zf create module default 

Ho poi spostato controllers, models e views./application-./application/modules.

Poi ho aperto Application.ini, e sostituito questa linea (che dice a ZF dove trovare controller in un app non modulare):

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" 

con:

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" 

che dice a ZF dove trovare i moduli.

Ho quindi creato manualmente un controller di indice per il modulo del prodotto in modo da poter verificare che funzionasse, cosa che ha fatto. Ho poi ha colpito http://localhost/index/index per vedere se l'azione index del modulo predefinito funzionava ancora, non ha, invece ho ottenuto l'errore:

Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller class ("Default_ErrorController")' in ...

suona come questo è dove devi.

Ci sono due modi per correggere questo errore, e la documentazione è abbastanza fuorviante (forse anche errata). E 'states:

Note that in the default module, controllers do not need a namespace prefix. Thus, in the example above, the controllers in the default module do not need a prefix of 'Default_' -- they are simply dispatched according to their base controller name: 'IndexController' and 'FooController'. A namespace prefix is used in all other modules, however.

ma è chiaro che l'errore sopra riportato indica che ZF è alla ricerca di una classe denominata ErrorController Default_ErrorController. Per risolvere questo problema si può fare una delle due cose:

  • cambiare i nomi classe di applicazioni/modules/default/controller/IndexController.php da IndexController a Default_IndexController, e application/modules/default/controller/ErrorController.php ErrorController-Default_ErrorController
  • O rimuovere questa riga:

    resources.frontController.params.prefixDefaultModule = "1"

da application.ini. Questa linea dice a ZF di usare lo spazio dei nomi 'Default_' sulle classi di moduli predefinite, quindi senza di esso cercherà semplicemente 'IndexController'.Sono andato per la seconda opzione, e http://localhost/index/index ha funzionato come previsto.

Nel tuo caso hai detto che hai una pagina vuota a/index/index, il che significa che sia:

  • hai un problema diverso
  • Avete errori disattivata in modalità di sviluppo
  • Sei l'esecuzione in modalità di produzione in cui gli errori sono disabilitate per default (più probabile)

per controllare l'ultima opzione, Application.ini aperto e temporaneamente cambia phpSettings.display_errors da 0 a 1 nella sezione di produzione. Se poi ottieni lo stesso errore di cui sopra, spero che riuscirai a far funzionare tutto.

Spero che questo sia utile. Tutto quello che posso dire è che non ti affidi troppo a Zend_Tool per la gestione della tua app - non può fare tutto, e spesso è più semplice spostare manualmente le cose piuttosto che provare a fare tutto via. il comando zf; in particolare durante la ristrutturazione.

+0

Grazie Tim, più che utile, ho risolto completamente il mio problema. Inizierò la taglia quando il sistema mi consentirà (penso 2 giorni o qualcosa del genere) e sceglierò questa risposta. – jblue

+0

+1 per la risposta eccellente, in particolare per 'prefixDefaultModule' –

+0

Scusate per la taglia tardiva. Il sistema richiedeva che io attenda 23 ore dal momento in cui ho iniziato la taglia prima che potessi assegnarla + ho dovuto aspettare 2 giorni dopo aver postato la domanda per avviare la taglia. Stupido sistema di taglie. – jblue

1

Bene, ho creato l'IDE di Netbeans.

http://i.stack.imgur.com/n9Zjn.jpg

Im un principiante: P (bisogno 10 punti)

Ogni Bootstrap dovrebbe avere:

<?php 
// Public_Bootstrap replace for Blog_Bootstrap or Administrator_Bootstrap 
// well its for me 
class Public_Bootstrap extends Zend_Application_Module_Bootstrap { 

} 

principale Bootstrap:

<?php 
    class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { 

     protected function _initAutoLoad() { 

      $modLoader = new Zend_Application_Module_Autoloader(
        array(
         'namespace' => '', 
         'basePath' => APPLICATION_PATH . '/modules/public' 
        ) 
     );   

      return $modLoader; 
     } 
     public function _initViewHelpers() { 

      $this->bootstrap(array('frontcontroller', 'view')); 
      $view = $this->getResource('view'); 
      $view->doctype('XHTML1_STRICT'); 
      $view->headMeta()->appendHttpEquiv("Content-Type", "text/html;charset=UTF-8") 
      ->appendName("description", "Some description"); 
    } 
    } 

Application.ini:

[production] 
resources.modules[] = 
phpSettings.display_startup_errors = 0 
phpSettings.display_errors = 0 
includePaths.library = APPLICATION_PATH "/../library" 
bootstrap.path = APPLICATION_PATH "/Bootstrap.php" 
bootstrap.class = "Bootstrap" 
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/" 

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" 
resources.frontController.defaultmodule = "public" 
resources.frontController.prefixDefaultModule = true 

resources.view[] = 

resources.db.adapter = PDO_MYSQL 
resources.db.isDefaultTableAdapter = true 
resources.db.params.host ="localhost" 
resources.db.params.username ="yourUser" 
resources.db.params.password ="yourPassword" 
resources.db.params.dbname ="DBName" 

Il mio bootstrap ha più codice, inclusi i plug-in.