我的变压器不起作用(从模型数据到表格数据)

时间:2012-09-19 10:20:56

标签: symfony symfony-forms silex

我正在构建一个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本身似乎没有。
这里的目标是能够在表单中显示动态集合(在我的文章表单页面中动态添加和删除元数据)

在repo中,我添加了更改代码以使其工作(即转换控制器ArticleAdminController中的数据,而不是在Transformer中执行此操作)
如果我在运行时记录转换的结果,结果就是我所期望的,但表单不会使用它。

我已经尝试过addViewTransformer / addModelTransformer 2.1 api,但它没有任何区别。

那么我的模型数据怎么出错 - >到 - >表格数据转换?

2 个答案:

答案 0 :(得分: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 :(得分:-1)

你试过这个:

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