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

Problemas con Forms tras pasar a organización modular

Estas en el tema de Problemas con Forms tras pasar a organización modular en el foro de Zend en Foros del Web. Un saludo a todos. Hacéis un gran trabajo. Soy primerizo en zend framework asi que todavía estoy en rodaje con este tema. El problema que ...
  #1 (permalink)  
Antiguo 24/06/2011, 12:37
 
Fecha de Ingreso: junio-2011
Ubicación: Granada
Mensajes: 19
Antigüedad: 12 años, 10 meses
Puntos: 0
Problemas con Forms tras pasar a organización modular

Un saludo a todos. Hacéis un gran trabajo.

Soy primerizo en zend framework asi que todavía estoy en rodaje con este tema.

El problema que tengo es que al hacer una distribución modular de mi aplicación me ha dejado de funcionar los Zend_Form. Creo que el problema está relacionado con los View_Helpers que incluyo en el layout.phtml.

Mi application.ini
/application/configs/application.ini
Código PHP:
[production]
phpSettings.display_startup_errors 1
phpSettings
.display_errors 1
 
bootsrap
bootstrap
.path APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
 
frontController
resources
.frontController.moduleDirectory APPLICATION_PATH "/modules"
 
layout
resources
.layout.layoutPath APPLICATION_PATH "/layouts"

session
resources
.session.save_path APPLICATION_PATH "/data/session"
resources.session.use_only_cookies true
resources
.session.remember_me_seconds 864000
 
Database
resources
.db.adapter "pdo_mysql"
resources.db.params.host "localhost"
resources.db.params.username "root"
resources.db.params.password "10666666"
resources.db.params.dbname "ala01"

[development production]
phpSettings.display_startup_errors 1
phpSettings
.display_errors 1
 
