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

[SOLUCIONADO] formas de usar decordador ViewScript

Estas en el tema de formas de usar decordador ViewScript en el foro de Zend en Foros del Web. Hola, Me estoy rompiendo la cabeza por querer armar esto con decorator viewScript, esto es lo que deseo hacer: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código HTML: Ver original ...
  #1 (permalink)  
Antiguo 05/02/2013, 13:25
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
formas de usar decordador ViewScript

Hola, Me estoy rompiendo la cabeza por querer armar esto con decorator viewScript, esto es lo que deseo hacer:
Código HTML:
Ver original
  1. <form id="login">
  2.     <h1>Restrici&oacute;n</h1>
  3.     <fieldset id="inputs">
  4.         <input id="username" placeholder="Username" autofocus required type="text">  
  5.         <input id="password" placeholder="Password" required type="password">
  6.     </fieldset>
  7.     <fieldset id="actions">
  8.         <input id="submit" value="Aceptar" type="submit">
  9.         <a href="">Reg&iacute;strate</a>
  10.     </fieldset>
  11. </form>

y este es mi form:
Código PHP:
Ver original
  1. class Application_Form_LoginForm extends Zend_Form {
  2.    
  3.     public function init() {
  4.        
  5.         $this->setDisableLoadDefaultDecorators(true);
  6.        
  7.         $this->setDecorators(array(
  8.                 array ('ViewScript',    array('viewScript'  => 'login/_login.phtml' )),
  9.                 array ('HtmlTag',       array ('tag' => 'dl','id' => 'login' ) ),
  10.                 array ('Description',   array ('placement' => 'prepend') ),
  11.                 'Form'
  12.         ));
  13.        
  14.        
  15.         $this->setMethod('post');
  16.         $this->setAction('');
  17.        
  18.        
  19.         $username = $this->addElement ( 'text', 'username', array (
  20.                 'filters' => array ( 'StringTrim',  'StringToLower' ),
  21.                 'validators' => array ( 'Alpha', array ( 'StringLength',false, array (  3,20 ) ) ),
  22.                 'required' => true,
  23.                 'label' => 'Usuario:'
  24.         ) );
  25.        
  26.         $password = $this->addElement ( 'password', 'password', array (
  27.                 'filters' => array ('StringTrim'),
  28.                 'validators' => array ('Alnum', array ( 'StringLength', false,  array ( 6,  20 ) ) ),
  29.                 'required' => true,
  30.                 'label' => 'Contraseña:'
  31.         ) );
  32.        
  33.        
  34.         $login = $this->addElement ( 'submit', 'login', array (
  35.                 'required' => false,
  36.                 'ignore' => true,
  37.                 'label' => 'Ingresar'              
  38.         ) );
  39. //      'decorators' => array(
  40. //              'ViewHelper',
  41. //              array ('HtmlTag',   array ('tag' => 'dl','id' => 'login' ) ) )
  42.         // We want to display a 'failed authentication' message if necessary;
  43.         // we'll do that with the form 'description', so we need to add that
  44.         // decorator.
  45. //      $this->addDecorators (
  46. //              array ('FormElements',
  47. //              array ('HtmlTag',       array ('tag' => 'dl','id' => 'login' ) ),
  48. //              array ('Description',   array ('placement' => 'prepend') ),
  49. //              'Form'
  50. //      ) );
  51.     }
  52.    
  53. }
este mi _login.phtml
Código HTML:
Ver original
  1. <h1>Restrici&oacute;n</h1>
  2. <fieldset id="inputs">
  3.  
  4. <?php echo $this->element->getElement('username'); ?>
  5. <?php echo $this->element->password; ?>
  6.  
  7. <fieldset id="actions">
  8. <?php echo $this->element->getElement('login'); ?>
  9. <a href="">Reg&iacute;strate</a>
