6

我正在构建一个 silex 应用程序(源代码在这里
App\Form\DataTransformer我有一个 MetadataTransformer 类。
但是该transform方法不起作用(反向变换起作用)。
它应用于一个App\Form\Metadata AbstractType,它是一个集合的一部分App\Form\ArticleForm AbstractType
最后一个表单在我的编辑方法中调用App\Controller\Admin\ArticleAdminController

数据转换器应该像这样映射数据

{"key":"value"}

进入“表单数据”,如:

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

所以它可以显示为一个集合。

元数据.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";
    }
}

我的数据转换器应如下所示:

元数据转换器.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 有效,但变换本身似乎没有。
这里的目标是能够在表单中显示动态集合(在我的文章表单页面中动态添加和删除元数据)

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

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

那么我的模型数据有什么问题 -> 到 -> 表单数据转换?

4

2 回答 2

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;
    }
  }
}
于 2013-02-21T23:41:27.000 回答
-1

你试过这个:

function transform($metadatas) {
    $results = array();
    foreach ($metadatas as $key => $value) {
        $results['name'] = $key;
        $results['value'] = $value;
    }
    return $results;
}
于 2013-09-14T14:03:58.773 回答