Ver Mensaje Individual
  #1 (permalink)  
Antiguo 24/06/2011, 12:37
aluckyar
 
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.