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

Añadir otros elementos usando Zend_Form

Estas en el tema de Añadir otros elementos usando Zend_Form en el foro de Zend en Foros del Web. Saludos corillo, Estoy estudiando la parte de Zend_Form y ya he podido añadir y editar datos. Ahora cuando el usuario sube una imagen me gustaria ...
  #1 (permalink)  
Antiguo 12/02/2011, 16:57
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Añadir otros elementos usando Zend_Form

Saludos corillo,

Estoy estudiando la parte de Zend_Form y ya he podido añadir y editar datos. Ahora cuando el usuario sube una imagen me gustaria que si fueran a editar la informacion y la imagen la fueran a cambiar, me gustaria que saliera la imagen antes del boton de submit. Vi que se puede crear formularios usando ViewScript. Pero los ejemplos que vi todos crean el formulario completo, no se si se puede mezclar lo que he hecho el usar Zend_Form_Element_* y ViewScript. Si se puede me podrian brindar un ejemplo o alguna lectura sobre como hacerlo "mezclado".

Si existe otra forma de hacerlo me gustaria saberlo para estudiarlo.

Muchas gracias.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #2 (permalink)  
Antiguo 12/02/2011, 17:37
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Añadir otros elementos usando Zend_Form

No entendi muy bien la pregunta abimaelrc, pero te dejo un par de enlaces, sobre el uso de decorators(entre ellos viewscript), y en la documentación tenes un ejemplo de como aplicar viewscript a un elemento en concreto.
Igual te comento que si es algo parecido a un avatar se suele colocar la imagen en la descripción del file, jugando un poco con los decoratos, te dejo un ejemplo de esto último:

Código PHP:
Ver original
  1. class Application_Form_User extends Zend_Form
  2. {
  3.     public function init()
  4.     {
  5.         ...
  6.         $this->addElement('file', 'file', array(            
  7.             'decorators' => array(
  8.                 array('Description', array('tag' => 'p', 'class' => 'description', 'escape' => false)),
  9.                 array('File'),
  10.                 array('Errors'),
  11.                 array('HtmlTag', array('tag' => 'dd')),
  12.                 array('Label', array('tag' => 'dt'))
  13.             ),
  14.             'description' => '<img src="' . $this->getView()->baseUrl($this->getModel()->name) . '" alt="' . $this->getModel()->realname . '" />',            
  15.         ));
  16.         ...
  17.     }
  18. }

Agregado: luego de mirar el decorator del submit, lo podrias hacer asi:

Código PHP:
Ver original
  1. $this->addElement('submit', 'submit', array(
  2.     'decorators' => array(
  3.         array('Description', array('escape' => false)),
  4.         array('Tooltip'),
  5.         array('ViewHelper'),
  6.         array('DtDdWrapper')
  7.     ),
  8.     'description' => '<img src="' . $this->getView()->baseUrl($this->getModel()->name) . '" alt="' . $this->getModel()->realname . '">'
  9.  ));

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)

Última edición por masterpuppet; 12/02/2011 a las 17:52 Razón: Agregado decorator submit
  #3 (permalink)  
Antiguo 12/02/2011, 18:27
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Añadir otros elementos usando Zend_Form

También puedes usar un ViewScript para decorar la forma por completo, por ejemplo:
Código PHP:
Ver original
  1. $this->setElementDecorators(array(
  2.             'ViewHelper'
  3.         ));
  4.  
  5. $this->setDecorators(array(
  6.         'FormErrors',
  7.             array('ViewScript', array('viewScript' => 'form.phtml')),
  8.             'Form'
  9.         ));

Luego tu script form.phtml puedes poner algo así:
Código PHP:
Ver original
  1. <table>
  2.         <tr>
  3.                 <td>Nombre</td>
  4.                 <td><?php echo $this->element->login; ?></td>
  5.         </tr>
  6. </table>

Saludos.
  #4 (permalink)  
Antiguo 12/02/2011, 21:04
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Añadir otros elementos usando Zend_Form

Muchas gracias, la idea que tomé por el momento es la de usar description, que va bastante de la mano con lo que quiero hacer.

