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

Problema al crear un formulario en Zend

Estas en el tema de Problema al crear un formulario en Zend en el foro de Zend en Foros del Web. Hola Estoy siguiendo un manual, para crear un formulario en Zend, y algún punto me he perdido que no me sale. Tengo instalado Zend y ...
  #1 (permalink)  
Antiguo 29/06/2011, 12:36
 
Fecha de Ingreso: noviembre-2005
Mensajes: 186
Antigüedad: 19 años, 1 mes
Puntos: 1
Problema al crear un formulario en Zend

Hola

Estoy siguiendo un manual, para crear un formulario en Zend, y algún punto me he perdido que no me sale. Tengo instalado Zend y me funciona bien, con todos los directorios.

mi estructura es

quickstart
-aplication
--config
--layouts
--modules
---default
----controller
----models
----views
-----helpers
-----scripts

-docs
-library
-public

Hasta ahora todo funciona bien, pero voy con el formulario.

Creo en el directorio aplication, el directorio forms y dentro el archivo Contact.php, con este código según el manual:

Código PHP:
<?php
class Application_Form_Contact extends Zend_Form
{
    public function 
init ()
    {
        
// initialize form
        
$this->setAction('/contact/index')->setMethod('post');
        
// create text input for name
        
$name = new Zend_Form_Element_Text('name');
        
$name->setLabel('Name:')
            ->
setOptions(array('size' => '35'))
            ->
setRequired(true)
            ->
addValidator('NotEmpty'true)
            ->
addValidator('Alpha'true)
            ->
addFilter('HTMLEntities')
            ->
addFilter('StringTrim');
        
// create text input for email address
        
$email = new Zend_Form_Element_Text('email');
        
$email->setLabel('Email address:');
        
$email->setOptions(array('size' => '50'))
            ->
setRequired(true)
            ->
addValidator('NotEmpty'true)
            ->
addValidator('EmailAddress'true)
            ->
addFilter('HTMLEntities')
            ->
addFilter('StringToLower')
            ->
addFilter('StringTrim');
        
// create text input for message body
        
$message = new Zend_Form_Element_Textarea('message');
        
$message->setLabel('Message:')
            ->
setOptions(array('rows' => '8''cols' => '40'))
            ->
setRequired(true)
            ->
addValidator('NotEmpty'true)
            ->
addFilter('HTMLEntities')
            ->
addFilter('StringTrim');
        
// create captcha
        
$captcha = new Zend_Form_Element_Captcha('captcha'
        array(
        
'captcha' => array('captcha' => 'Image''wordLen' => 6
        
'timeout' => 300'width' => 300'height' => 100)));
        
$captcha->setLabel('Verification code:');
        
// create submit button
        
$submit = new Zend_Form_Element_Submit('submit');
        
$submit->setLabel('Send Message')->setOptions(
        array(
'class' => 'submit'));
        
// attach elements to form
        
$this->addElement($name)
            ->
addElement($email)
            ->
addElement($message)
            ->
addElement($captcha)
            ->
addElement($submit);
    }
}
Luego dentro de la carpeta controller, creo el archivo ContactControler.php, con este código.
Código PHP:
<?php
/**
 * ConctactController
 * 
 * @author
 * @version 
 */
require_once 'Zend/Controller/Action.php';
class 
ConctactController extends Zend_Controller_Action
{
    
/**
     * The default action - show the home page
     */
    
public function init ()
    {
        
$this->view->doctype('XHTML1_STRICT');
    }
    public function 
indexAction ()
    {
        
$form = new Application_Form_Contact();
        
$this->view->form $form;
        if (
$this->getRequest()->isPost()) {
            if (
$form->isValid($this->getRequest()
                ->
getPost())) {
                
$values $form->getValues();
                
$mail = new Zend_Mail();
                
$mail->setBodyText($values['message']);
                
$mail->setFrom($values['email'], $values['name']);
                
$mail->addTo('[email protected]');
                
$mail->setSubject('Contact form submission');
                
$mail->send();
                
$this->_helper->getHelper('FlashMessenger')->addMessage(
                
'Thank you. Your message was successfully
        sent.'
);
                
$this->_redirect('/contact/success');
            }
        }
    }
}
Despues dentro de la carpeta views/scripts, creo el directorio conctact, con dos archivos index.phtml y success.phtml, index tiene este código.
Código PHP:
<h2>Contact</h2>
<?php echo $this->form?>
Después seguiendo el manual en aplication.ini pongo esto.

