6

私は silex アプリケーションを構築しています (ソースはこちら)
App\Form\DataTransformerは、MetadataTransformer クラスがあります。
しかし、このtransform方法は機能しません (逆変換は機能します)。のコレクションの一部である に
適用されます。 最後のフォームは私の編集メソッドで呼び出されますApp\Form\Metadata AbstractTypeApp\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";
    }
}

私のデータトランスフォーマーは次のようになります:

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 自体は機能しないようです。
ここでの目標は、動的コレクションをフォームに表示できるようにすることです (記事のフォーム ページでメタデータを動的に追加および削除します)。


実行時に変換の結果をログに記録すると、結果は期待どおりになりますが、フォームはそれを使用しません。

私はすでに addViewTransformer / addModelTransformer 2.1 api を試しましたが、違いはありませんでした。

では、私のモデル data -> to -> form data transform の何が問題なのですか?

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 に答える