2012-09-19 18 views
5

Buduję aplikację silex (źródło: here)
W klasie App\Form\DataTransformer mam klasę MetadataTransformer.
Ale metoda transform nie działa (robi się transformacja odwrotna).
Stosuje się do App\Form\Metadata AbstractType, który jest częścią kolekcji w postaci App\Form\ArticleForm AbstractType.
Ostatnią formą nazywa się metodą edycji mojego App\Controller\Admin\ArticleAdminControllerMój transformator nie działa (od danych modelu do danych formularza)

transformatora danych ma mapować dane jak ten

{"key":"value"} 

w „danych Form”, takich jak:

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

Dzięki temu może być wyświetlany jako kolekcja.

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

Mój transformator dane powinny wyglądać następująco:

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

Działa funkcja reverseTransform, ale wydaje się, że sam transfom nie występuje.
Naszym celem jest, aby być w stanie wyświetlić dynamiczną kolekcję w postaci (dodawać i usuwać metadatas dynamicznie na mojej stronie artykuł Kształt)

W repo dodam, aby zmienić kod, aby to działało (czyli przekształcania datas w kontrolerze ArtykułAdminController, zamiast robić to w transformatorze)
Jeśli loguję wynik transformacji w czasie wykonywania, wynik jest tym, czego się spodziewam, ale formularz go nie użyje.

Próbowałem już api addViewTransformer/addModelTransformer 2.1, ale nie robiło to żadnej różnicy.

A jak źle z danymi modelu -> do -> przekształcić dane?

+0

ja nie znam odpowiedzi, ale niestety mają podobny problem. :( – fazy

Odpowiedz

3

Typ formularza to kolekcja, a transformator zwraca tablicę. Musisz go przekształcić. Spróbuj:

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

Gdybyś próbowała to:

function transform($metadatas) { 
    $results = array(); 
    foreach ($metadatas as $key => $value) { 
     $results['name'] = $key; 
     $results['value'] = $value; 
    } 
    return $results; 
} 
Powiązane problemy