Struttura a Moduli - ZF 1.8.2

Ciao a tutti,

da un paio di settimane sto studiando zend framework.

Ho installato la versione 1.8.2.

Vorrei creare una struttura cosi per suddividere due aree diverse del sito:

Application
  -  configs
  -  Admin
     - controllers
     - models
     - views
  -  User
     - controllers
     - models
     - views

Non riesco a capire cosa modificare, con una struttura standard funziona tutto, ma con l'aggiunta di due nuove cartelle (admin e user ) nn funziona nulla.

Grazie mille per l'aiuto che potrete darmi.

Roby

inviato 7 anni fa
robyd
X 0 X

Ho iniziato pure io da poco a sfruttare le potenzialità di zend, non sono dunque un esperto, anzi.

Tu vuoi praticamente creare due aree differenti del tuo sito: vuoi creare due siti web differenti o proprio due aree?

Io al posto tuo non userei quella struttura, rimanendo su una struttura base del modello MVC con Zend Framework mi limiterei a creare controller differenti: admin e user.

Non vedo la necessità di dover ricreare due applicativi web in uno...non so se mi spiego...

P.S. forse hai già risolto il tutto in altro modo? Se si perchè non la indichi?  ;)

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Servirebbe anche a me una dritta.

Utilizzo questo post per riprendere l'argomento.

Uso Zend Framework 1.9.1

La mia intenzione è quella di gestire la mia applicazione in moduli.

Per esempio, aggiungendo il modulo ADMIN, BLOG, NEWS e lasciare in default i controller base, tipo: Home, ChiSiamo, DoveSiamo, Contatti.

Sto utilizzando una classe del tipo:

<?PHP  
  class MiaApplicazione_Layout_Controller_Plugin_Layout extends Zend_Layout_Controller_Plugin_Layout
  {
    public function preDispatch(Zend_Controller_Request_Abstract $request){
      switch ($request->getModuleName()){
        case 'admin':
          $this->_moduleChange('admin');
        }
      }

    protected function _moduleChange($moduleName){
      $basePath = dirname(dirname(dirname($this->getLayout()->getLayoutPath())));
      $this->getLayout()->setLayoutPath($basePath.DIRECTORY_SEPARATOR.$moduleName.'/views/layout');
      $this->getLayout()->setLayout($moduleName);
    }
  }
?>

e nel mio bootstrap, ho inserito il seguente codice:

(prima)

$options = array(  
      'layoutPath' => './application/default/views/layouts',  
      'layout' => 'main',
      'pluginClass' => 'MiaApplicazione_Layout_Controller_Plugin_Layout'
  );                

Zend_Layout::startMvc($options);

(dopo)

$frontController->setControllerDirectory(
        array(
          'default' => './application/default/controllers',
          'admin' => './application/admin/controllers',
          'blog' => './application/blog/controllers'
          'news' => './application/news/controllers'
        )
      );

Ma ricevo questo messaggio di errore:

exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller class ("Blog_IndexController")' in C:\xampp\htdocs\lavoro\MyProject\library\Zend\Controller\Dispatcher\Standard.php:345
Stack trace:
#0 C:\xampp\htdocs\lavoro\MyProject\library\Zend\Controller\Dispatcher\Standard.php(256): Zend_Controller_Dispatcher_Standard->loadClass('IndexController')
#1 C:\xampp\htdocs\lavoro\MyProject\library\Zend\Controller\Front.php(946): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#2 C:\xampp\htdocs\lavoro\MyProject\index.php(81): Zend_Controller_Front->dispatch()
#3 {main}

Come mai ricevo questo errore ??

Grazie

risposto 7 anni fa
C4rLoS
X 0 X

L'IndexController del modulo blog l'hai scritto correttamente?

Come è nominato il file?

Come hai nominato l'oggetto?

risposto 7 anni fa
Mario Santagiuliana
X 0 X

L'IndexController del modulo blog l'hai scritto correttamente?

Come è nominato il file?

Come hai nominato l'oggetto?

si, cioe' no.

Come giustamente indicava l'errore, ho sbagliato a scrivere il controller, ora con Blog_IndexController, funziona tutto.

Non utilizzo più il plugin precedentemente creato per gestire i vari modules, sembra che la nuova versione dello Zend sappia gia' cosa fare, è cosi o sbaglio ??

Un ultima cosa, mi piacerebbe poter gestire più layout, in base al modulo chiamato.

Nella cartella views del modulo admin, è presente la cartella layout, ho provato a modifcare un paio di righe del file main.phtml, ma il controller prende sempre il layout di default.

Cosa dovrei fare ??

Grazie

risposto 7 anni fa
C4rLoS
modificato 7 anni fa
X 0 X

Credo che la risposta alle tue domande la puoi avere qui:

http://framework.zend.com/manual/en/zend.layout.html

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Ho letto, ma non ci ho capito quasi nulla.   :o

allora, ho strutturato cosi' la mia applicazione:

application/

  modules/

    default/

    admin/

    blog/

Io li vedo come tre moduli distinti.

All'interno della cartella default,admin e blog si trovano le sottocartelle

  Controllers/

  models/

  views/

     helpers/

     layouts/main.phtml

     scripts/header.phtml - menu.phtml - footer.phtml

Non uso Zend_Application, ma la struttura precedente.