y mi salida es este, que es totalmente diferente:
Código HTML:
Ver original
  1. <form enctype="application/x-www-form-urlencoded" action="" method="post"><dl id="login">
  2.  
  3. <h1>Restrici&oacute;n</h1>
  4. <fieldset id="inputs">
  5.  
  6. <dt id="username-label"><label for="username" class="required">Usuario:</label></dt>
  7. <dd id="username-element">
  8. <input type="text" name="username" id="username" value="" /></dd><dt id="password-label"><label for="password" class="required">Contraseña:</label></dt>
  9. <dd id="password-element">
  10. <input type="password" name="password" id="password" value="" /></dd>
  11. <fieldset id="actions">
  12. <dt id="login-label">*</dt><dd id="login-element">
  13. <input type="submit" name="login" id="login" value="Ingresar" /></dd><a href="">Reg&iacute;strate</a>
  14.  
  15. </dl></form>

gracias de antemano
  #2 (permalink)  
Antiguo 05/02/2013, 13:43
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: formas de usar decordador ViewScript

Es porque si bien el form tiene el decorator ViewHelper el resto de elementos del form tiene los decorators que vienen por defecto, los cuales generan la salida que estas viendo, para obtener un markup "limpio" debes setear únicamente el decorator ViewHelper a los elementos del form.

Código PHP:
Ver original
  1. $form->setElementDecorators(array('ViewHelper'));

ten en cuenta que algo asi no genera label, description ni errors, todos estos elementos los tienes que manejar manualmente, lamentablemente no recuerdo el API pero esta todo dentro de Zend_Form_Element, era algo así:

Código PHP:
Ver original
  1. <?php echo $this->element->username; ?>
  2. <?php if($this->element->username->hasErrors()) : ?>
  3. <p class="errors"><?php echo $this->element->username->getErrorMessages(); ?></p>
  4. <?php endif; ?>

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 05/02/2013, 13:53
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: formas de usar decordador ViewScript

Usa setElementDecorators y pasa solo el viewHelper y Error decorators.

Saludos.
  #4 (permalink)  
Antiguo 05/02/2013, 14:37
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
Respuesta: formas de usar decordador ViewScript

perdon mi ignorancia, entonces debería crearme una variable sea esta $form y a esta agregar setElementDecorators y el ViewHelper?
  #5 (permalink)  
Antiguo 05/02/2013, 15:23
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: formas de usar decordador ViewScript

No, $form se refiere a tu objeto de la forma actual, depende de como lo estés creando. También puedes usar setDecorators en el elemento mismo, o pasarle un elemento 'decorators' a tu array que crea el elemento con los decorators a usar.

Saludos.
  #6 (permalink)  
Antiguo 05/02/2013, 15:36
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: formas de usar decordador ViewScript

Agrégalo al final del init,

Código PHP:
Ver original
  1. public function init()
  2. {
  3.     ...
  4.    $this->setElementDecorators(array('ViewHelper'));
  5. }
__________________
http://es.phptherightway.com/
thats us riders :)
  #7 (permalink)  
Antiguo 06/02/2013, 15:01
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
Respuesta: formas de usar decordador ViewScript

ingrese :
Código PHP:
Ver original
  1. $this->setElementDecorators(array('ViewHelper',
  2.                         array('HtmlTag',array('tag' => 'dl','id'=>'login'))));
pero no funciona, tambien ingresé esto:
Código PHP:
Ver original
  1. $login = $this->addElement ( 'submit', 'login', array (
  2.                 'required' => false,
  3.                 'ignore' => true,
  4.                 'label' => 'Ingresar',
  5.                         'decorators' => array(
  6.                                 'ViewHelper',
  7.                                 array ('HtmlTag',   array ('tag' => 'dl','id' => 'login' ) ) )
  8.         ) );
pero tampoco funcion, como podría arreglar este problema.
  #8 (permalink)  
Antiguo 06/02/2013, 15:20
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: formas de usar decordador ViewScript

