Desde que vi Zend_Form me gustaron muchas de sus cosas, pero no me gustó una fundamental. Y es que prefiero mis formularios en las vistas que tenerlos en los controladores o los modelos. Por que los considero parte de las vistas.
Desde ese punto de vista me parecería razonable usar Zend_Form por ejemplo en algún: "module/views/forms". Pues también pienso que las vistas no tienen por que ser solo xhtml y css, pueden ser clases y php que generan un output de vista.
Pero aún así, me sigue agradando más la idea de poner los formularios directamente en mis vistas xhtml.
Zend_Form acopla perfectamente unos componentes con otros... Pero si el form lo hacemos en la vista, entonces llegamos al típico punto de los tutoriales de Zend Framework "How to fit it all in MVC" como hacemos funcionar todo esto en mvc de zf claro. Y yo comenzé a hacerlo e hice este controlador para un registro de usuarios. El código no es 100% correcto, tomarlo como un "proof of concept":
En el codigo haríamos filter y validator chains que los contrastariamos con los valores de $_POST y si es valido, insertariamos los datos en la base de datos.
Si es invalido, mostrariamos los errores y repoblariamos el formulario.
Aún faltarian cuestiones con js de accesibilidad o cuestiones de usabilidad. Y la verdad ahora mismo no sé ni como proseguiría para implantar esas tecnologias en todo este proceso. Es algo todavía a estudiar para mi.
Pero mi pregunta quiero que sea muy clara...
¿ Me animariais a seguir por este camino ¿es factible pero más complejo o idealista?. O me aconsejariais emplear Zend_Form ? Código PHP:
<?php
class Users_RegistrationController extends My_App2_Controller_Action
{
public function indexAction()
{
if ($this->_request->isPost()) {
$filters = array(
'username' => '',
'password' => '',
'email' => ''
);
$validators = array(
'username' => '',
'password' => '',
'email' => ''
);
$data = $_POST;
$input = new Zend_Filter_Input($filters, $validators);
$input->setData($data);
$values = $this->_request->getPost();
if ($input->isValid()) {
$values = array(
'username' => $values['username'],
'password' => $values['password'],
'email' => $values['email']
);
// Esto no tiene por ke ser correcto he escrito lo primero que se me ha ocurrido.
// No creo que esté siguiendo patrones, así por mi suerte... jeje.
// Solo es un proof of concept de que aquí haríamos un insert de los datos.
$user = new UsersModel();
$user->_db->write($values);
} else {
// Mostramos los mensajes de error
if ($input->hasInvalid() || $input->hasMissing()) {
$this->view->messages = $input->getMessages();
}
// Repoblamos el formulario (repopulate)
$this->view->username = $values['username'];
$this->view->password = $values['password'];
$this->view->email = $values['email'];
}
}
}
}
?>
Y este es el formulario:
Código PHP:
<?php
if(isset($this->messages)) {
echo '<div id="errorBox">' . $this->messages . '</div>';
}
?>
<form enctype="application/x-www-form-urlencoded" action="users/registration" method="post" accept-charset="utf-8">
<label for="username">Usuario:</label>
<input type="text" name="username" id="username" value="<?php echo $this->username; ?>">
<label for="password">Contraseña:</label>
<input type="password" name="password" id="password" value="<?php echo $this->password; ?>">
<label for="email">Correo electrónico:</label>
<input type="text" name="email" id="email" value="<?php echo $this->email; ?>">
<input type="submit" name="submit" id="submit" value="Enviar">
</form>
Un saludo y Muchas gracias