如何向Symfony 2表单添加额外数据

9

我有一个名为Book的实体表单,我在视图中使用一种类型来显示这个表单。在这个类型中,我有一些字段映射到实体中的属性。

现在我想添加另一个字段,在表单创建期间为该字段提供一些初始数据,但它不在我的实体中。

我的类型如下所示:

// BookBundle\Type\Book
public function buildForm(FormBuilderInterface $builder, array $options = null)
{
    $builder->add('title');
    $builder->add('another_field', null, array(
        'mapped' => false
    ));
}

表单的创建如下所示:
$book = $repository->find(1);
$form = $this->createForm(new BookType(), $book);

在创建表单时,我该如何提供一些初始数据?或者说,我应该如何更改表单的创建方式,以在another_field字段中添加初始数据?


你打算如何处理未映射到实体的字段? - simshaun
我想从表单或请求中获取提交的数据并手动处理数据。 - Benjamin Paap
3个回答

31

我还有一个表单,其中的字段大部分与之前定义的实体匹配,但是其中一个表单字段的映射设置为false。

为了在控制器中解决这个问题,您可以轻松地像这样给它一些初始数据:

$product = new Product(); // or load with Doctrine/Propel
$initialData = "John Doe, this field is not actually mapped to Product";
$form = $this->createForm(new ProductType(), $product);
$form->get('nonMappedField')->setData($initialData);

就是这么简单。然后,在处理表单数据以准备保存它时,您可以使用以下代码访问未映射的数据:

$form->get('nonMappedField')->getData();

实用技巧:当您想填充的未映射字段本身是子表单时,您必须链接“get()”调用:$form->get('nonMappedSubForm')->get('subFormField')->setData(...) - Ninj
寻找如何从额外字段中检索数据。$form->get('nonMappedField')->getData(); 谢谢 - Pedro Casado

5

一个建议是在您的BookType上添加构造函数参数(或setter),包括“another_field”数据,并在添加参数时设置“data”参数:

class BookType 
{
    private $anotherFieldValue;

    public function __construct($anotherFieldValue)
    {
       $this->anotherFieldValue = $anotherFieldValue;
    }

    public function buildForm(FormBuilderInterface $builder, array $options = null)
    {
        $builder->add('another_field', 'hidden', array(
            'property_path' => false,
            'data' => $this->anotherFieldValue

        )); 
    }
}

然后构建:
$this->createForm(new BookType('blahblah'), $book);

谢谢你的回答。我找到了另一种优雅的方法来解决这个问题。一会儿会发布一个答案。 - Benjamin Paap

2
您可以像这样更改请求参数,以支持带有额外数据的表单:
$type = new BookType();

$data = $this->getRequest()->request->get($type->getName());
$data = array_merge($data, array(
    'additional_field' => 'value'
));

$this->getRequest()->request->set($type->getName(), $data);

这样,您的表单会在呈现时填充正确字段的值。如果您想提供多个字段,则可能是一个选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接