Foros del Web » Programando para Internet » PHP » Zend »

Clases en los modelos y Zend_Controller_Action_HelperBroker

Estas en el tema de Clases en los modelos y Zend_Controller_Action_HelperBroker en el foro de Zend en Foros del Web. Saludos corillo, Estaba experimentando con el Zend_Controller_Action_HelperBroker y me resulto el ejemplo que tomé de http://devzone.zend.com/article/3350 . Ahora, en el módulo Admin cree una clase ...
  #1 (permalink)  
Antiguo 18/02/2011, 10:26
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 11 años
Puntos: 1517
Clases en los modelos y Zend_Controller_Action_HelperBroker

Saludos corillo,

Estaba experimentando con el Zend_Controller_Action_HelperBroker y me resulto el ejemplo que tomé de http://devzone.zend.com/article/3350.

Ahora, en el módulo Admin cree una clase en el directorio de models llamado Admin_Model_Upload. Esto lo llamaba así en el controlador y no tenía problemas. Pero desde que introduje el ejemplo que trae ese árticulo, me dejó de funcionar. Entonces lo que hice fue una modificación al código que propone ese artículo para cargar los modelos por de ese módulo de Admin. Ahora me volvió a funcionar usando el Helper. Mi pregunta es ¿hay que hacer alguna modificación a algún archivo para que me reconozca la ruta Admin_Model_Upload?

Tengo declarado el Bootstrap en el módulo de Admin con el siguiente código:
/application/modules/Admin/Bootstrap.php
Código PHP:
Ver original
  1. <?php
  2. class Admin_Bootstrap extends Zend_Application_Module_Bootstrap
  3. {
  4.  
  5. }

El código que uso ahora en el helper, para cargar los modelos que hay en el módulo de Admin es:
/library/Helper/Loader.php
Código PHP:
Ver original
  1. <?php
  2. /**
  3.  * Action Helper for loading forms/models
  4.  *
  5.  * @uses Zend_Controller_Action_Helper_Abstract
  6.  */
  7. class Helper_Loader extends Zend_Controller_Action_Helper_Abstract
  8. {
  9.     /**
  10.      * @var Zend_Loader_PluginLoader
  11.      */
  12.     private $_pluginLoader;
  13.  
  14.     /**
  15.      * Constructor: initialize plugin loader
  16.      *
  17.      * @return void
  18.      */
  19.     public function __construct()
  20.     {
  21.         $this->_pluginLoader = new Zend_Loader_PluginLoader();
  22.     }
  23.  
  24.     /**
  25.      * Load a form/model with the provided options
  26.      *
  27.      * @param string $name
  28.      * @param string $type
  29.      * @param array|Zend_Config $options
  30.      * @return Zend_Form
  31.      */
  32.     private function _load($name, $type = 'form', $options = null)
  33.     {
  34.         $module  = $this->getRequest()->getModuleName();
  35.         $front   = $this->getFrontController();
  36.         $default = $front->getDispatcher()
  37.                          ->getDefaultModule();
  38.         if (empty($module)) {
  39.             $module = $default;
  40.         }
  41.         $moduleDirectory = $front->getControllerDirectory($module);
  42.         $directory  = dirname($moduleDirectory) . '/' . strtolower((string) $type) . 's';
  43.  
  44.         $prefix = (('default' == $module) ? '' : ucfirst($module) . '_')
  45.                 . ucfirst((string) $type) . '_';
  46.         $this->_pluginLoader->addPrefixPath($prefix, $directory);
  47.  
  48.         $name      = ucfirst((string) $name);
  49.         $formClass = $this->_pluginLoader->load($name);
  50.         return new $formClass($options);
  51.     }
  52.  
  53.     /**
  54.      * Strategy pattern: call helper as broker method
  55.      *
  56.      * @param  string $name
  57.      * @param  string $type
  58.      * @param  array|Zend_Config $options
  59.      * @return Zend_Form
  60.      */
  61.     public function direct($name, $type = 'form', $options = null)
  62.     {
  63.         return $this->_load($name, $type, $options);
  64.     }
  65. }

Y en el bootstrap que está en application:
/application/Bootstrap.php
Código PHP:
Ver original
  1. <?php
  2. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  3. {
  4.     protected function _initSession()
  5.     {
  6.         Zend_Session::start();
  7.     }
  8.  
  9.     protected function _initHelper()
  10.     {
  11.         Zend_Controller_Action_HelperBroker::addPrefix('Helper');
  12.     }
  13. }

La forma como lo llamo en el controlador:
Código PHP:
Ver original
  1. $this->_helper->loader('upload', 'model'); // Retorna algo como Admin_Model_Upload
  2. // o
  3. $this->_helper->loader('fomulario', 'form'); // Retorna algo como Admin_Form_Formulario

¡¡¡Muchas gracias!!!
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 18/02/2011 a las 10:31
  #2 (permalink)  
Antiguo 18/02/2011, 15:39
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 14 años
Puntos: 2135
Respuesta: Clases en los modelos y Zend_Controller_Action_HelperBroker

El problema es que ese loader, lo que hace es buscar como bien dices en Admin_Model_Upload -> Admin/Model/Upload.php el cual no existe ya que lo que tu quieres es admin/models/Upload.php.

Te recomendaría usar el mismo autloader que te brinda Zend para tus módulos ya que te ahorras ese trabajo y solo instancias: $upload = new Admin_Model_Upload(). Aparte de que ya trae un mapeo de que resources y sus carpetas necesita cargar, lo cual no tiene la implementación que manejas.

Saludos.
  #3 (permalink)  
