Para que nuestro libro de visitas sea útil, necesitamos un formulario para enviar nuevas entradas.
Nuestro primer paso es crear la clase de formulario propiamente dicha. Para crear la clase de formulario vacía, ejecute:
% zf create form Guestbook Creating a form at application/forms/Guestbook.php Updating project profile '.zfproject.xml'
Esto creará el directorio application/forms/ con el archivo de clase
Guestbook.php. Abra ese archivo y actualícelo para que quede así:
// application/forms/Guestbook.php
class Application_Form_Guestbook extends Zend_Form
{
public function init()
{
// Set the method for the display form to POST
$this->setMethod('post');
// Add an email element
$this->addElement('text', 'email', array(
'label' => 'Your email address:',
'required' => true,
'filters' => array('StringTrim'),
'validators' => array(
'EmailAddress',
)
));
// Add the comment element
$this->addElement('textarea', 'comment', array(
'label' => 'Please Comment:',
'required' => true,
'validators' => array(
array('validator' => 'StringLength', 'options' => array(0, 20))
)
));
// Add a captcha
$this->addElement('captcha', 'captcha', array(
'label' => 'Please enter the 5 letters displayed below:',
'required' => true,
'captcha' => array(
'captcha' => 'Figlet',
'wordLen' => 5,
'timeout' => 300
)
));
// Add the submit button
$this->addElement('submit', 'submit', array(
'ignore' => true,
'label' => 'Sign Guestbook',
));
// And finally add some CSRF protection
$this->addElement('hash', 'csrf', array(
'ignore' => true,
));
}
}
El formulario anterior define cinco elementos: un campo de dirección de correo electrónico, un campo de comentario, un CAPTCHA para prevenir envíos de spam, un botón de envío, y un token de protección CSRF.
A continuación, añadiremos un signAction() a nuestro
GuestbookController que procesará el formulario tras el envío. Para
crear la acción y el script de vista relacionado, ejecute lo siguiente:
% zf create action sign Guestbook
Creating an action named sign inside controller
at application/controllers/GuestbookController.php
Updating project profile '.zfproject.xml'
Creating a view script for the sign action method
at application/views/scripts/guestbook/sign.phtml
Updating project profile '.zfproject.xml'
Como puede ver en la salida, esto creará un método signAction()
en nuestro controlador, así como el script de vista correspondiente.
Añadamos algo de lógica en la acción sign de nuestro controlador del libro de visitas. Primero necesitamos comprobar si estamos recibiendo una petición POST o una GET; en este último caso, simplemente mostraremos el formulario. Sin embargo, si recibimos una petición POST, querremos validar los datos enviados contra nuestro formulario, y, si son válidos, crear una nueva entrada y guardarla. La lógica podría verse así:
// application/controllers/GuestbookController.php
class GuestbookController extends Zend_Controller_Action
{
// snipping indexAction()...
public function signAction()
{
$request = $this->getRequest();
$form = new Application_Form_Guestbook();
if ($this->getRequest()->isPost()) {
if ($form->isValid($request->getPost())) {
$comment = new Application_Model_Guestbook($form->getValues());
$mapper = new Application_Model_GuestbookMapper();
$mapper->save($comment);
return $this->_helper->redirector('index');
}
}
$this->view->form = $form;
}
}
Por supuesto, también necesitamos editar el script de vista; edite
application/views/scripts/guestbook/sign.phtml para que quede así:
<!-- application/views/scripts/guestbook/sign.phtml --> Please use the form below to sign our guestbook! <?php $this->form->setAction($this->url()); echo $this->form;
![]() |
Formularios con mejor aspecto |
|---|---|
|
Nadie va a alabar la belleza de este formulario en un futuro cercano. No importa - ¡la apariencia del formulario es totalmente personalizable! Vea la sección sobre decoradores en la guía de referencia para más detalles. Además, puede que le interese nuestro tutorial sobre decoradores de formularios. |
![]() |
Punto de control |
|---|---|
|
Ahora navegue a "http://localhost/guestbook/sign". Debería ver lo siguiente en su navegador:
|
![[Note]](images/note.png)