Ahora tengo unas dudas con lo de ViewScript, ¿donde debo colocar el form.phtml? ¿Con ViewScript solo se pueden crear formularios completos o sea desde <form> hasta </form> o también puedo crear input solamente? Es decir vamos a suponer que tengo esto creado
Código PHP:
Ver original
  1. class Foo_Bar_Candy extends Zend_Form
  2. {
  3.     public function init()
  4.     {
  5.         $this->setAction('/foo/bar/candy')
  6.             ->setEnctype('multipart/form-data')
  7.             ->setMethod('post');
  8.  
  9.         $foo = new Zend_Form_Element_Text('foo');
  10.         $foo->setLabel('Foo:')
  11.             ->setOptions(array('size' => 30, 'maxlength' => 50))
  12.             ->setRequired(true);
  13.  
  14.         $bar = new Zend_Form_Element_Textarea('bar');
  15.         $bar->setLabel('Bar:')
  16.             ->setOptions(array('rows' => 8, 'cols' => 50))
  17.             ->setRequired(true)
  18.             ->addFilter('StripTags')
  19.             ->addFilter('StringTrim');
  20.  
  21.         /**
  22.          * Esta es la parte que deseo cambiar usando ViewScript
  23.          */
  24.         $candy = new Zend_Form_Element_File('candy');
  25.         $candy->setLabel('Candy:');
  26.         /**
  27.          * Hasta aquí
  28.          */
  29.  
  30.         $submit = new Zend_Form_Element_Submit('submit');
  31.         $submit->setLabel('Submit')
  32.             ->setOptions(array('class' => 'submit'));
  33.  
  34.         // attach elements to form
  35.         $this->addElement($foo)
  36.             ->addElement($bar)
  37.             ->addElement($candy)
  38.             ->addElement($submit);
  39.     }
  40. }
¿Cómo haría para solo añadir con ViewScript el file?

@masterpuppet Gracias por los enlaces, ya los había leido los dos enlaces, de ahí fue que hice esta pregunta, porque los ejemplos que brindan son con formularios completos y no como el ejemplo que coloqué.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #5 (permalink)  
Antiguo 12/02/2011, 21:53
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Añadir otros elementos usando Zend_Form

El decorator ViewScript lo podes utilizar tanto para el form completo, que es el caso del primero link que te pase(la seccion dice algo asi como "Full Customization..."), como para un element, que es el caso del segundo link(la doc oficial), la ruta por defecto donde busca el .phtml es en script/views del modulo(aunque se puede setear otro modulo).

Te dejo un ejemplo ya que el elemento File es algo particular, el decorator File siempre ha de estar presente y la opción placement del viewscript debe estar a false.

application/forms/User.php
Código PHP:
Ver original
  1. class Application_Form_User extends Zend_Form
  2. {
  3.     public function init()
  4.     {
  5.         ...
  6.         $this->addElement('file', 'candy', array(            
  7.             'label' => 'Candy:'
  8.             'decorators' => array(
  9.                 array('File'),
  10.                 array('ViewScript', array(
  11.                     'viewScript' => '_element.phtml',                    
  12.                     'placement' => false))
  13.              ),
  14.             'description' => '<img src="' . $this->getView()->baseUrl($this->getModel()->Image->name) . '" alt="' . $this->getModel()->Image->realname . '" >',            
  15.         ));
  16.         ...
  17.     }
  18. }

application/views/scripts/_element.phtml
Código HTML:
Ver original
  1. <label for="<?php echo $this->element->getName(); ?>"
  2.        class="element <?php if ($this->element->hasErrors()): ?> error <?php endif; ?>"
  3.        id="label_<?php echo $this->element->getName(); ?>">    
  4. <span class="label"><?php echo $this->element->getLabel(); ?></span>
  5. <span class="avatar"><?php echo $this->element->getDescription(); ?></span>
  6. <?php echo $this->content; ?>
  7. <?php if ($this->element->hasErrors()): ?>
  8.     <span class="error">
  9.         <?php echo $this->formErrors($this->element->getMessages()); ?>
  10.     </span>
  11. <?php endif; ?>
  12. </label>l

