从Symfony 2的AbstractType获取表单字段

3
我们在实现AbstractType中创建了一个表单。现在我们想要检索我们在builderForm中定义的字段。虽然我期望负责输出表单的Symfony部分也会这样做,但是我找不到任何关于如何做到这一点的文档。
class BlaType extends AbstractType {

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options) {


        $builder
                ->add('bla', 'checkbox', array('label' => 'bla', 'required' => true))
                ->add('submit', 'submit', array(
                    'label' => 'bla',
                    'attr' => array('class' => 'btn btn-primary')))
        ;
    }
}

一个类型为 0 => 'bla', 1 => 'submit' 的数组就足够了,还是您需要更详细的信息? - Artamiel
@artamiel 我正在寻找更多的数据。我也想知道它的类型。 - Roel Veldhuizen
我想出了一个解决方案,可以创建一个包含 'bla' => 'text', 'submit' => 'submit' 的数组,如果你感兴趣的话。 - Artamiel
@artamiel,那确实可以解决我的问题。 - Roel Veldhuizen
2个回答

4

好的,如我在评论中所述,我将向您展示一种生成带有 name => type 的数组的方法(我想可能有不止一种方法,但目前这种方法足以胜任)。

我创建了一个包含更多字段的简单表单,如下所示:

<?php

namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

class ArticleType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', 'text')
            ->add('description', 'textarea')
            ->add('isActive', 'checkbox')
            ->add('published', 'datetime')
            ->add('save', SubmitType::class)
        ;
    }
}

接下来在您的控制器中,重要的是一旦创建表单就获取Form实例,像这样 $builder = $this->createForm(new ArticleType());

从那里,您可以访问表单的子元素:

public function indexAction(Request $request)
{
    $builder = $this->createForm(new ArticleType());
    // $builder -> Symfony\Component\Form\Form
    // It's important to access the children array before the form is being normalized.
    // Otherwise you will gen an error as follows: FormBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance
    $fields = array();
    foreach($builder->all() as $name => $child) {
        // $child                           -> Symfony\Component\Form\Form
        // $child->getConfig()              -> Symfony\Component\Form\FormBuilder
        // $child->getConfig()->getType()   -> Symfony\Component\Form\Extension\DataCollector\Proxy\ResolvedTypeDataCollectorProxy
        $fields[ $name ] = $child->getConfig()->getType()->getName();
    }

    var_dump($fields);
}

倾倒刚刚创建的数组,您应该得到以下输出:
array (size=5)
  'title' => string 'text' (length=4)
  'description' => string 'textarea' (length=8)
  'isActive' => string 'checkbox' (length=8)
  'published' => string 'datetime' (length=8)
  'save' => string 'submit' (length=6)

这是我提供的信息,希望能对您有所帮助。


0
从表单中获取数据 $form->get('bla')->getData()

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