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]
/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>
/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));
}
}
?>
/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.