gpt4 book ai didi

symfony - 我的转换器不工作(从模型数据到表单数据)

转载 作者:行者123 更新时间:2023-12-04 21:20:41 25 4
gpt4 key购买 nike

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

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

{"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 中,我添加了更改代码以使其工作(即在 Controller ArticleAdminController 中转换数据,而不是在 Transformer 中进行)
如果我在运行时记录转换的结果,结果就是我所期望的,但表单不会使用它。

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

那么我的模型数据有什么问题 -> to -> form data transform ?

最佳答案

您的表单类型是集合,您的转换器返回一个数组。你需要重铸它。尝试:

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

关于symfony - 我的转换器不工作(从模型数据到表单数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12492775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com