Solamente debes de usar el ViewHelper, o en dado caso el Error, si sigues poniendo el HtmlTag te va a seguir "rompiendo" el markup.
  #9 (permalink)  
Antiguo 07/02/2013, 08:18
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
Respuesta: formas de usar decordador ViewScript

he probado esto:
Código PHP:
Ver original
  1. $this->setElementDecorators(array('ViewHelper'));
tambien esto:
Código PHP:
Ver original
  1. $login = $this->addElement ( 'submit', 'login', array (
  2.                 'required' => false,
  3.                 'ignore' => true,
  4.                 'label' => 'Ingresar',
  5.                 'decorators' => array( 'ViewHelper' )
  6.         ) );
y nada, no funciona
  #10 (permalink)  
Antiguo 07/02/2013, 09:47
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: formas de usar decordador ViewScript

Con setElementDecorators te debe de funcionar, ¿cual es el markup que te genera usando tu viewScript?
  #11 (permalink)  
Antiguo 07/02/2013, 09:52
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
Respuesta: formas de usar decordador ViewScript

este es el resultado:
Código HTML:
Ver original
  1. <div id="content">
  2.             <h1></h1>
  3.             <form enctype="application/x-www-form-urlencoded" action="/login/process" method="post"><dl id="login">
  4.  
  5. <h1>Restrici&oacute;n</h1>
  6. <fieldset id="inputs">
  7.  
  8. <dt id="username-label"><label for="username" class="required">Usuario:</label></dt>
  9. <dd id="username-element">
  10. <input type="text" name="username" id="username" value="" />
  11. <ul class="errors"><li>Value is required and can't be empty</li></ul></dd><dt id="password-label"><label for="password" class="required">Contraseña:</label></dt>
  12. <dd id="password-element">
  13. <input type="password" name="password" id="password" value="" />
  14. <ul class="errors"><li>Value is required and can't be empty</li></ul></dd>
  15. <fieldset id="actions">
  16. <dt id="login-label"> </dt><dd id="login-element">
  17. <input type="submit" name="login" id="login" value="Ingresar" /></dd><a href="">Reg&iacute;strate</a>
  18.  
  19. </dl></form>        </div>
  #12 (permalink)  
Antiguo 07/02/2013, 10:10
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: formas de usar decordador ViewScript

¿Donde colocas el setElementDecorators?
  #13 (permalink)  
Antiguo 07/02/2013, 10:16
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
Respuesta: formas de usar decordador ViewScript

lo coloco al final del init:
Código PHP:
Ver original
  1. public function init() {
  2.        
  3. ......     
  4.         $login = $this->addElement ( 'submit', 'login', array (
  5.                 'required' => false,
  6.                 'ignore' => true,
  7.                 'label' => 'Ingresar'
  8.         ) );
  9.         $this->setElementDecorators(array('ViewHelper'));
  10.     }
  #14 (permalink)  
Antiguo 07/02/2013, 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, 5 meses
Puntos: 2135
Respuesta: formas de usar decordador ViewScript

Esta muy raro, porque te sigue poniendo los <dt> y <dd>.

¿Seguro no agregas los elementos después de llamar a $this->setElement?
  #15 (permalink)  
Antiguo 07/02/2013, 10:33
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
Respuesta: formas de usar decordador ViewScript

No, para nada, alguien por ahí me dice que no me complique con los decorators que divida el proyecto en modulos y cree css para cada módulos, pero yo tenía la idea de conocer esto de los decorators
  #16 (permalink)  
Antiguo 07/02/2013, 10:47
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: formas de usar decordador ViewScript

Pues los decorators es algo independiente de los módulos y del CSS...