Antiguo 18/02/2011, 20:29
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 11 años
Puntos: 1517
Respuesta: Clases en los modelos y Zend_Controller_Action_HelperBroker

Gracias. Bueno en realidad ese loader la encuentra, porque le coloco la letra s mientras reconstruyo la ruta. Pero ese es el problema, que si intento instanciarlo con el mismo autoloader no me deja. Trate hasta colocando los parentesis al final y como quiera no me sale. Fue en el momento que añadí el helper.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #4 (permalink)  
Antiguo 19/02/2011, 06:53
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 12 años, 4 meses
Puntos: 845
Respuesta: Clases en los modelos y Zend_Controller_Action_HelperBroker

Estas seguro que te funcionaba antes abimaelrc ?, porque el helper no interviene en nada que tenga que ver con el load de los diferentes resources types, comproba que en tu application.ini tenes una linea que dice asi:

Código INI:
Ver original
  1. resources.modules[] =

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 19/02/2011, 09:03
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 11 años
Puntos: 1517
Respuesta: Clases en los modelos y Zend_Controller_Action_HelperBroker

Lo tenía pero sin los corchetes, le coloqué los corchetes y continúa sin aparecer con la ruta, ejemplo new Admin_Form_Foo = Admin/forms/Foo.php. Esto es lo que tengo en el
application.ini
Código PHP:
Ver original
  1. [production]
  2. phpSettings.display_startup_errors = 0
  3. phpSettings.display_errors = 0
  4. includePaths.library = APPLICATION_PATH "/../library"
  5. bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
  6. bootstrap.class = "Bootstrap"
  7. appnamespace = "Application"
  8. resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
  9. resources.frontController.params.displayExceptions = 0
  10. resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
  11. resources.modules[] =
  12.  
  13. resources.layout.layoutPath = APPLICATION_PATH "/layouts"
  14. resources.layout.layout = "index"
  15.  
  16. autoloaderNamespaces[] = "Db_"
  17.  
  18. [staging : production]
  19.  
  20. [testing : production]
  21. phpSettings.display_startup_errors = 1
  22. phpSettings.display_errors = 1
  23.  
  24. [development : production]
  25. phpSettings.display_startup_errors = 1
  26. phpSettings.display_errors = 1
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #6 (permalink)  
Antiguo 19/02/2011, 09:45
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 12 años, 4 meses
Puntos: 845
Respuesta: Clases en los modelos y Zend_Controller_Action_HelperBroker

Es raro, utilizando tu codigo a mi me funciona de las dos formas, aunque veo algunas irregularidades, estas utilizando Zend_Tool ? o estas generando a mano ?, trabajas en Win o *nix ?(Admin no es lo mismo que admin), si no lo registras con el Broker, se soluciona el problema ?

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #7 (permalink)  
Antiguo 20/02/2011, 09:16
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 14 años
Puntos: 2135
Respuesta: Clases en los modelos y Zend_Controller_Action_HelperBroker

Estas usando la última versión de Zend?
  #8 (permalink)  
Antiguo 20/02/2011, 11:47
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 11 años
Puntos: 1517
Respuesta: Clases en los modelos y Zend_Controller_Action_HelperBroker

@masterpuppet, En ese proyecto fue todo a mano. Trabajo en Win y tengo declarado el directorio como Admin con mayúscula

@GatorV, sí, lo bajé hace escasamente 2 semanas de la página oficial.

Ahora para salir de dudas, cree un nuevo framework. Hice estos pasos
1. zf create project ./ -> e hice los cambios necesarios en el apache para que reconociera la ruta, ejecute en el navegador localhost y me trajó "Welcome to the Zend Framework!....."
2. Cree un directorio llamado modules y dentro de él otro llamado default y los archivos models, controllers y views dentro del default.
3. Modifiqué el application.ini y le coloqué
Código PHP:
Ver original
  1. resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
  2. resources.modules[] =
4. Cree un directorio llamado Admin dentro de modules y copie y pegué los directorios controllers, models y views del directorio de default hacia el el de Admin y modifiqué el nombre de las clases de los controllers a que sean
Admin_IndexController y Admin_ErrorController.
5. Cree en el directorio de models que está en el directorio de Admin, un archivo llamado Foo.php con el siguiente código
Código PHP:
Ver original
  1. <?php
  2. class Admin_Model_Foo
  3. {
  4.    
  5. }
6. Modifiqué el Admin_IndexController a que sea de esta forma
Código PHP:
Ver original
  1. <?php
  2.  
  3. class Admin_IndexController extends Zend_Controller_Action
  4. {
  5.  
  6.     public function init()
  7.     {
  8.         /* Initialize action controller here */
  9.     }
  10.  
  11.     public function indexAction()
  12.     {
  13.         $foo = new Admin_Model_Foo;
  14.     }
  15.  
  16.  
  17. }
Cuando coloco la dirección localhost/admin me sale el error
Fatal error: Class 'Admin_Model_Foo' not found

¿Me falta algo?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #9 (permalink)  
Antiguo 20/02/2011, 12:05
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 12 años, 4 meses
Puntos: 845
Respuesta: Clases en los modelos y Zend_Controller_Action_HelperBroker

El Bootstrap del admin lo creaste ?
__________________
http://es.phptherightway.com/
thats us riders :)
  #10 (permalink)  
Antiguo 20/02/2011, 12:19
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 11 años
Puntos: 1517
Respuesta: Clases en los modelos y Zend_Controller_Action_HelperBroker

Ok, ahora sí, me faltaba en este proyecto indicar el bootstrap de admin, continúo este y les dejo saber si tengo problemas con lo que había hecho.

Gracias
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Etiquetas: clases, modelos, zend-controller
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:28.