2012-09-19 21 views
5

我正在構建一個silex應用程序(來源是here
App\Form\DataTransformer我有一個MetadataTransformer類。
transform方法不起作用(逆向變換)。
它適用於App\Form\Metadata AbstractType,它是App\Form\ArticleForm AbstractType中的一個集合的一部分。
最後形式被稱爲在我App\Controller\Admin\ArticleAdminController我的變壓器不工作(從模型數據形成數據)

數據變換器的編輯方法應該映射這樣

{"key":"value"} 

數據變成「表單數據」,如:

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

所以它可以顯示爲一個集合。

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

我的數據轉換應該是這樣的:

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

reverseTransform的作品,但transfom本身似乎並不。
這裏的目標是能夠在表單中顯示動態集合(加在我的文章表單頁面動態刪除metadatas)

在回購我添加修改代碼,使其工作(即改造數據在控制器ArticleAdminController中,而不是在Transformer中執行)
如果我在運行時記錄變換的結果,結果是我所期望的,但表單不會使用它。

我試了一下addViewTransformer/addModelTransformer 2.1 api,但沒有任何區別。

那麼,我的模型數據 - >到 - >表單數據轉換怎麼樣?

+0

我不知道答案,但我不幸有類似的問題。 :( – fazy

回答

3

你的表單類型是集合,你的變換器返回一個數組。你需要重鑄它。嘗試:

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

假如你嘗試過這樣的:

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