Código:
resources.router.routes.contact.route = /contact
resources.router.routes.contact.defaults.module = default
resources.router.routes.contact.defaults.controller = contact
resources.router.routes.contact.defaults.action = index
pongo la url :
Código:
http://localhost/contact
y me da el siguiente error:

Código:
An error occurred
Page not found
Exception information:

Message: Invalid controller specified (contact)
Stack trace:

#0 C:\Program Files (x86)\Zend\ZendServer\share\ZendFramework\library\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#1 C:\Program Files (x86)\Zend\ZendServer\share\ZendFramework\library\Zend\Application\Bootstrap\Bootstrap.php(97): Zend_Controller_Front->dispatch()
#2 C:\Program Files (x86)\Zend\ZendServer\share\ZendFramework\library\Zend\Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#3 C:\xampp\htdocs\quickstart\public\index.php(26): Zend_Application->run()
#4 {main}  

Request Parameters:

array (
  'module' => 'default',
  'controller' => 'contact',
  'action' => 'index',
)
A ver si alguien puede ayudarme con este problema.

Saludos
  #2 (permalink)  
Antiguo 29/06/2011, 13:40
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Problema al crear un formulario en Zend

Prueba otra vez solo deja lo del .ini fuera, no es necesario crear una ruta si vas a usar el comportamiento que por defecto te brinda Zend.

Saludos.
  #3 (permalink)  
Antiguo 30/06/2011, 01:43
 
Fecha de Ingreso: noviembre-2005
Mensajes: 186
Antigüedad: 19 años, 1 mes
Puntos: 1
Respuesta: Problema al crear un formulario en Zend

Lo del ini lo he puesto porque lo dice el libro, si lo dejo fuera, incluso la página de inicio me da error, al poner esto:

Código PHP:
<a
    href="<?php
echo $this->url(array(), 'contact');
?>">CONTACT</a>
Saludos
  #4 (permalink)  
Antiguo 30/06/2011, 03:22
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: Problema al crear un formulario en Zend

Te da error porque no existe el router que le estas pasando al helper, si eliminas el router deberia ser:

Código HTML:
Ver original
  1. <a href="<?php echo $this->url(array('controller' => 'contact'), null, true); ?>">CONTACT</a>

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 30/06/2011, 03:49
 
Fecha de Ingreso: noviembre-2005
Mensajes: 186
Antigüedad: 19 años, 1 mes
Puntos: 1
Respuesta: Problema al crear un formulario en Zend

Ahora parece que va mejor, pero me sale un nuevo error y no se ve el formulario, es este:

Código:
Warning: Exception caught by form: Image CAPTCHA requires font Stack Trace: #0 C:\Program Files (x86)\Zend\ZendServer\share\ZendFramework\library\Zend\Captcha\Image.php(429):
 Zend_Captcha_Image->_generateImage('4c94c3b5fb19ae0...', '88zox6') 
#1 C:\Program Files (x86)\Zend\ZendServer\share\ZendFramework\library\Zend\Form\Element\Captcha.php(193):
 Zend_Captcha_Image->generate() #2 C:\Program Files (x86)\Zend\ZendServer\share\ZendFramework\library\Zend\Form\Decorator\FormElements.php(101): Zend_Form_Element_Captcha->render() 
#3 C:\Program Files (x86)\Zend\ZendServer\share\ZendFramework\library\Zend\Form.php(2904): Zend_Form_Decorator_FormElements->render('') 
#4 C:\Program Files (x86)\Zend\ZendServer\share\ZendFramework\library\Zend\Form.php(2920): Zend_Form->render() #5 C:\xampp\htdocs\quickstart\application\modules\default\views\scripts\contact\index.phtml(2):
 Zend_Form->__toString() #6 C:\Program Files (x86)\Zend\ZendServer\share\ZendFramework\library\Zend\View.php(108): include('C:\xampp\htdocs...') #7 C:\Program File in C:\Program Files (x86)\Zend\ZendServer\share\ZendFramework\library\Zend\Form.php on line 2925
El caso es que del archivo Contact.php, le he quitado todo el código que tiene que ver con el captcha para ver si así funciona y me sale este warning.

Recuerdo el código de Contact.php, aunque me da que no entra ahí, porque pongo un echo "Algo" y no sale reflejado.