Como te digo a mi me funciona bien usar el viewScript:
Código PHP:
Ver original
  1. class FooBar extends Zend_Form
  2. {
  3.     public function init()
  4.     {
  5.         $this->setMethod(Zend_Form::METHOD_POST);
  6.        
  7.         $this->addElement('text', 'foo', array(
  8.             'required' => true,
  9.             'filters' => array('StringTrim')
  10.         ));
  11.         $this->addElement('text', 'bar', array(
  12.             'required' => true,
  13.             'filters' => array('StringTrim'),
  14.             'validators' => array(
  15.                 array('Float')
  16.             )
  17.         ));
  18.        
  19.         $this->addElement('submit', 'enviar', array(
  20.             'ignore' => true,
  21.             'label' => 'Guardar'
  22.         ));
  23.        
  24.         $this->setElementDecorators(array(
  25.             'ViewHelper'
  26.         ));
  27.        
  28.         $this->setDecorators(array(
  29.             'FormErrors',
  30.             array('ViewScript', array('viewScript' => 'form.phtml')),
  31.             'Form'
  32.         ));
  33.     }
  34. }

Saludos.
  #17 (permalink)  
Antiguo 07/02/2013, 12:11
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
Respuesta: formas de usar decordador ViewScript

pues la verdad no se donde pueda estar el problema: este es un completo de mi código LoginForm.php
Código PHP:
Ver original
  1. class Application_Form_LoginForm extends Zend_Form {
  2.    
  3.     public function init() {
  4.        
  5.         $this->setMethod(Zend_Form::METHOD_POST);
  6.         $username = $this->addElement ( 'text', 'username', array (
  7.                 'filters' => array ( 'StringTrim',  'StringToLower' ),
  8.                 'validators' => array ( 'Alpha', array ( 'StringLength',false, array (  3,20 ) ) ),
  9.                 'required' => true,
  10.                 'label' => 'Usuario:'
  11.         ) );
  12.        
  13.         $password = $this->addElement ( 'password', 'password', array (
  14.                 'filters' => array ('StringTrim'),
  15.                 'validators' => array ('Alnum', array ( 'StringLength', false,  array ( 6,  20 ) ) ),
  16.                 'required' => true,
  17.                 'label' => 'Contraseña:'
  18.         ) );
  19.        
  20.         $login = $this->addElement ( 'submit', 'login', array (
  21.                 'required' => false,
  22.                 'ignore' => true,
  23.                 'label' => 'Ingresar'
  24.         ) );
  25.         $login = $this->addElement ( 'submit', 'login', array (
  26.                 'required' => false,
  27.                 'ignore' => true,
  28.                 'label' => 'Ingresar'
  29.         ) );       
  30.        
  31.         $this->setElementDecorators(array('ViewHelper'));
  32.        
  33.         $this->setDecorators(array(
  34.                 array ('ViewScript',    array('viewScript'  => 'login/_login.phtml' )),
  35.                 array ('HtmlTag',       array ('tag' => 'dl','id' => 'login' ) ),
  36.                 array ('Description',   array ('placement' => 'prepend') ),
  37.                 'Form'
  38.         ));
  39.     }  
  40. }
y este es el phtml _login.phtml
Código HTML:
Ver original
  1. <h1>Restrici&oacute;n</h1>
  2. <fieldset id="inputs">
  3.  
  4. <?php echo $this->element->getElement('username'); ?>
  5. <?php echo $this->element->password; ?>
  6.  
  7. <fieldset id="actions">
  8. <?php echo $this->element->getElement('login'); ?>
  9. <a href="">Reg&iacute;strate</a>
  #18 (permalink)  
Antiguo 07/02/2013, 12:20
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: formas de usar decordador ViewScript

Prueba poner los decorators de tu forma como los tengo en el ejemplo que te pase.

Luego en tu view script, basta con que hagas echo $this->element->username, no es necesario que uses $this->element->getElement.

Saludos.
  #19 (permalink)  
Antiguo 07/02/2013, 12:39
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
Respuesta: formas de usar decordador ViewScript

Puse
Código PHP:
Ver original
  1. <?php echo $this->element->password; ?>
pero tampoco funciona.