Creo que esta todo, aunque se me puede haber pasado algo.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #6 (permalink)  
Antiguo 12/02/2011, 22:22
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Añadir otros elementos usando Zend_Form

Ok, ahora entiendo mejor.

Lo de colocar File en el decorator, me di cuenta cuando me salió ese mega mensaje de "exception". Pensaba que con ViewHelper se podía, pero en file es diferente porque hay que mencionar File como string o como array, la explicación de donde lo leí por primera vez no me convenció cuando la vi, pero funciona de esa forma .

Esta parte
Código PHP:
Ver original
  1. $this->getModel()->Image->name
Me produce un error
Cita:
Method getModel does not exist
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 13/02/2011 a las 00:07
  #7 (permalink)  
Antiguo 12/02/2011, 23:13
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Añadir otros elementos usando Zend_Form

Añado:
Estaba buscando y no he podido encontrar como añadir el valor de lo que brinda el populate a la imagen. Es decir, en el controlador uso algo como $form->populate($row); Eso llena automáticamente los valores, pero no he podido dar de como añadir a la imagen el valor de lo que trae el populate.

Edito:
Por ahora, viendo esta contestación http://zend-framework-community.6341....html#a1752181 es usar un setter para lograrlo, esto fue lo que hice
Código PHP:
Ver original
  1. <?php
  2. class Foo_Bar_Candy extends Zend_Form
  3. {
  4.     private $_foo = '';
  5.     private $_bar = '';
  6.  
  7.     public function setFoo($foo)
  8.     {
  9.         $this->_foo = $foo;
  10.     }
  11.  
  12.     public function setBar($bar)
  13.     {
  14.         $this->_bar = $bar;
  15.     }
  16.  
  17.     public function init()
  18.     {
  19.     $img = new Zend_Form_Element_File('candy');
  20.     $img->setLabel('Candy:')
  21.         ->setDecorators(
  22.             array(
  23.                 array('Description', array('tag' => 'p', 'class' => 'description', 'escape' => false)),
  24.                 array('File'),
  25.                 array('Errors'),
  26.                 array(array('data' => 'HtmlTag'), array('tag' => 'dd')),
  27.                 array('Label', array('tag' => 'dt')),
  28.             )
  29.         )
  30.         ->setDescription('<img src="/files/' . $this->_foo . '" alt="' . $this->_bar . '" />');
  31.     }
  32. }

En el constructor
Código PHP:
Ver original
  1. class Foo_BarController extends Zend_Controller_Action
  2. {
  3.     $foo = 'imagen.jpg';
  4.     $bar = 'Titulo de la imagen';
  5.     $this->view->form = new Foo_Bar_Candy(array('foo' => $foo, 'bar' => $bar));
  6. }

Si hay otra forma, me gustaría saberlo para así aprender
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 12/02/2011 a las 23:50
  #8 (permalink)  
Antiguo 13/02/2011, 05:49
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Añadir otros elementos usando Zend_Form

Es correcto abimaelrc, la otra forma es reescribir el constructor teniendo los cuidados del caso y agregar mas hooks(preBuild, postBuild, etc....), pero en este caso no creo que sea necesario.
Populate no te sirve porque lo que hace es asignar los values a los diferentes Elements.
Te dejo un par de sugerencias y es que uses las constantes de Zend_Form, por ejemplo en el method y el enctype, y las url's siempre deberían crearse con el view helper url, por ejemplo el action, algo asi:

Código PHP:
Ver original
  1. ...
  2. this->setAction($this->view->url(array(
  3.          'module' => 'foo',
  4.          'controller' => 'bar',
  5.          'action'     => 'candy'
  6.       )))
  7.      ->setEnctype(Zend_Form::ENCTYPE_MULTIPART)
  8.      ->setMethod(Zend_Form::METHOD_POST);
  9. ...

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #9 (permalink)  
Antiguo 13/02/2011, 11:06
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Añadir otros elementos usando Zend_Form

Ok, gracias lo tendré en cuenta para estudiar más a fondo
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Etiquetas: añadir, elementos
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 02:21.