[testing production
Mi layout
/application/layouts/layout.phtml
Código PHP:
<?php echo $this->doctype(); ?>
<html xmlns="http://www.w3.org/1999/xhtml" collation>
    <head>
        <?php echo $this->headMeta(); ?>
        <?php echo $this->headTitle(); ?>
        <?php echo $this->headLink()->prependStylesheet($this->baseUrl()."/css/estilo.css")."\n"?>
    </head>
    <body>
        <?php echo $this->menuLateral()."\r\n"?>
        <?php echo $this->menuSuperior()."\r\n"?>
        <div id="content">
            <h1><?php echo $this->escape($this->title); ?></h1>
            <?php echo $this->layout()->content?>
        </div>
    </body>
</html>
Mi Zend_form
/application/forms/Persona.php
Código PHP:
<?php
class Form_Persona extends Zend_Form{

    public function 
__construct($options null){
        
parent::__construct($options);

        
$this->setName('persona');
        
$id = new Zend_Form_Element_Hidden('id');

        
$nombre = new Zend_Form_Element_Text('nombre');
        
$nombre->setLabel('Nombre');
        
$nombre->setRequired(true);
        
$nombre->addFilter('StripTags');
        
$nombre->addFilter('StringTrim');
        
$nombre->addValidator('NotEmpty'true, array('messages' => array('isEmpty' => 'El campo es obligatorio')));

        
$nif = new Zend_Form_Element_Text('nif');
        
$nif->setLabel('Nif');
        
$nif->setRequired(true);
        
$nif->addFilter('StripTags');
        
$nif->addFilter('StringTrim');
        
$nif->addValidator('NotEmpty'true, array('messages' => array('isEmpty' => 'El campo es obligatorio')));
        
        
$telefono = new Zend_Form_Element_Text('telefono');
        
$telefono->setLabel(utf8_encode('Teléfono'));
        
$telefono->addFilter('StripTags');
        
$telefono->addFilter('StringTrim');
        
        
$poblacion = new Zend_Form_Element_Text('poblacion');
        
$poblacion->setLabel(utf8_encode('Población'));
        
$poblacion->addFilter('StripTags');
        
$poblacion->addFilter('StringTrim');
        
        
$provincia = new Zend_Form_Element_Text('provincia');
        
$provincia->setLabel('Provincia');
        
$provincia->addFilter('StripTags');
        
$provincia->addFilter('StringTrim');
        
        
$email = new Zend_Form_Element_Text('email');
        
$email->setLabel('Email');
        
$email->addFilter('StripTags');
        
$email->addFilter('StringTrim');

        
$submit = new Zend_Form_Element_Submit('submit');
        
$submit->setAttrib('id''submitbutton');
        
$this->addElements(array($id$nombre$nif$telefono$poblacion,$provincia$email$submit));
    }
}
?>
Mi Controller
/application/modules/personas/controller
Código PHP:
<?php
    
/**
     * Controlador para personas
     * Enter description here ...
     * @author Alex
     *
     */
    
class Personas_PersonaController extends Zend_Controller_Action
    
{
        public function 
anadirAction(){
            
//Indicamos el título de la página
            
$this->view->title utf8_encode('Añadir nueva persona');
            
//Añadimos el título, delante del título definido por defecto para nuestra aplicación
            
$this->view->headTitle($this->view->title'PREPEND');
            
//Instanciamos el formulario
            
$form = new Form_Persona();
            
//Especificamos el nombre del botón de envío del formulario
            
$form->submit->setLabel(utf8_encode('Añadir'));
            
//Asignamos a la vista el formulario
            
$this->view->form $form;
    
            if (
$this->getRequest()->isPost()){ //Si se envían los datos, los recuperamos del formulario
                
$formData $this->getRequest()->getPost();
                if (
$form->isValid($formData)){ //Validamos que los datos recibidos sean correctos
                    //Asignamos los valores recuperados a variables
                    
$nombre $form->getValue('nombre');
                    
$nif $form->getValue('nif');
                    
$telefono $form->getValue('telefono');
                    
$poblacion $form->getValue('poblacion');
                    
$provincia $form->getValue('provincia');
                    
$email $form->getValue('email');
                    
//Creamos el modelo
                    
$personas = new Model_DBTable_Personas();
                    
//Insertamos el nuevo persona en nuestra BBDD
                    
$personas->addPersona($nombre$nif$telefono$poblacion$provincia$email);
                    
//Redireccionamos a la home, donde podremos ver la nueva persona introducido.
                    
$this->_redirect('/');
                }else{ 
//Si los datos del formulario, no son válidos, se muestra el formulario con los datos de nuevo.
                    
$form->populate($formData);
                }
            }
        }
    
        public function 
borrarAction(){
            
$this->view->title "Borrar persona";
            
$this->view->headTitle($this->view->title'PREPEND');
            if (
$this->getRequest()->isPost()) {
                
$del $this->getRequest()->getPost('del');
                if (
$del == 'Si') {
                    
$id $this->getRequest()->getPost('id');
                    
$personas = new Model_DBTable_Personas();
                    
$personas->deletePersona($id);
                }
                
$this->_redirect('/');
            }else{
                
$id $this->_getParam('id'0);
                
$personas = new Model_DBTable_Personas();
                
$this->view->persona $personas->getPersona($id);
            }
        }
    
        public function 
editarAction(){
            
//Indicamos el título de la página
            
$this->view->title "Editar Persona";
            
//Añadimos el título, delante del título definido por defecto para nuestra aplicación
            
$this->view->headTitle($this->view->title'PREPEND');
            
//Instanciamos el formulario
            
$form = new Form_Persona();
            
//Especificamos el nombre del botón de envío del formulario
            
$form->submit->setLabel('Guardar');
            
//Asignamos a la vista el formulario
            
$this->view->form $form;
    
            if (
$this->getRequest()->isPost()) {//Si se envían los datos, los recuperamos del formulario
                
$formData $this->getRequest()->getPost();
                if (
$form->isValid($formData)) {//Validamos que los datos recibidos sean correctos
                    //Asignamos los valores recuperados a variables
                    
$id = (int)$form->getValue('id');
                    
$nombre $form->getValue('nombre');
                    
$nif $form->getValue('nif');
                    
$telefono $form->getValue('telefono');
                    
$poblacion $form->getValue('poblacion');
                    
$provincia $form->getValue('provincia');
                    
$email $form->getValue('email');
                    
//Creamos el modelo
                    
$personas = new Model_DBTable_Personas();
                    
//Actualizamos los datos del persona
                    
$personas->updatePersona($id$nombre$nif$telefono$poblacion$provincia$email);
                    
//Vamos a la página principal de la aplicación
                    
$this->_redirect('/');
                }else{
//Si los datos del formulario, no son válidos, se muestra el formulario con los datos de nuevo.
                    
$form->populate($formData);
                }
            }else{
//Mostramos los datos de la persona en caso de no haber enviado los datos al servidor para actualizar la persona
                
$id $this->_getParam('id'0);
                if (
$id 0) {
                    
$persona = new Model_DBTable_Personas();
                    
$form->populate($persona->getPersona($id));
                }
            }
        }
    }
    
?>

MenuLateral, uno de mis Helpers. (El otro es exactamente igual)
/application/modules/default/views/helpers
Código PHP:
<?php
class Zend_View_Helper_MenuLateral extends Zend_View_Helper_Abstract {
    public function 
menuLateral(){
        return 
"<div id='menulateral' class='menulateral'>Lateral</div>";
    }
}
?>

El problema está en que no me aparece el formulario.
He conseguido que me aparezca y que todo funcione correctamente con estas dos soluciones:
1º Si quito los helper MenuLateral y MenuSuperior del layout.phtml funciona perfectamente
2º Si agrego los helper que tengo en /application/modules/default/views/helpers (MenuLateral y MenuSuperior)
a /application/modules/personas/views/helpers funciona perfectamente.
  #2 (permalink)  
Antiguo 24/06/2011, 13:52
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Problemas con Forms tras pasar a organización modular

El problema deben ser los view helpers, tienes que agregar el path en el application.ini y el nombre de la clase deberia tener el prefijo del modulo, osea esto: Zend_View_Helper_MenuLateral deberia ser esto: Default_View_Helper_MenuLateral y ademas en el application.ini:

Código INI:
Ver original
  1. resources.view.helperPath.Default_View_Helper = APPLICATION_PATH "/modules/default/views/helpers"

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 25/06/2011, 04:23
 
Fecha de Ingreso: junio-2011
Ubicación: Granada
Mensajes: 19
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Problemas con Forms tras pasar a organización modular

Cita:
Iniciado por masterpuppet Ver Mensaje
El problema deben ser los view helpers, tienes que agregar el path en el application.ini y el nombre de la clase deberia tener el prefijo del modulo, osea esto: Zend_View_Helper_MenuLateral deberia ser esto: Default_View_Helper_MenuLateral y ademas en el application.ini:

Código INI:
Ver original
  1. resources.view.helperPath.Default_View_Helper = APPLICATION_PATH "/modules/default/views/helpers"

Saludos.
Había probado esto ya pero al probarlo me da error

Código:
Fatal error: Uncaught exception 'Zend_Loader_PluginLoader_Exception' with message 'Plugin by name 'MenuLateral' was not found in the registry; used paths: Zend_View_Helper_: Zend/View/Helper/;./views\helpers/;C:/AppServ/www/ala01/application/modules/default/views\helpers/' in C:\AppServ\www\ala01\library\Zend\Loader\PluginLoader.php:412 Stack trace: #0 C:\AppServ\www\ala01\library\Zend\View\Abstract.php(1182): Zend_Loader_PluginLoader->load('MenuLateral') #1 C:\AppServ\www\ala01\library\Zend\View\Abstract.php(618): Zend_View_Abstract->_getPlugin('helper', 'menuLateral') #2 C:\AppServ\www\ala01\library\Zend\View\Abstract.php(344): Zend_View_Abstract->getHelper('menuLateral') #3 [internal function]: Zend_View_Abstract->__call('menuLateral', Array) #4 C:\AppServ\www\ala01\application\layouts\layout.phtml(10): Zend_View->menuLateral() #5 C:\AppServ\www\ala01\library\Zend\View.php(108): include('C:\AppServ\www\...') #6 C:\AppServ\www\ala01\library\Zend\View\Abstract.php(888): Zend_View->_run('C:\AppServ\www\...') #7 C:\AppServ in C:\AppServ\www\ala01\library\Zend\Loader\PluginLoader.php on line 412
  #4 (permalink)  
Antiguo 25/06/2011, 04:32
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Problemas con Forms tras pasar a organización modular

Pues debería funcionar, no estarás sobrescribiendo el view en el Bootstrap ?
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 25/06/2011, 04:54
 
Fecha de Ingreso: junio-2011
Ubicación: Granada
Mensajes: 19
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Problemas con Forms tras pasar a organización modular

Cita:
Iniciado por masterpuppet Ver Mensaje
Pues debería funcionar, no estarás sobrescribiendo el view en el Bootstrap ?
Pues no estoy seguro. Este es mi Bootstrap.php:

Código PHP:
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function 
_initAutoloader() {
        
$autoloader Zend_Loader_Autoloader::getInstance();
        
$autoloader->registerNamespace('App_')->setFallbackAutoloader(true);

        
$moduleLoader = new Zend_Application_Module_Autoloader(array('namespace' => '''basePath' => APPLICATION_PATH));
        
        
//Cargamos helper para JQuery
        //Zend_Controller_Action_HelperBroker::addPrefix('ZendY_JQuery_Controller_Action_Helper');
        
        
return $moduleLoader;
    }

    protected function 
_initSession() {
        
$session $this->getPluginResource('session');
        
$session->init();
        
Zend_Session::start();
    }

    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');
        
$view->headMeta()->appendHttpEquiv('Content-Language''es-ES');
        
$view->headMeta()->appendHttpEquiv('Cache-Control''no-cache');
        
$view->headTitle()->setSeparator(' - ');
        
$view->headTitle('Personas');
    }
}
?>
Está copiado de los ejemplos y tutoriales que estoy siguiendo, con algunos añadidos.
  #6 (permalink)  
Antiguo 25/06/2011, 05:12
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Problemas con Forms tras pasar a organización modular

Si lo estas sobrescribiendo, hace poco a otro usuario le ocurría lo mismo, te dejo la referencia, http://www.forosdelweb.com/f68/llama...layout-923258/, tu método _iniViewHelpers, debería ser:

Código PHP:
Ver original
  1. protected function _initViewHelpers()
  2. {
  3.     $this->bootstrap('view');
  4.     $view = $this->getResource('view');
  5.     $view->doctype('XHTML1_STRICT');
  6.     $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
  7.     $view->headMeta()->appendHttpEquiv('Content-Language', 'es-ES');
  8.     $view->headMeta()->appendHttpEquiv('Cache-Control', 'no-cache');
  9.     $view->headTitle()->setSeparator(' - ');
  10.     $view->headTitle('Personas');
  11. }

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #7 (permalink)  
Antiguo 25/06/2011, 05:29
 
Fecha de Ingreso: junio-2011
Ubicación: Granada
Mensajes: 19
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Problemas con Forms tras pasar a organización modular

Cita:
Iniciado por masterpuppet Ver Mensaje
Si lo estas sobrescribiendo, hace poco a otro usuario le ocurría lo mismo, te dejo la referencia, [url]http://www.forosdelweb.com/f68/llamar-view-helper-desde-layout-923258/[/url], tu método _iniViewHelpers, debería ser:

Código PHP:
Ver original
  1. protected function _initViewHelpers()
  2. {
  3.     $this->bootstrap('view');
  4.     $view = $this->getResource('view');
  5.     $view->doctype('XHTML1_STRICT');
  6.     $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
  7.     $view->headMeta()->appendHttpEquiv('Content-Language', 'es-ES');
  8.     $view->headMeta()->appendHttpEquiv('Cache-Control', 'no-cache');
  9.     $view->headTitle()->setSeparator(' - ');
  10.     $view->headTitle('Personas');
  11. }

Saludos.
Acabo de solucionarlo tal y como me has indicado. Muchas gracias masterpuppet. Los inicios en los lenguajes de programación y frameworks son caminos duros de andar aunque después tienen su recompensa.

Un saludo.

Etiquetas: frameworks-y-php-orientado-a-objetos
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 17:36.