Analizando mi problema, tengo:
Código PHP:
Ver original
  1. $this->setDecorators(array(
  2.                 array ('ViewScript',    array('viewScript'  => 'login/_login.phtml' )),
  3.                 array ('HtmlTag',       array ('tag' => 'dl','id' => 'login' ) ),
  4.                 array ('Description',   array ('placement' => 'prepend') ),
  5.                 'Form'
  6.         ));
Con esto no consigo hacer
Código HTML:
Ver original
  1. <form enctype="application/x-www-form-urlencoded" action="/login/process" method="post"><dl id="login">
cuando lo que quiero es
Código HTML:
Ver original
  1. <form id="login">
pero tambien necesito generar:
Código HTML:
Ver original
  1. <input id="username" placeholder="Username" autofocus required type="text">
cuando lo que logro es:
Código HTML:
Ver original
  1. <input type="text" name="username" id="username" value="" />
ademas el boton en pantalla me muestra enorme y esto es lo que quiero:
Código HTML:
Ver original
  1. <input id="submit" value="Aceptar" type="submit">
y he logrado hacer esto:
Código HTML:
Ver original
  1. <input type="submit" name="login" id="login" value="Ingresar" />
debe haber algúna forma de maquetar como uno desea con css sus formularios
  #20 (permalink)  
Antiguo 07/02/2013, 13:32
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: formas de usar decordador ViewScript

Como te digo cambia los decorators de tu forma como el ejemplo que te pase.

Si quieres los otros atributos de tu input también los puedes agregar al usar addElement.

Saludos.
  #21 (permalink)  
Antiguo 07/02/2013, 13:40
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
Respuesta: formas de usar decordador ViewScript

Cómo y dónde agregaría estos atributos
  #22 (permalink)  
Antiguo 07/02/2013, 15:24
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: formas de usar decordador ViewScript

En el addElement cuando agregas tú elemento.

Código PHP:
Ver original
  1. $this->addElement('text', 'foo', array(
  2.             'required' => true,
  3.             'filters' => array('StringTrim'),
  4.             'placeholder' => 'Algo',
  5.             'autofocus' => 'autofocus',
  6.         ));
  #23 (permalink)  
Antiguo 08/02/2013, 07:32
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
Respuesta: formas de usar decordador ViewScript

una consulta mas quiero ingresar esto:
Código HTML:
Ver original
  1. <input id="username" placeholder="Username" autofocus required type="text">
pero tengo dos required en el text:
Código PHP:
Ver original
  1. $username = $this->addElement ( 'text', 'username', array (
  2.                 'filters' => array ( 'StringTrim','StringToLower'),
  3.                 'placeholder' => 'Username','autofocus' => 'autofocus', 'required' => 'required',   //1 required
  4.                 'validators' => array ( 'Alpha', array ( 'StringLength',false, array (  3,20 ) ) ),
  5.                 'required' => true,                                                                 //2required
  6.                 'label' => 'Usuario:'
  7.         ) );
cómo hago que se muestre el required
  #24 (permalink)  
Antiguo 08/02/2013, 10:10
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: formas de usar decordador ViewScript

Puedes usar $username->setAttrib('required', 'required');
  #25 (permalink)  
Antiguo 08/02/2013, 13:02
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
Respuesta: formas de usar decordador ViewScript

Inserta el required pero en:
Código PHP:
Ver original
  1. <form enctype="application/x-www-form-urlencoded" action="/login/process" method="post" required="required">
y no en el text.
  #26 (permalink)  
Antiguo 08/02/2013, 13:05
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: formas de usar decordador ViewScript

Una disculpa tienes que leer directo en el elemento, ejemplo:
Código PHP:
Ver original
  1. $this->addElement('text', 'foo');
  2. $this->foo->setAttrib('required', 'required');

Saludos.
  #27 (permalink)  
Antiguo 08/02/2013, 13:18
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
Respuesta: formas de usar decordador ViewScript

Se te agradece un monton, muchas por responder tan rápido

Etiquetas: formas, usar
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 15:16.