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

Formularios Zend

Estas en el tema de Formularios Zend en el foro de Zend en Foros del Web. Hola tengo unos problemitas a la hora de sacar los formularios Código PHP: ...... <td>Username:</td><td> <?php  echo  $this -> form -> username ;  ?> </td> ...
  #1 (permalink)  
Antiguo 16/02/2010, 12:28
 
Fecha de Ingreso: noviembre-2008
Mensajes: 62
Antigüedad: 16 años
Puntos: 1
Formularios Zend

Hola tengo unos problemitas a la hora de sacar los formularios
Código PHP:
......
<td>Username:</td><td><?php echo $this->form->username?></td>
......
Porque el resultado es

VIEW:
Código PHP:
....
<
td>Username:</td><td><dt id="username-label">&nbsp;</dt>
<
dd id="username-element">
<
input type="text" name="username" id="username" value="" /></dd>
</
td
Como puedo evitar que me salgan las etiquetas <dd>


Mi segunda duda es sobre los Validadores, en la clase formulario tengo:
FORM:
Código PHP:
class Forms_reguserForm extends Zend_Form
{
    public function 
init()
    {

        
$Vcad = new Zend_Validate_StringLength(array('min' => 8'max' => 12));
        
$Vcad->setMessages( array(
            
Zend_Validate_StringLength::TOO_SHORT => 'El string \'%value%\' es muy corto',
            
Zend_Validate_StringLength::TOO_LONG  => 'El string \'%value%\' es muy largo'
        
));
        
        
        
$username =  $this->createElement('text''username');
        
$username->addValidator($Vcad)
        
$this->addElement($username); 
Que debo poner en el Controller y en el View para que me saque algun mensaje de error.

Muchas Gracias
  #2 (permalink)  
Antiguo 16/02/2010, 12:42
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 17 años
Puntos: 14
Respuesta: Formularios Zend

los <dt><dd> son los decorators por default, para sacarlos tendrias que sobreescribir los decorators (setDecorators()) con los decorators que quieras


por otro lado, los mensajes de error aparecen automaticamente en el form al hacer el isValid(), siempre y cuando el elemento tenga el decorator Errors

Saludos!
  #3 (permalink)  
Antiguo 16/02/2010, 13:16
 
Fecha de Ingreso: noviembre-2008
Mensajes: 62
Antigüedad: 16 años
Puntos: 1
Respuesta: Formularios Zend

Pues vaya, lo que pasa que se me descoloca toda la tabla, voy a mirarme los decorator, si hay algun modo de quitarlos.


Hay algun validador para campo no repetido (unico)?

Tipo:
Código PHP:
$username->setUnique(true); 

Última edición por Ferdinandum; 16/02/2010 a las 13:29
  #4 (permalink)  
Antiguo 16/02/2010, 15:59
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 17 años
Puntos: 14
Respuesta: Formularios Zend

no no hay tal validator, pero puedes crearlo, no es muuuy dificil :)

como tienes los decorators del form y los elementos?? si queres postealos aca y te digo que cambiar para que quede correcto

saludos!
  #5 (permalink)  
Antiguo 16/02/2010, 18:41
 
Fecha de Ingreso: noviembre-2008
Mensajes: 62
Antigüedad: 16 años
Puntos: 1
Mensaje Respuesta: Formularios Zend

Oki, se puede crear como validador? o me creo una funcion.


Código PHP:
   public function registrarseAction(){
     
$form = new Forms_reguserForm();
     
$form->setMethod('post')
               ->
setAction($this->getRequest()->getBaseUrl() . '/Auth/Guardar')
               ->
getElement('submit')->setLabel('new  user'); 
               
         
$this->view->form $form;
    }

