【问题标题】:Symfony set the values for form that already created as a formtypeSymfony 为已经创建为表单类型的表单设置值
【发布时间】:2017-10-02 20:51:48
【问题描述】:

我创建了一个类似下面的表单类型

/**
 * Class CreatePosFormType.
 */
class CreatePosFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', TextType::class, [
            'required' => true,
            'constraints' => [new NotBlank()],
        ]);
        $builder->add('identifier', TextType::class, [
            'required' => true,
            'constraints' => [new NotBlank()],
        ]);
        $builder->add('description', TextType::class, [
            'required' => false,
        ]);
        $location = $builder->create('location', LocationFormType::class, [
            'constraints' => [new NotBlank(), new Valid()],
        ]);
        $location->addModelTransformer(new LocationDataTransformer());
        $builder->add($location);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Pos::class,
        ]);
    }
}

在我的控制器中,我获得了表单并将请求发送到如下表单:

$form = $this->get('form.factory')->createNamed('pos', CreatePosFormType::class);
$form->handleRequest($request);

但我不需要将请求发送到表单,而是从请求中获取数据并单独设置我尝试过的值,如下所示:

$form->get('name')->setData('john');

但它没有设置表单字段值。

如果我将值设置为按上述方式形成,则会发生以下错误

{ “形式”: { “孩子们”: { “姓名”: {}, “标识符”:{}, “描述”: {}, “地点”: {}, } }, “错误”:[] }

【问题讨论】:

标签: php forms symfony


【解决方案1】:

您可以将映射的类发送到表单本身。像这样:

public function createPost(Request $request)
{
    $pos = new Pos();
    $pos->setName('John');
    $form = $this->get('form.factory')->createNamed('pos', CreatePosFormType::class, $pos);

}

您也可以通过选项发送数据。像这样:

public function createPost(Request $request)
{
    $form = $this->get('form.factory')->createNamed('pos', CreatePosFormType::class, null, ['yourVariable' => $yourVariable]);

}

在表单类中,您可以在选项中捕捉到这一点。

 class CreatePosFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $yourVariable = $options['yourVariable'];
         //do stuff with your variable
     }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Pos::class,
            'yourVariable' => null,
        ]);
    }

【讨论】:

  • 但是我的 Pos 类在表单中没有一些变量。它使用事件将其存储在数据库中
  • 编辑了我的答案以包含另一个选项。
  • "{ "form": { "children": { "firstName": {}, "lastName": {}, "active": {}, "email": {}, "phone ": {}, "plainPassword": {} } }, "errors": [] }" 我收到以下消息如何深入调试
  • 那是一种不同于原来的形式。这包括不是原始形式的“名字”等。这是一个不同的错误,可能是因为您的实体已链接到表单。 'data_class' => Pos::class 总是将表单映射到实体。
  • 这正是您所需要的。
猜你喜欢
  • 2018-03-28
  • 2014-09-23
  • 2013-11-03
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多