2012-09-19 9 views
5

Estoy construyendo una aplicación de silex (la fuente es here)
En el App\Form\DataTransformer tengo una clase MetadataTransformer.
Pero el método transform no funciona (la transformación inversa sí lo hace).
Se aplica a App\Form\Metadata AbstractType, que forma parte de una colección en App\Form\ArticleForm AbstractType.
La última forma se llama en el método de edición de mi App\Controller\Admin\ArticleAdminControllerMi transformador no funciona (de datos de modelo a datos de formulario)

El transformador de datos se supone que asignar una información como esta

{"key":"value"} 

en un "formulario de datos" como:

[{"name":"key","value":"key"}] 

Por lo tanto, se puede mostrar como una colección.

Metadata.php

class MetaData extends AbstractType 
{ 
    protected $span4 = "span4"; 
    protected $span3 = "span3"; 

    public function buildForm(FormBuilderInterface $builder,array $options) 
    { 
     $builder 
      ->add('name', 'text', array(
       "label" => ' ', 
       "attr" => array(
        "class"  => $this->span3, 
        "placeholder" => "name" 
       ) 
      )) 
      ->add('value', 'text', array(
       'label' => ' ', 
       'attr' => array(
        "class"  => $this->span4, 
        'placeholder' => 'value' 
       ) 
      )) 
     ; 
    } 

    public function getName() 
    { 
     return "MetaData"; 
    } 
} 

ArticleForm.php

class ArticleForm extends AbstractType 
{ 
    // ...some code... 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $transformer = new TagsToArrayTransformer(); 
     $metadataTransformer = new MetadataTransformer(); 

     $builder->add("title", "text", array(
      "required" => true, 
      "attr"  => array(
       "class"  => $this->defaultClass, 
       "placeholder" => "The title" 
      ) 
     )); 
     $builder->add("content", "textarea", array(
      "attr" => array(
       "placeholder" => "the content", 
       "rows"  => 20, 
       "class"  => $this->defaultClass 
      ) 
     )); 
     $builder->add(
      $builder->create('metadatas', 'collection', array(
       "type"   => new MetaData(), 
       'allow_add' => true, 
       'allow_delete' => true, 
       'by_reference' => false, 
      )) 
      ->addModelTransformer($metadataTransformer) 
     ); 

     // ...some code... 
    } 

    public function getName() 
    { 
     return "article"; 
    } 
} 

Mi transformador de datos debe ser similar:

MetadataTransformer.php

namespace App\Form\DataTransformer; 

use Symfony\Component\Form\DataTransformerInterface; 

class MetadataTransformer implements DataTransformerInterface 
{ 
    function transform($metadatas) 
    { 
     foreach($metadatas as $key => $value) { 
      $result[] = array('name' => $key, 'value' => $value); 
     } 

     return $result; 
    } 

    function reverseTransform($metadatas) 
    { 
     if(is_array($metadatas)) { 
      foreach($metadatas as $value) { 
       $result[$value['name']] = $value['value']; 
      } 

      return $result; 
     } 
    } 
} 

El reverseTransform funciona, pero el transfom sí mismo no parece.
El objetivo aquí es ser capaz de mostrar una colección dinámica en una forma (añadir y eliminar metadatos de forma dinámica en mi página de formulario artículo)

En el repositorio agrego para cambiar el código para que funcione (es decir, la transformación de la datas en el controlador ArticleAdminController, en lugar de hacerlo en el Transformer)
Si registro el resultado de la transformación en tiempo de ejecución, el resultado es el esperado, pero el formulario no lo usará.

Probé la aplicación addViewforformer/addModelTransformer 2.1 pero no hizo ninguna diferencia.

Entonces, ¿qué ocurre con los datos de mi modelo -> a -> forma la transformación de datos?

+0

No sé la respuesta, pero lamentablemente tienen un problema similar. :( – fazy

Respuesta

3

Su tipo de formulario es la recopilación y su transformador devuelve una matriz. Necesitas refundirlo. Proveedores:

namespace App\Form\DataTransformer{ 
use Symfony\Component\Form\DataTransformerInterface; 
class MetadataTransformer implements DataTransformerInterface{ 

function transform($metadatas){ 
    foreach($metadatas as $key=>$value): 
    $result[]=array('name'=>$key,'value'=>$value); 
    endforeach; 
    $results=new \Doctrine\Common\Collections\ArrayCollection($result); 
    return $results; 
} 

function reverseTransform($metadatas){ 
    if(is_array($metadatas)){ 
    foreach($metadatas as $value){ 
     $result[$value['name']]=$value['value']; 
    } 
    return $result; 
    } 
    } 
} 
-1

Tenía que ha intentado esto:

function transform($metadatas) { 
    $results = array(); 
    foreach ($metadatas as $key => $value) { 
     $results['name'] = $key; 
     $results['value'] = $value; 
    } 
    return $results; 
} 
Cuestiones relacionadas