    public function 
guardarAction(){
          ............
          
$form = new Forms_reguserForm();
          if (!
$form->isValid($this->_request->getPost())) {
            return 
$this->_helper->redirector('registrarse');
          }
          ...........
     } 
Tengo 2 funciones Registrase y Guardar. Registrase es la funcion que carga el formulario y Guardar la que lo valida, Pero cuando hay errores el formulario se crea de nuevo en blanco, como puedo corregir este fallo.


En cuanto a los decorators, no he tocado nada, ya que no enciendo su estructura. Pero preferia hacerlo con una tabla e ir colocando los elementos de uno en uno.
  #6 (permalink)  
Antiguo 16/02/2010, 23:30
Avatar de emiliodeg  
Fecha de Ingreso: septiembre-2005
Ubicación: Córdoba
Mensajes: 1.830
Antigüedad: 19 años, 2 meses
Puntos: 55
Respuesta: Formularios Zend

Cita:
Iniciado por Ferdinandum Ver Mensaje
Pues vaya, lo que pasa que se me descoloca toda la tabla, voy a mirarme los decorator, si hay algun modo de quitarlos.


Hay algun validador para campo no repetido (unico)?

Tipo:
Código PHP:
$username->setUnique(true); 
si estas guardando el dato en una bbdd (imagino q si) pudes utilizar el Zend_Validate_Db_RecordExists

y le pasas
arg 1 la tabla
arg 2 el campo
arg 3 si excluye

a modo de ejemplo
->addValidator(new Zend_Validate_Db_RecordExists('tabla_usuarios','em ail'))

de esta forma comprobamos q el email no exista
ademas de esto deberia estar seteado un indice unico para el campo email en la bbdd para q este todo correctamente hecho

__________________
Degiovanni Emilio
developtus.com
  #7 (permalink)  
Antiguo 17/02/2010, 07:09
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 17 años
Puntos: 14
Respuesta: Formularios Zend

Cita:
Iniciado por Ferdinandum Ver Mensaje
Oki, se puede crear como validador? o me creo una funcion.


Código PHP:
   public function registrarseAction(){
     
$form = new Forms_reguserForm();
     
$form->setMethod('post')
               ->
setAction($this->getRequest()->getBaseUrl() . '/Auth/Guardar')
               ->
getElement('submit')->setLabel('new  user'); 
               
         
$this->view->form $form;
    }

    public function 
guardarAction(){
          ............
          
$form = new Forms_reguserForm();
          if (!
$form->isValid($this->_request->getPost())) {
            return 
$this->_helper->redirector('registrarse');
          }
          ...........
     } 
Tengo 2 funciones Registrase y Guardar. Registrase es la funcion que carga el formulario y Guardar la que lo valida, Pero cuando hay errores el formulario se crea de nuevo en blanco, como puedo corregir este fallo.


En cuanto a los decorators, no he tocado nada, ya que no enciendo su estructura. Pero preferia hacerlo con una tabla e ir colocando los elementos de uno en uno.
lee sobre como crear validators propios aca http://framework.zend.com/manual/en/...nts.validators



esto

Código PHP:
$form->setMethod('post')
               ->
setAction($this->getRequest()->getBaseUrl() . '/Auth/Guardar')
               ->
getElement('submit')->setLabel('new  user'); 
te convendria ponerlo en el init() de Forms_reguserForm

y el error aca

Código PHP:
public function guardarAction(){
          ............
          
$form = new Forms_reguserForm();
          if (!
$form->isValid($this->_request->getPost())) {
            return 
$this->_helper->redirector('registrarse');
          }
          ...........
     } 
esta en que si no isValid() haces un redirect, entonces el form se vuelve a generar en la nueva pagina pero sin los errores, la logica en Zend funciona al reves:

Código PHP:
if ($form->isValid()) {
// todo ok, aca podes hacer los redirects que quieras total no hubo ningun error
}

//si no entra al if, el form se va a volver a mostrar con los errores que ocurrieron automaticamente 
Para hacer la tabla tendras que entender el uso de los decorators, no es muuuy complicado pero la primera impresion puede ser algo confusa... igualmente lee un poco, hace algunas pruebas y las dudas que tengas las preguntas aca y listo

Saludos
  #8 (permalink)  
Antiguo 17/02/2010, 08:37
 
Fecha de Ingreso: noviembre-2008
Mensajes: 62
Antigüedad: 16 años
Puntos: 1
Respuesta: Formularios Zend

Oki ^^ tenias razon ya consigo todo lo que he hecho es meter todo el codigo que tenia Guardar en Registrarse, asi funciona todo correctamente.

Salvo, cuando el formulario es correcto quiero que vaya a otra pagina, lo he conseguido con una función llamada exito, pero no consigo pasar parametros.

Código PHP:
public function registrarseAction(){
         ...............
        if (
$form->isValid($this->_request->getPost())) {
             ................
 
            
$this->redirec('exito');
        }
  }


