2009-10-23 16 views
14

Recibí algunos códigos de otros artículos para configurar el módulo y el diseño en zend framework. Intenté con mi local. No obtuve un diseño diferente para el módulo predeterminado y administrador. Aquí está mi código para configurar el módulo y el diseño de zend framework.Configuración del módulo y configuración del diseño en zend framework

configuraciones/application.ini

[production] 

# Debug output 
phpSettings.display_startup_errors = 0 
phpSettings.display_errors = 0 

# Include path 
includePaths.library = APPLICATION_PATH "/../library" 

# Bootstrap 
bootstrap.path = APPLICATION_PATH "/Bootstrap.php" 
bootstrap.class = "Bootstrap" 

admin.bootstrap.path = APPLICATION_PATH "/modules/admin/Bootstrap.php" 
admin.bootstrap.class = "admin_Bootstrap" 

# Front Controller 
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" 
resources.frontController.env = APPLICATION_ENV 

# Session 
resources.session.name = "ZendSession" 
resources.session.save_path = APPLICATION_PATH "/../data/session" 
resources.session.remember_me_seconds = 86400 

# Layout 
resources.layout.layout = "layout" 
resources.layout.layoutPath = APPLICATION_PATH "/layouts" 
admin.resources.layout.layout = "admin" 
admin.resources.layout.layoutPath = APPLICATION_PATH "/modules/admin/layouts" 

# Views 
resources.view.encoding = "UTF-8" 
resources.view.basePath = APPLICATION_PATH "/views/" 
resources.view[] = 

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" 
resources.modules[] = 
resources.view[] = 
admin.resources.view[] = 

[staging : production] 

[testing : production] 
phpSettings.display_startup_errors = 1 
phpSettings.display_errors = 1 

[development : production] 
phpSettings.display_startup_errors = 1 
phpSettings.display_errors = 1 

application/Bootstrap.php

<?php 

/** 
* Ensure all communications are managed by sessions. 
*/ 
require_once ('Zend/Session.php'); 
Zend_Session::start(); 

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { 

    protected function _initDoctype() { 
     $this->bootstrap('view'); 
     $view = $this->getResource('view'); 
     $view->navigation = array(); 
     $view->subnavigation = array(); 
     $view->headTitle('Module One'); 
     $view->headLink()->appendStylesheet('/css/clear.css'); 
     $view->headLink()->appendStylesheet('/css/main.css'); 
     $view->headScript()->appendFile('/js/jquery.js'); 
     $view->doctype('XHTML1_STRICT'); 
     //$view->navigation = $this->buildMenu(); 
    } 

    /*protected function _initAppAutoLoad() 
    { 
    $autoloader = new Zend_Application_Module_Autoloader(array(
     'namespace' => 'default', 
     'basePath' => APPLICATION_PATH 
     )); 
    return $autoloader; 
    }*/ 

    protected function _initLayoutHelper() 
    { 
     $this->bootstrap('frontController'); 
     $layout = Zend_Controller_Action_HelperBroker::addHelper(
      new ModuleLayoutLoader()); 
    } 


    public function _initControllers() 
    { 
     $front = Zend_Controller_Front::getInstance(); 
     $front->addModuleDirectory(APPLICATION_PATH . '/modules/admin/', 'admin'); 
    } 

    protected function _initAutoLoadModuleAdmin() { 
     $autoloader = new Zend_Application_module_Autoloader(array(
      'namespace' => 'Admin', 
      'basePath' => APPLICATION_PATH . '/modules/admin' 
     )); 

     return $autoloader; 
    } 

    protected function _initModuleutoload() { 
     $autoloader = new Zend_Application_Module_Autoloader (array ('namespace' => '', 'basePath' => APPLICATION_PATH)); 
     return $autoloader; 
    } 

} 

