2012-09-19 9 views
5

Sto costruendo un'applicazione selce (la fonte è here)
Nel App\Form\DataTransformer ho una classe MetadataTransformer.
Ma il metodo transform non funziona (la trasformazione inversa lo fa).
Si applica a un App\Form\Metadata AbstractType, che fa parte di una raccolta in un App\Form\ArticleForm AbstractType.
L'ultima forma è chiamato nel metodo di modifica della mia App\Controller\Admin\ArticleAdminControllermio trasformatore non funziona (da dati del modello per formare i dati)

Il trasformatore di dati si suppone per mappare un dato come questo

{"key":"value"} 

in un "dati del modulo" come:

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

Quindi può essere visualizzato come una raccolta.

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"; 
    } 
} 

mio trasformatore di dati dovrebbe essere simile:

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; 
     } 
    } 
} 

Il reverseTransform funziona, ma il transfom in sé non sembra.
L'obiettivo qui è quello di essere in grado di visualizzare una collezione dinamica in una forma (aggiungere e rimuovere metadatas dinamicamente nella mia pagina forma di articolo)

Nel repo aggiungo per modificare il codice per farlo funzionare (ad esempio trasformando il dati nel ArticleAdminController di controllo, invece di farlo nel trasformatore)
Se entro il risultato della trasformazione in fase di esecuzione, il risultato è quello che mi aspettavo, ma la forma non lo uso.

ho provato già l'addViewTransformer/addModelTransformer 2.1 api, ma non ha fatto alcuna differenza.

Così come ciò che è sbagliato con il mio modello di dati -> a -> dati del modulo trasformano?

+0

non so la risposta, ma io, purtroppo, un problema simile. :( – fazy

risposta

3

Il tipo di forma è la raccolta e la vostra trasformatore restituisce un array. Hai bisogno di rifarlo. Prova:

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

Aveva provato questo:

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