 public function 
exitoAction($nombre){
      
$this->view->user=$nombre;
 } 
Como puedo pasar la variable $nombre a exito
  #9 (permalink)  
Antiguo 17/02/2010, 08:43
 
Fecha de Ingreso: febrero-2009
Mensajes: 218
Antigüedad: 15 años, 8 meses
Puntos: 9
Respuesta: Formularios Zend

Hola, se que alguno va a discrepar conmigo, pero yo no utilizo zend_form, creo un helper y alli creo el formulario de forma estandar y luego lo valido con las herramientas que de ZF para ello, hasta ahora no he tenido ningun problema.
Al principio trabaje con zend_form y lo descarté por lo complicado, nunca me quedaban los form como yo quería.
  #10 (permalink)  
Antiguo 17/02/2010, 09:42
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Formularios Zend

@fernandozunni:
Si te refieres a la maquetación, Zend_Form tiene el viewScript decorator que te permite en lugar de usar los decoradores estandar usar un view script para renderear la forma.

Saludos.
  #11 (permalink)  
Antiguo 17/02/2010, 10:01
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 17 años
Puntos: 14
Respuesta: Formularios Zend

Cita:
Iniciado por fernandozunni Ver Mensaje
Hola, se que alguno va a discrepar conmigo, pero yo no utilizo zend_form, creo un helper y alli creo el formulario de forma estandar y luego lo valido con las herramientas que de ZF para ello, hasta ahora no he tenido ningun problema.
Al principio trabaje con zend_form y lo descarté por lo complicado, nunca me quedaban los form como yo quería.
si nunca te quedo como querias fue porque no tenes el conocimiento necesario para el uso de decorators, sino cualquier formulario puede quedar tal cual quieras por mas complicado que sea (creeme que tuve que maquetar formularios de una complejidad tal que lo primero es decir "no, eso no se puede hacer con zend form", pero si, se puede :P), y lo mejor de todo es que hasta es mucho mas rapido y mas facil de cambiar que haciendo los formularios de la forma "tradicional", a mano...

te recomiendo que intentes llevarte bien con los decorators y te vas a enamorar de ellos

si quieres hacemos un trabajito, posteas un form de ejemplo hecho con tu view helper, yo posteo el mismo form hecho con Zend_Form, y vemos cual es mas simple
  #12 (permalink)  
Antiguo 17/02/2010, 11:44
 
Fecha de Ingreso: noviembre-2008
Mensajes: 62
Antigüedad: 16 años
Puntos: 1
Respuesta: Formularios Zend

Cita:
Iniciado por rodrigo_00 Ver Mensaje

te recomiendo que intentes llevarte bien con los decorators y te vas a enamorar de ellos
Oki^^, si dices que me voy a tener que usarles si o si, voy a poner mas empeño e intentar comprenderles. Voy a intentar hacer intentar hacer ejemplos faciles y si no los consigo ya lo posteo.

Gracias de nuevo

Pd: Me esta constando pasar de Symfony a Zend omg XD.
  #13 (permalink)  
Antiguo 17/02/2010, 14:04
 
Fecha de Ingreso: noviembre-2008
Mensajes: 62
Antigüedad: 16 años
Puntos: 1
Respuesta: Formularios Zend

Los ejemplos que he visto es para construir el formulario y el decorator en el controller, a mi me gustaria crearlo dentro de la clase formulario.

Código PHP:
class Forms_reguserForm extends Zend_Form
{
    public function 
init()
    {  
        
$this->setName('New User');
        
        
$username =  $this->createElement('text''username');
        
$username->addValidator($Vcad)
                 ->
setRequired(true)
                         ->
setLabel('Login');
        
$this->addElement($username);
 
    
$password $this->createElement('password''password');
                    ->
setRequired(true)
                         ->
setLabel('Password');
        
$this->addElement($password);

        
$repassword $this->createElement('password''repassword');
                ->
setRequired(true)
                          ->
setLabel('Repassword');
        
$this->addElement($repassword);
        
        
$Email $this->createElement('text''email');
        
$Email->addValidator(new Zend_Validate_EmailAddress());
        
$this->addElement($Email);

        
$this->addElement('submit''submit', array(
            
'ignore'   => true,
            
'label'    => 'Login',
            ));
    }

La salida que quiero conseguir es algo asi

< Etiqueta > || <Input> || <Mensaje de Error>
  #14 (permalink)  
Antiguo 17/02/2010, 14:20
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 17 años
Puntos: 14
Respuesta: Formularios Zend

Formulario y decorator en el mismo lugar, si viste un ejemplo en el controller, esta MAL


ok veamos, el form es asi (lo simplifico un poco)

Código PHP:
class Forms_reguserForm extends Zend_Form
{
    public function 
init()
    {  
        
$this->setName('New User');

        
$this->addElement("text""username", array("label" => "Login"));
 
        
$this->addElement("password""password", array("label" => "Password"));

        
$this->addElement("password""repassword", array("label" => "Repassword"));
        
        
$this->addElement("text""email", array("label" => "Email"));

        
/* seteamos < Etiqueta > || <Input> || <Mensaje de Error> para todos los elementos agregados hasta aca */
        
$this->setElementDecorators(array("Label""ViewHelper""Errors"));


        
// para el boton no queremos ni label ni errors, solo view helper 
        
$this->addElement('submit''submit', array('ignore'   => true'label' => 'Login''decorators' => array("ViewHelper)));
    }

eso te va a dejar por ejemplo:
<label>Login</label><input type="text" name="username" />

y si hay algun error va ponerlo a continuacion de eso dentro de un <ul>

queres el label y el view helper adentro de un div?? facil:

Código PHP:
$this->setElementDecorators(array("Label""ViewHelper""HtmlTag""Errors")); 
eso te deja

<div><label>Login</label><input type="text" name="username" /></div>

dudas??
  #15 (permalink)  
Antiguo 17/02/2010, 16:41
 
Fecha de Ingreso: octubre-2009
Mensajes: 240
Antigüedad: 15 años, 1 mes
Puntos: 6
Respuesta: Formularios Zend

Hola Rodrigo, yo tengo un par de dudas... donde guardas la clase Forms_reguserForm en un proyecto creado con zend tool?

Y si lo quieres decorar con css, como sería?

Gracias.
  #16 (permalink)  
Antiguo 17/02/2010, 17:38
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 17 años
Puntos: 14
Respuesta: Formularios Zend

los forms los tengo en el subdirectorio forms dentro de application, creo que es lo normal (por lo menos siempre lo hago asi :P)

en el form no hacemos nada con css, como muuucho le ponemos una class a algo para luego poder darle el estilo que queramos:

Código PHP:
$this->setElementDecorators(
    array(
        
"Label"
        
"ViewHelper"
        array(
"HtmlTag", array("class" => "row")),
        
"Errors"
        
)
); 
entonces por css luego tenemos facil referenciar los elementos:

.row{}
.row label {}
.row input {}
  #17 (permalink)  
Antiguo 19/02/2010, 13:51
 
Fecha de Ingreso: enero-2008
Mensajes: 115
Antigüedad: 16 años, 10 meses
Puntos: 1
Respuesta: Formularios Zend

Cita:
Iniciado por rodrigo_00 Ver Mensaje
Formulario y decorator en el mismo lugar, si viste un ejemplo en el controller, esta MAL


ok veamos, el form es asi (lo simplifico un poco)

Código PHP:
class Forms_reguserForm extends Zend_Form
{
    public function 
init()
    {  
        
$this->setName('New User');

        
$this->addElement("text""username", array("label" => "Login"));
 
        
$this->addElement("password""password", array("label" => "Password"));

        
$this->addElement("password""repassword", array("label" => "Repassword"));
        
        
$this->addElement("text""email", array("label" => "Email"));

        
/* seteamos < Etiqueta > || <Input> || <Mensaje de Error> para todos los elementos agregados hasta aca */
        
$this->setElementDecorators(array("Label""ViewHelper""Errors"));


        
// para el boton no queremos ni label ni errors, solo view helper 
        
$this->addElement('submit''submit', array('ignore'   => true'label' => 'Login''decorators' => array("ViewHelper)));
    }

eso te va a dejar por ejemplo:
<label>Login</label><input type="text" name="username" />

y si hay algun error va ponerlo a continuacion de eso dentro de un <ul>

queres el label y el view helper adentro de un div?? facil:

Código PHP:
$this->setElementDecorators(array("Label""ViewHelper""HtmlTag""Errors")); 
eso te deja

<div><label>Login</label><input type="text" name="username" /></div>

dudas??
Hola amigo, he ingresado
Código PHP:
$this->setElementDecorators(array("Label""ViewHelper""HtmlTag""Errors")); 
pero lo que me devuelve es:
<div><label>Login</label></div><div><input type="text" name="username" /></div>
sabes a q se debe ?
  #18 (permalink)  
Antiguo 19/02/2010, 15:21
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 17 años
Puntos: 14
Respuesta: Formularios Zend

postea todo el codigo del form y lo vemos, algo debes estar haciendo mal :)

Saludos
  #19 (permalink)  
Antiguo 27/04/2010, 14:13
 
Fecha de Ingreso: abril-2010
Ubicación: Lima-Peru
Mensajes: 94
Antigüedad: 14 años, 7 meses
Puntos: 2
Respuesta: Formularios Zend

Hola rodrigo, excelente tu explicacion y tambien deseo entrar a comprender la creacion de los formularios con zend form, pero tengo un problema al crear un formulario pues deseo que este tenga una cabecera en donde poner la descripcion de mi formulario, por ejemplo puede ser "Datos de Usuario" y a continuacion el formulario y despues de ello puede venir otra descripcion y luego mas formulario. Tal ves se pueda asemejar a una tabla en la que la primera fila se combina las columnas y ahi se pone el titulo de la tabla, luego en la segunda y tercera fila va el nick y el password, en la cuarta fila viene un descripcion todo en la fila que puede ser datos del usuario y en las demas filas los campos nombre, apellidos, email y mas.
Espero me puedas ayudar pues deseo hacerlo con zend form pero no lo consigo. Gracias

Saludos,

Etiquetas: 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 13:34.