2011-05-05 53 views
6

Tengo este módulo llamado 'olo' que maneja todas nuestras cosas de pedidos en línea.¿Extiende un controlador desde el controlador en otro módulo?

Ahora he hecho un nuevo módulo llamado 'olosec' porque deseo hacer una versión diferente con un ligero cambio de flujo, y algunos otros cambios en algunos de los controladores.

¿Es posible extender un controlador en 'olosec' con un controlador en 'olo'?

A partir de ahora he tratado

class Olosec_CartController extends Olo_CartController 

que arroja un error como

Warning: include_once(Olo/CartController.php): failed to open stream: 
No such file or directory in /httpdocs/library/Zend/Loader.php on line 146 Warning: 
include_once(): Failed opening 'Olo/CartController.php' for inclusion. 
bla bla bla (include path) bla bla bla 

Mi estructura de directorios es algo como esto (gracias tree \F \A y EditPlus++)

+---application 
| +---views 
| | +---scripts 
| | +---layouts 
| | | +---default 
| | | +---admin 
| | +---languages 
| | +---helpers 
| +---modules 
| | +---admin 
| | +---mobile 
| | +---olo 
| | | +---controllers 
| |  |  IndexController.php 
| |  |  MenuController.php 
| |  |  CartController.php 
| |  |  OrderlistController.php 
| | | | 
| | | +---models 
| | | \---views 
| | |  +---helpers 
| | |  \---scripts 
| | |   +---index 
| | |   +---menu 
| | |   +---cart 
| | |   \---orderlist 
| | \---olosec 
| |  +---controllers 
| |  |  IndexController.php 
| |  |  MenuController.php 
| |  |  CartController.php 
| |  |  OrderlistController.php 
| |  | 
| |  +---models 
| |  \---views 
| |   +---helpers 
| |   \---scripts 
| |    +---index 
| |    +---menu 
| |    +---cart 
| |    \---orderlist 
| +---models 
| +---controllers 
| \---configs 
+---library 
+---public 
| +---cli 
| \---default 
+---tests 
\---data 

Actualización

He utilizado este truco "desagradable", que funciona

require_once(APPLICATION_PATH . '/modules/olo/controllers/CartController.php'); 

actualización @ Rakesh

tengo esto en mi rutina de carga ..

function _initAutoloader() { 
    $autoloader = Zend_Loader_Autoloader::getInstance(); 
    $autoloader->setFallbackAutoloader(true); 
    return $autoloader; 
} 

En mi application.ini

autoloadernamespaces.0 = "Zend" 
autoloadernamespaces.1 = "My" 
autoloadernamespaces.2 = "Something" 
+0

@Tomalak Geret'kal: ¿Qué pasa con un saludo frito;) Y sí, el 'yo' ... Siempre me olvido de mayúsculas. ¡Pero gracias por la edición! – Phliplip

+0

Aunque solo quiso ser cortés con su saludo, ya que Stack Overflow no es un tablero de mensajes, preferimos que las preguntas solo contengan la pregunta. Ahorra espacio, evita la hinchazón y mantiene feliz el TOC. :) –

+0

@Tomalak Geret'kal: lo tendré en cuenta;) – Phliplip

Respuesta

1

Por qué no tienen una carpeta de biblioteca personalizada para las clases comunes

application/ 
    library/ < for common classes 

Si está utilizando algunas clases no sólo en un controlador, pero en muchos lugares en su proyecto este es un buen enfoque.

Simplemente tiene que agregar esta nueva carpeta application/library/ a su include path en su archivo boostrap.

Otro enfoque es tener un ayudante de acción. Pero como describí, la carpeta de clases comunes debería ser una buena solución. Sin embargo he encontrado algunos recursos interesantes, la mayoría de ellos están a punto de codificación módulo de cruz, sino que puede ayudar a usted de todos modos http://zend-framework-community.634137.n4.nabble.com/Code-re-use-across-modules-td668554.html y How to Use Same Models in Different Modules in Zend Framework?


Vamos a describir otro enfoque

class BasicController extends Zend_Controller_Action 
{ 
    public static $variable = ''; 

    public function init() 
    { 
     self::$variable = 'assign value'; 
    } 
} 

class HomeController extends BasicController 
{ 
    public function indexAction() 
    { 
     $bioVar = parrent::$variable; 
    } 
} 

Esto es mejor que los controladores se extienden simplemente porque representan acciones y cada acción tiene una secuencia de comandos de vista correspondiente. Sin embargo, todas sus clases deben registrarse en el autocargador.

+1

Ya tengo toda la biblioteca extensa, pero las cosas que están en la clase de controlador no las consideraría como algo para poner en la biblioteca - I entiende tu idea Pero veo la biblioteca como una caja de herramientas que puedo reutilizar en otro proyecto, y los controladores son clases que manejan los datos de flujo, entrada, manejo del modelo y preparativos para los scripts de vista. – Phliplip

+0

Eche un vistazo a mi edición. –

1

Si tiene instancias de la clase del autocargador Zend, el error debería desaparecer.

Debe tener el siguiente código en su arranque.archivo PHP:

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

En general, los controladores se cargan a través de Zend_Controller_Dispatcher, se debe utilizar Zend_Application_Module_Autoloader para crear instancias de la clase de otros controladores.

+0

He actualizado mi pregunta con el código de mi bootstrap. – Phliplip

+0

¿Puedes probar el anterior? Avísame si eso funciona. –

+1

En realidad, decidí que extender el módulo de pedido a mi módulo móvil podría ser una muy mala idea, ya que es una plataforma diferente. Así que solo fui con un módulo 'en blanco' y copié los bits que necesitaba. Pero la idea de extender módulos, podría ser una idea bastante buena para un módulo de artículos/noticias. – Phliplip

Cuestiones relacionadas