Código PHP:
<?php
class Application_Form_Contact extends Zend_Form
{
    public function 
init ()
    {
        
// Si escribo algo como echo "lo que sea" , no sale luego en la web, es como si no entrara por aquí
        // initialize form
        
$this->setAction('/contact/index')->setMethod('post');
        
// create text input for name
        
$name = new Zend_Form_Element_Text('name');
        
$name->setLabel('Name:')
            ->
setOptions(array('size' => '35'))
            ->
setRequired(true)
            ->
addValidator('NotEmpty'true)
            ->
addValidator('Alpha'true)
            ->
addFilter('HTMLEntities')
            ->
addFilter('StringTrim');
        
// create text input for email address
        
$email = new Zend_Form_Element_Text('email');
        
$email->setLabel('Email address:');
        
$email->setOptions(array('size' => '50'))
            ->
setRequired(true)
            ->
addValidator('NotEmpty'true)
            ->
addValidator('EmailAddress'true)
            ->
addFilter('HTMLEntities')
            ->
addFilter('StringToLower')
            ->
addFilter('StringTrim');
        
// create text input for message body
        
$message = new Zend_Form_Element_Textarea('message');
        
$message->setLabel('Message:')
            ->
setOptions(array('rows' => '8''cols' => '40'))
            ->
setRequired(true)
            ->
addValidator('NotEmpty'true)
            ->
addFilter('HTMLEntities')
            ->
addFilter('StringTrim');
        
// create captcha
       
//incluso comentando este código y la llamada posterior da el mismo warning
        
$captcha = new Zend_Form_Element_Captcha('captcha'
        array(
        
'captcha' => array('captcha' => 'Image''wordLen' => 6
        
'timeout' => 300'width' => 300'height' => 100)));
        
$captcha->setLabel('Verification code:');
           
        
// create submit button
        
$submit = new Zend_Form_Element_Submit('submit');
        
$submit->setLabel('Send Message')->setOptions(
        array(
'class' => 'submit'));
        
// attach elements to form
        
$this->addElement($name)
            ->
addElement($email)
            ->
addElement($message)
            ->
addElement($captcha)
            ->
addElement($submit);
            
            
$this->addElement($name);
    }
}
  #6 (permalink)  
Antiguo 30/06/2011, 04:28
 
Fecha de Ingreso: noviembre-2005
Mensajes: 186
Antigüedad: 19 años, 1 mes
Puntos: 1
Respuesta: Problema al crear un formulario en Zend

Hola

Creo que el captcha no tiene nada que ver, el problema creo que es que el controller no encuentra la clase del archivo Contact.php, he probado cambiar el nombre de la clase en Contact.php para ver si la encuentra.
[PHP]
<?php
//application/forms/Contact.php
class Quick_Form_Contact extends Zend_Form
{
public function init ()
{
// initialize form
$this->setAction('/contact/index')->setMethod('post');
// create text input for name
$name = new Zend_Form_Element_Text('name');
$name->setLabel('Name:')
->setOptions(array('size' => '35'))
->setRequired(true)
->addValidator('NotEmpty', true)
->addValidator('Alpha', true)
->addFilter('HTMLEntities')
->addFilter('StringTrim');
// create text input for email address
$email = new Zend_Form_Element_Text('email');
$email->setLabel('Email address:');
$email->setOptions(array('size' => '50'))
->setRequired(true)
->addValidator('NotEmpty', true)
->addValidator('EmailAddress', true)
->addFilter('HTMLEntities')
->addFilter('StringToLower')
->addFilter('StringTrim');
// create text input for message body
$message = new Zend_Form_Element_Textarea('message');
$message->setLabel('Message:')
->setOptions(array('rows' => '8', 'cols' => '40'))
->setRequired(true)
->addValidator('NotEmpty', true)
->addFilter('HTMLEntities')
->addFilter('StringTrim');
// create captcha
$captcha = new Zend_Form_Element_Captcha('captcha',
array(
'captcha' => array('captcha' => 'Image', 'wordLen' => 6,
'timeout' => 300, 'width' => 300, 'height' => 100)));
$captcha->setLabel('Verification code:');
// create submit button
$submit = new Zend_Form_Element_Submit('submit');
$submit->setLabel('Send Message')->setOptions(
array('class' => 'submit'));
// attach elements to form
$this->addElement($name)
->addElement($email)
->addElement($message)
->addElement($captcha)
->addElement($submit);
}
}