La documentazione di zend, dice di creare un file .ini ed inserire questo:

[layout]
layout = "foo"
layoutPath = "/path/to/layouts"
contentKey = "CONTENT"

altra documentazione, consiglia di inserire nel file .ini questo:

admin.layout.layoutPath = APPLICATION_PATH "/modules/admin/views/layouts"

Entrambe le soluzioni non vanno.

riesco ad entrare nel modulo->admin, ma il layout che utilizza è quello del default.

Queste sono le righe aggiunte nel bootstra.php, per gestire i moduli:

$frontController->setControllerDirectory(
        array(
          'default' => './application/modules/default/controllers',
          'admin' => './application/modules/admin/controllers',
          'blog' => './application/modules/blog/controllers'
          //'news' => './application/news/controllers'
        )
      );
$frontController->addControllerDirectory('./application/admin/controllers','admin');
$frontController->addControllerDirectory('./application/blog/controllers','blog');
//$frontController->addControllerDirectory('./application/news/controllers','news');
$frontController->setParam('useDefaultControllerAlways', true);
$frontController->addModuleDirectory('./application/modules'); 
$frontController->setDefaultModule('default');
risposto 7 anni fa
C4rLoS
modificato 7 anni fa
X 0 X

Credo che il layout tu possa anche posizionarlo nella cartella superiore a quella "views".

Perchè non usare zend_application?

risposto 7 anni fa
Mario Santagiuliana
X 0 X
Perchè non usare zend_application?

Ho appena iniziato a configurarlo :)

ma senti... le pagine header.phtml, menu.phtml, footer.phtml

devo lasciarle sempre all'interno di views/scripts/ ?

oppure posizionarli all'interno della cartella layouts/scripts ?

risposto 7 anni fa
C4rLoS
X 0 X

Tutto dipende da come vuoi gestire la cosa, a te la scelta  ;)

risposto 7 anni fa
Mario Santagiuliana
X 0 X
Tutto dipende da come vuoi gestire la cosa, a te la scelta  ;)

cioe'??

in questo momento, risiedono all'interno di views/scripts

per farli funzionare anche in layouts/scripts  cosa dovrei fare ??

risposto 7 anni fa
C4rLoS
X 0 X

Stai usando zend_application?

Come hai finito di configurare il tutto?

risposto 7 anni fa
Mario Santagiuliana
X 0 X

questo è il mio bootstrap

<?php

/**
 * Application bootstrap
 * 
 * @uses    Zend_Application_Bootstrap_Bootstrap
 * @package QuickStart
 */
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    /**
     * Bootstrap autoloader for application resources
     * 
     * @return Zend_Application_Module_Autoloader
     */
    protected function _initAutoload()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'Default',
            'basePath'  => dirname(__FILE__),
        ));
        return $autoloader;
    }

    /**
     * Bootstrap the view doctype
     * 
     * @return void
     */
    protected function _initDoctype()
    {
        $this->bootstrap('view');
        $view = $this->getResource('view');
        $view->doctype('XHTML1_STRICT');
    }
}

questo index.php

<?php
// Set the initial include_path. You may need to change this to ensure that 
// Zend Framework is in the include_path; additionally, for performance 
// reasons, it's best to move this to your web server configuration or php.ini 
// for production.
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(dirname(__FILE__) . '/../library'),
    get_include_path(),
)));

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

/** Zend_Application */
require_once 'Zend/Application.php';  

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV, 
    APPLICATION_PATH . '/config/application.ini'
);
$application->bootstrap();
$application->run();

application.ini

[production]
; PHP settings we want to initialize
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0

; Make sure the following is on the include_path
includePaths.library = APPLICATION_PATH "/../library"

; Indicate the path and classname of the bootstrap
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"

; Bootstrap resources:
; - Front Controller
; - Layout
; - Database
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
resources.view[] = 
resources.db.adapter = "PDO_MYSQL"
resources.db.params.host = "localhost"
resources.db.params.username = "xxx"
resources.db.params.password = "xxx"
resources.db.params.dbname = "myproject"
risposto 7 anni fa
C4rLoS
X 0 X

se modifico questa riga:

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts" --> "/layouts/scripts-2"

ricevo qst msg di errore:

Uncaught exception 'Zend_View_Exception' with message 'script 'layout.phtml' not found in path (C:\xampp\htdocs\lavoro\MyProject\application\layouts\scripts2\;C:\xampp\htdocs\lavoro\MyProject\application\views\scripts\)'

di default sembra che vada a leggere la cartella views\scripts.

risposto 7 anni fa
C4rLoS
X 0 X

A colpo d'occhio:

Tu hai già indicato dove si trova la cartella di layout:

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"

Devi indicare per ogni modulo il suo layout...

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Per il modulo ADMIN ho risolto cosi'

admin.resources.layout.layout                                   = admin
admin.resources.layout.layoutPath                               = APPLICATION_PATH "/layouts/scripts"

mentre per il modulo BLOG:

blog.resources.frontController.moduleDirectory                  = APPLICATION_PATH "/modules"
blog.resources.layout.layout                                    = default
blog.resources.layout.layoutPath                                = APPLICATION_PATH "/layouts/scripts"

Grazie ;)

risposto 7 anni fa
C4rLoS
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda