Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Decorator para un Form

Estas en el tema de Decorator para un Form en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola. He hecho mis propios decoradores para los elementos, pero también quiero ponerle un decorador propio a mi form y resulta que me está fallando. ...
  #1 (permalink)  
Antiguo 21/07/2011, 06:36
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años, 1 mes
Puntos: 0
Decorator para un Form

Hola. He hecho mis propios decoradores para los elementos, pero también quiero ponerle un decorador propio a mi form y resulta que me está fallando.

Lo que hago en el form es esto:

Código PHP:
 $this
      
->addPrefixPath('Yimgo_Decorator_Printit''Yimgo/Decorator/Printit/''decorator')
      ->
addDecorator("Form"); 
$this es el form.

Y esta es mi clase de decorador para mostrar lo que yo quiero:

Código PHP:
class Yimgo_Decorator_Printit_Form extends Zend_Form_Decorator_Form {
    
    
  public function 
render($content)
    {
        
$form    $this->getElement();
        
$view    $form->getView();
        if (
null === $view) {
            return 
$content;
        }

        
$helper        $this->getHelper();
        
$attribs       $this->getOptions();
        
$name          $form->getFullyQualifiedName();
        
$attribs['id'] = $form->getId();
        return 
$view->$helper($name$attribs$content);
        
    }

El render es el mismo que el de Zend_Form_Decorator_Form y no me va, cuando me vaya pues entonces quiero personalizarlo.

He probado con hacer extends de Zend_Form_Decorator_Abstract y con Zend_Form_Decorator_Form, pero sólo me sale el <form></form> vacio, sin mis elementos que ya he añadido antes.
  #2 (permalink)  
Antiguo 21/07/2011, 08:50
 
Fecha de Ingreso: marzo-2010
Mensajes: 71
Antigüedad: 14 años, 1 mes
Puntos: 24
Respuesta: Decorator para un Form

Holas.

Te hace falta poner los elementos del form, que en cierta manera son considerados como decoradores. Proba con:
Código PHP:
Ver original
  1. $this
  2.       ->addPrefixPath('Yimgo_Decorator_Printit', 'Yimgo/Decorator/Printit/', 'decorator')
  3.       ->addDecorator('FormElements');
  4.       ->addDecorator('Form');

Saludos
  #3 (permalink)  
Antiguo 21/07/2011, 08:58
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Decorator para un Form

Gracias. Funciona!

Pero ahora resulta que mis elementos han perdido sus decoradores personalizados.

Lo que hice fue hacer elementos personalizados en clases y ahí dentro ponerle decoradores personalizados de otra clase y en el form esto:
Código PHP:
Ver original
  1. $this->addElementPrefixPath('Yimgo_Decorator_Printit',
  2.                             'Yimgo/Decorator/Printit/',
  3.                             'decorator');

Pero ahora al hacer lo otro que me has dicho no me va.

Gracias.
  #4 (permalink)  
Antiguo 21/07/2011, 12:19
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: Decorator para un Form

Habria que ver esos decorators, podrias postear alguno ?
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 22/07/2011, 02:27
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Decorator para un Form

Hola de nuevo, voy a poner todo el código para ver que estoy haciendo mal, la cosa es que si me funciona el decorador para el form (ahora mismo no hace nada), pero los decoradores de los elementos que si funcionaban antes ahora no lo hacen.

Este es el form
/applicattion/forms/Datospago.php

Código PHP:
Ver original
  1. <?php
  2. class Application_Form_Datospago extends Zend_Form
  3. {
  4.     public function init() {
  5.  
  6.         $nombre = new Yimgo_Element_Textr('nombre');
  7.         $nombre->setLabel('label_Nombre');
  8.        
  9.         $apellidos = new Yimgo_Element_Textr('apellidos');
  10.         $apellidos->setLabel('label_Apellidos');
  11.        
  12.         $razon= new Yimgo_Element_Text('razon');
  13.         $razon->setLabel("label_razon");
  14.        
  15.         $dni= new Yimgo_Element_Text('dni');
  16.         $dni->setLabel("label_dni");
  17.        
  18.         $telefono= new Yimgo_Element_Text('telefono');
  19.         $telefono->setLabel("label_telefono");
  20.        
  21.         $movil= new Yimgo_Element_Text('movil');
  22.         $movil->setLabel("label_movil");
  23.        
  24.         $email= new Yimgo_Element_Textr('email');
  25.         $email->setLabel("label_email")
  26.               ->addValidator('EmailAddress');
  27.        
  28.        
  29.         //Direccion de entrega
  30.         $e_direccion=new Yimgo_Element_Textr('e_direccion');
  31.         $e_direccion->setLabel("label_direccion");
  32.        
  33.         $e_poblacion=new Yimgo_Element_Textr('e_poblacion');
  34.         $e_poblacion->setLabel("label_localidad");
  35.        
  36.         $e_cp=new Yimgo_Element_Textr('e_cp');
  37.         $e_cp->setLabel("label_cp");
  38.        
  39.         $e_provincias = new Zend_Form_Element_Select("e_provincias");
  40.         $e_provincias->setLabel("label_provincias")
  41.                 ->setRequired(true)
  42.                 ->addPrefixPath('Yimgo_Decorator_Printit', 'Yimgo/Decorator/Printit/', 'decorator')
  43.                 ->addDecorator('Textitem')
  44.                 ;
  45.        
  46.         $provinciasdb=new Application_Model_DbTable_Provincias();
  47.         $provincias=$provinciasdb->getAllProvincias();
  48.        
  49.         foreach ($provincias as $data) {
  50.             $e_provincias->addMultiOption($data["id"],$data["nombre"]);
  51.         }
  52.        
  53.          //Direccion de factura
  54.         $f_direccion=new Yimgo_Element_Text('f_direccion');
  55.         $f_direccion->setLabel("label_direccion");
  56.        
  57.         $f_poblacion=new Yimgo_Element_Text('f_poblacion');
  58.         $f_poblacion->setLabel("label_localidad");
  59.        
  60.         $f_cp=new Yimgo_Element_Text('f_cp');
  61.         $f_cp->setLabel("label_cp");
  62.        
  63.         $f_provincias = new Zend_Form_Element_Select("f_provincias");
  64.         $f_provincias->setLabel("label_provincias")
  65.                 ->addPrefixPath('Yimgo_Decorator_Printit', 'Yimgo/Decorator/Printit/', 'decorator')
  66.                 ->addDecorator('Textitem')
  67.                 ;
  68.        
  69.         foreach ($provincias as $data) {
  70.             $f_provincias->addMultiOption($data["id"],$data["nombre"]);
  71.         }
  72.        
  73.        
  74.         $comentarios=new Yimgo_Element_Text('comentarios');
  75.         $comentarios->setLabel("label_comentarios");
  76.        
  77.         $submit = new Zend_Form_Element_Submit('submit');
  78.         $submit->setAttrib('id', 'submitbutton')
  79.                 ->setRequired(true)
  80.                 ->setAttrib('class', 'btnform')
  81.                 ->setLabel("label_Send");
  82.  
  83.  
  84.    
  85.    
  86.     $this
  87.       ->addPrefixPath('Yimgo_Decorator_Printit',
  88.                              'Yimgo/Decorator/Printit/',
  89.                              'decorator')
  90.      
  91.       ->addDecorator('FormElements')
  92.       ->addDecorator("Form");
  93.    
  94.      $this->addElementPrefixPath('Yimgo_Decorator_Printit',
  95.                             'Yimgo/Decorator/Printit/',
  96.                             'decorator');
  97.      
  98.     $this->addElements(array(
  99.         $nombre,
  100.         $apellidos,
  101.         $razon,
  102.         $telefono,
  103.         $movil,
  104.         $email,
  105.         $e_direccion,
  106.         $e_poblacion,
  107.         $e_cp,
  108.         $e_provincias,
  109.         $f_direccion,
  110.         $f_poblacion,
  111.         $f_cp,
  112.         $f_provincias,
  113.         $comentarios,
  114.         $submit
  115.         ));
  116.    
  117.    
  118.      
  119.    
  120.  
  121.     }
  122.        
  123.     }


Este sería el elemento texto, tengo dos, el text y el textr, sólo se diferencian en que uno tiene un require y el otro no, por eso sólo copio uno.

/library/Yimgo/Element/Text.php

Código PHP:
Ver original
  1. <?php
  2.  
  3. /**
  4.  * Text
  5.  *
  6.  * @package
  7.  * @author antoniopmfree
  8.  * @version 1.0
  9.  */
  10. class Yimgo_Element_Text extends Zend_Form_Element {
  11.    
  12.     public function init() {
  13.         $this
  14.         ->addPrefixPath('Yimgo_Decorator_Printit', 'Yimgo/Decorator/Printit/', 'decorator')
  15.         ->addDecorator('Textitem')
  16.         ->addFilter('StripTags')
  17.         ->addFilter('StringTrim');
  18.     }
  19. }
  20.  
  21. ?>

Este sería el decorador de los elementos al que hago referencia en el anterior archivo.
/library/Yimbo/Decorator/Printit/Textitem.php

Código PHP:
Ver original
  1. <?php
  2.  
  3.  
  4. class Yimgo_Decorator_Printit_Textitem extends Zend_Form_Decorator_Abstract {
  5.    
  6.     public function buildLabel()
  7.     {
  8.         $element = $this->getElement();
  9.         $label = $element->getLabel();
  10.         if ($translator = $element->getTranslator()) {
  11.             $label = $translator->translate($label);
  12.         }
  13.         if ($element->isRequired()) {
  14.             $label .= '*';
  15.         }
  16.         $label .= ':';
  17.         return $element->getView()
  18.                        ->formLabel($element->getName(), $label);
  19.     }
  20.  
  21.     public function buildInput()
  22.     {
  23.         $element = $this->getElement();
  24.         $helper  = $element->helper;
  25.         return $element->getView()->$helper(
  26.             $element->getName(),
  27.             $element->getValue(),
  28.             $element->getAttribs(),
  29.             $element->options
  30.         );
  31.     }
  32.  
  33.     public function buildErrors()
  34.     {
  35.         $element  = $this->getElement();
  36.         $messages = $element->getMessages();
  37.         if (empty($messages)) {
  38.             return '';
  39.         }
  40.         return '<div class="errors">' .
  41.                $element->getView()->formErrors($messages) . '</div>';
  42.     }
  43.  
  44.     public function buildDescription()
  45.     {
  46.         $element = $this->getElement();
  47.         $desc    = $element->getDescription();
  48.         if (empty($desc)) {
  49.             return '';
  50.         }
  51.         return '<div class="description">' . $desc . '</div>';
  52.     }
  53.  
  54.     public function render($content)
  55.     {
  56.         $element = $this->getElement();
  57.         if (!$element instanceof Zend_Form_Element) {
  58.             return $content;
  59.         }
  60.         if (null === $element->getView()) {
  61.             return $content;
  62.         }
  63.  
  64.         $separator = $this->getSeparator();
  65.         $placement = $this->getPlacement();
  66.         $label     = $this->buildLabel();
  67.         $input     = $this->buildInput();
  68.         $errors    = $this->buildErrors();
  69.         $desc      = $this->buildDescription();
  70.  
  71.         $output = '<tr>
  72.    <td rowspan="18" class="vacio"></td>
  73.    <td class="nombre">'
  74.                 . $label
  75.                 .'</td></tr><td colspan="5">'
  76.                 . $input
  77.                 . $errors
  78.                 . $desc
  79.                 .'</td></tr>';
  80.  
  81.         switch ($placement) {
  82.             case (self::PREPEND):
  83.                 return $output . $separator . $content;
  84.             case (self::APPEND):
  85.             default:
  86.                 return $content . $separator . $output;
  87.         }
  88.     }
  89. }
  90. ?>


y Este es el decorador que he usado para el form, en este caso, lo único que hago es devolver el content, porque primero quiero que me funcione lo otro y luego le pongo lo que me interesa.

/library/Yimgo/Decorator/Printiit/Form.php
Código PHP:
Ver original
  1. <?php
  2.  
  3.  
  4. class Yimgo_Decorator_Printit_Form extends Zend_Form_Decorator_Abstract {
  5.    
  6.    
  7.   public function render($content)
  8.     {
  9.         return $content;
  10.     }
  11. }
  12. ?>
  #6 (permalink)  
Antiguo 22/07/2011, 03:58
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Decorator para un Form

Hola de Nuevo,

Tengo que decir que si que funciona!!, lo siento por no haberlo visto antes, pero de todos modos aquí tenéis el aporte del código.

Gracias por los que me habéis prestado ayuda.

Etiquetas: zend, 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:53.