Y luego en ContactController.php llamo obviamente a la nueva clase
Código:
<?php
//application/modules/default/controllers/ContactControler.php
/**
 * ContactController
 * 
 * @author
 * @version 
 */
require_once 'Zend/Controller/Action.php';
class ContactController extends Zend_Controller_Action
{
    /**
     * The default action - show the home page
     */
    public function init ()
    {
    	
        $this->view->doctype('XHTML1_STRICT');
    }
    public function indexAction ()
    {
    	
        $form = new Quick_Form_Contact();
        $this->view->form = $form;
    if ($this->getRequest()->isPost()) {
            if ($form->isValid($this->getRequest()
                ->getPost())) {
                $values = $form->getValues();
                $mail = new Zend_Mail();
                $mail->setBodyText($values['message']);
                $mail->setFrom($values['email'], $values['name']);
                $mail->addTo('[email protected]');
                $mail->setSubject('Contact form submission');
                $mail->send();
                $this->_helper->getHelper('FlashMessenger')->addMessage(
                'Thank you. Your message was successfully
		sent.');
                $this->_redirect('/contact/success');
            }
        }
        
    }
}
Ahora el error es definitivo:

Código:
Fatal error: Class 'Quick_Form_Contact' not found in C:\xampp\htdocs\quickstart\application\modules\default\controllers\ContactController.php on line 22
Pues eso, algo debe fallar porque el código del formulario esta en Contact.php, pero parece no encontrarlo el controller, y parece como si la clase Application_Form_Contact() si sepa donde esta.
  #7 (permalink)  
Antiguo 30/06/2011, 08:39
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Problema al crear un formulario en Zend

El código que tenías antes estaba correcto, el problema es que le tienes que indicar al elemento de Captcha la fuente a usar, ya que estas usando un Image Captcha y este necesita una fuente para hacer el render del texto en la imagen.

Código PHP:
Ver original
  1. $captcha = new Zend_Form_Element_Captcha('captcha',
  2.         array(
  3.         'captcha' => array('captcha' => 'Image', 'wordLen' => 6,
  4.         'timeout' => 300, 'width' => 300, 'height' => 100, 'font' => $strPathATuFont)));
  5.         $captcha->setLabel('Verification code:');

Saludos.
  #8 (permalink)  
Antiguo 30/06/2011, 09:32
 
Fecha de Ingreso: noviembre-2005
Mensajes: 186
Antigüedad: 19 años, 1 mes
Puntos: 1
Respuesta: Problema al crear un formulario en Zend

Si pongo el archivo Contact.php

en la ruta library/Form/Square (por ejemplo), creo un namespace: Square_

funciona, pero me hubiera gustado tener el archivo Contact.php en el directorio forms dentro de application. Lo del captcha creo que no tiene que ver, porque nunca entra en el directorio donde está el código.

Lo que me hubiera gustado es entender porque encuentra un directorio o no lo encuentra, es decir, el problema ahora sé que está en que forms/Contact.php dentro de application no funciona, pero si funciona si lo pongo dentro de library.
  #9 (permalink)  
Antiguo 30/06/2011, 10:23
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Problema al crear un formulario en Zend

Debe de funcionar, el nombre debe de ser Application_Form_Contact, y debe de estar en /application/forms/Contact.php, verifica que no te estes pisando el Module Autoloader en tu bootstrap, y que también no hayas cambiado el appnamespace en tu application.ini.

Saludos.
  #10 (permalink)  
Antiguo 30/06/2011, 11:45
 
Fecha de Ingreso: noviembre-2005
Mensajes: 186
Antigüedad: 19 años, 1 mes
Puntos: 1
Respuesta: Problema al crear un formulario en Zend

Ya funciona era lo del font, ahora con este código funciona bien:

Código PHP:
$captcha = new Zend_Form_Element_Captcha('captcha'
        array(
        
'captcha' => array('captcha' => 'Image''wordLen' => 6
        
'timeout' => 300'width' => 300'height' => 100'font' => APPLICATION_PATH .
'/../public/fonts/LiberationSansRegular.ttf',
        
'imgDir' =>  APPLICATION_PATH '/../public/captcha'
        
'imgUrl' => '/captcha/','expiration' => 300 ))); 

Etiquetas: frameworks-y-php-orientado-a-objetos, formulario
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 12:27.