class ModuleLayoutLoader extends Zend_Controller_Action_Helper_Abstract 
// looks up layout by module in application.ini 
{ 
    public function preDispatch() 
    { 
     $bootstrap = $this->getActionController() 
          ->getInvokeArg('bootstrap'); 
     $config = $bootstrap->getOptions(); 
     echo $module = $this->getRequest()->getModuleName(); 
     /*echo "Configs : <pre>"; 
     print_r($config[$module]);*/ 
     if (isset($config[$module]['resources']['layout']['layout'])) { 
      $layoutScript = $config[$module]['resources']['layout']['layout']; 
      $this->getActionController() 
      ->getHelper('layout') 
      ->setLayout($layoutScript); 
     } 
    } 
} 

aplicación/módulos/admin/Bootstrap.php

<?php 
class Admin_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 
/*protected function _initAppAutoload() 
{ 
    $autoloader = new Zend_Application_Module_Autoloader(array(
     'namespace' => 'admin', 
     'basePath' => APPLICATION_PATH . '/modules/admin/' 
    )); 
    return $autoloader; 
}*/ 
    protected function _initDoctype() { 
     $this->bootstrap('view'); 
     $view = $this->getResource('view'); 
     $view->navigation = array(); 
     $view->subnavigation = array(); 
     $view->headTitle('Module One'); 
     $view->headLink()->appendStylesheet('/css/clear.css'); 
     $view->headLink()->appendStylesheet('/css/main.css'); 
     $view->headScript()->appendFile('/js/jquery.js'); 
     $view->doctype('XHTML1_STRICT'); 
     //$view->navigation = $this->buildMenu(); 
    } 
} 

Por favor, vaya a través de él y quiero saber cómo hacer cualquiera sabe módulo y el diseño en forma correcta configurar ..

Gracias y saludos,

Prasanth P

+0

No entiendo ... ¿por qué ustedes votaron a esta publicación? ¡Esta publicación casi se ve afectada en la búsqueda de Google y es revisada por la mayoría de las personas! ... –

+0

Si las respuestas son incorrectas, por favor vote sólo a respuestas y no para la publicación. Gracias .. –

Respuesta

2

Es necesario utilizar un complemento de controlador para lograr eso, porque el diseño se establece en función de la entrada de solicitud y en el arranque la aplicación no se ha distribuido, por lo que debe usar un complemento de controlador para trabajar en preDispatch y cambiar de diseño.

8

Desde su código:

# Layout 
resources.layout.layout = "layout" 
resources.layout.layoutPath = APPLICATION_PATH "/layouts" 
admin.resources.layout.layout = "admin" 
admin.resources.layout.layoutPath = APPLICATION_PATH "/modules/admin/layouts" 

está utilizando your_app/módulos/admin/layouts/admin.phtml como el diseño del módulo de administración, y supongo que reemplazó your_app/layouts/layout.phtml. Verifique una forma de cambiar entre los módulos y pruebe algo de site.ressources.layout en lugar de resources.layout.layout. soy un novato para zend. echa un vistazo a cómo configurar el bootstrap en http://www.survivethedeepend.com/

el mismo problema y la solución se ha subrayado aquí: http://blog.astrumfutura.com/archives/415-Self-Contained-Reusable-Zend-Framework-Modules-With-Standardised-Configurators.html

24

utilizo enfoque plugin con el código que he escrito:

en Bootstrap principal:

protected function _initPlugins() 
{ 
     // Access plugin 
     $front = Zend_Controller_Front::getInstance(); 
     $front->registerPlugin(new MyApp_Plugin_Module()); 
} 

En el directorio de plugins:

class MyApp_Plugin_Module extends Zend_Controller_Plugin_Abstract 
{ 

    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    { 

     $module = $request->getModuleName(); 
     $layout = Zend_Layout::getMvcInstance(); 

     // check module and automatically set layout 
     $layoutsDir = $layout->getLayoutPath(); 
     // check if module layout exists else use default 
     if(file_exists($layoutsDir . DIRECTORY_SEPARATOR . $module . ".phtml")) { 
      $layout->setLayout($module); 
     } else { 
      $layout->setLayout("default"); 
     } 
} 

Espero que ayude.

+0

¿Dónde pongo este archivo? –

+0

También necesita llamar 'Zend_Layout :: startMvc()' en su arranque antes de incluir este archivo – HorusKol

+0

No puede obtener la ruta al directorio del módulo usando 'Zend_Controller_Front :: getInstance() -> getModuleDirectory()' – Kirzilla

2

Creo que la manera más fácil es verificar el URI_String. Por favor vea abajo:

Tengo un módulo llamado "admin". En la carpeta de diseño tengo 2 directorios. "sitio" y "admin"

\ application \ layout \ sitio \ layout.phtml y \ application \ layout \ admin \ layout.phtml

Añadir este bloque de código en Bootstrap.php Simplemente cambiar la ruta del directorio de diseño.

protected function _initLayout(){ 
    $layout = explode('/', $_SERVER['REQUEST_URI']); 

    if(in_array('admin', $layout)){ 
     $layout_dir = 'admin'; 
    }else{ 
     $layout_dir = 'site'; 
    } 

     $options = array(
      'layout'  => 'layout', 
      'layoutPath' => APPLICATION_PATH . "/layouts/scripts/".$layout_dir, 
    ); 

    Zend_Layout::startMvc($options); 
} 
+0

Eso no funcionó para mí –

+1

No será una buena idea si desea agregar algunas reescrituras fáciles de usar, p. www.mysite.com/user-admin.html –

0
<?php 

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 

    public function _initAutoload() { 
      $autoloader = Zend_Loader_Autoloader::getInstance(); 
      $moduleLoader = new Zend_Application_Module_Autoloader(
        array(
          'namespace' => '', 
          'basePath' => APPLICATION_PATH . '/modules' 

        ) 
      ); 

      return $moduleLoader; 
    } 


protected function _initViewhelpers() 
{ 
    $this->bootstrap('layout'); 
    $layout = $this->getResource('layout'); 
    $view = $layout->getView(); 
    $view->doctype('XHTML1_STRICT'); 
    $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8'); 
} 


protected function _initNavigation() 
{ 
    $this->bootstrap('layout'); 
    $layout = $this->getResource('layout'); 
    $view = $layout->getView(); 
    $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml','nav'); 

    $navigation = new Zend_Navigation($config); 
    $view->navigation($navigation); 
} 

} 
+0

¿Podría ofrecer una pequeña explicación? – cereallarceny

1

Sus preguntas contestadas a mi pregunta, es cierto, yo estaba tratando de averiguar por qué no funcionó en mis módulos de arranque, vistos en su archivo de configuración que usted necesita para agregar la línea

administrador.resources.view [] =

Valew partner!

6

En mi aplicación configuré de esta manera. Funcionó perfectamente.

protected function _initLayout(){ 
    $layout = explode('/', $_SERVER['REQUEST_URI']); 

    if(in_array('admin', $layout)){ 
     $layout_dir = 'admin'; 
    }else if(in_array('default', $layout)){ 
     $layout_dir = 'default'; 
    }else{ 
     $layout_dir = 'default'; 
    } 
     $options = array(
      'layout'  => 'layout', 
      'layoutPath' => APPLICATION_PATH."/modules/".$layout_dir."/views/layouts" 
    ); 
    Zend_Layout::startMvc($options); 
} 
0

diseño y el módulo no está activado en un proyecto de nueva Zend (en ZF versión 1). Necesita estar habilitado y debes hacerlo funcionar.

El diseño funciona para el encabezado y pie de página común para el proyecto Zend de trabajo, por otro lado el módulo se puede usar para los diferentes tipos de acceso, es decir, módulo para el usuario, módulo para administrador, módulo para visitante, etc.

Para una referencia rápida, puede encontrar una explicación completa con un proyecto completo para obtener la idea básica desde aquí, en mi sitio. . http://www.getallthing.com/how-to-use-layout-and-module-in-zend-framework/

¡Buena suerte y ovaciones!

0
$options = array(
     'layout'  => 'layout', 
     'layoutPath' => APPLICATION_PATH."/modules/".$layout_dir."/views/layouts" 
); 
Zend_Layout::startMvc($options); 

Probé algunas otras soluciones de SOF y esta funcionó muy bien. Solo necesitaba apuntar el layoutPath a la carpeta de los diseños reales

Cuestiones relacionadas