Symfony表单组件独立表单类型扩展

时间:2015-04-08 20:31:25

标签: forms symfony

我有一个使用Symfony的一些组件的项目。即Twig,Doctrine和Form。

我想修改所有表单字段类型,以便在创建时可以使用新的“后缀”参数。看起来这在完整的Symfony堆栈中通常很简单,可以通过扩展现有的表单类型来完成。但是,在使用独立的表单组件时,我不确定如何让表单组件加载我的自定义扩展。

任何帮助都会很棒,谢谢!

2 个答案:

答案 0 :(得分:2)

好的,如果我正确地理解了您的问题,那么您基本上想要做的就是为表单构建器添加新选项以供给定类型。

index.php - 基本上,我们将创建一个FormBuilder实例并添加一个字段用于测试目的。

<?php

use Symfony\Component\Form\Forms;
use Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension;


$formFactory = Forms::createFormFactoryBuilder()
    ->getFormFactory()
    ->createBuilder()
    ->add('test', 'text', array('customAttribute' => true))
    ->getForm()
    ->createView();

如果我们现在打开浏览器,我们会收到很好的错误,告诉我们“customAttribute”是未知选项。

所以,让我们创建自定义表单类型!如您所见,我将其命名为 TextCustomType ,因为我将扩展“text”表单类型。

Type类:

<?php

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;

class TextCustomType extends AbstractTypeExtension {

public function getName() {
    return "text";
}

public function getExtendedType() {
    return "text";
}

public function setDefaultOptions(OptionsResolverInterface $resolver) {
    $resolver->setOptional( array('customAttribute') );

    $resolver->setDefaults( array('customAttribute' => true) );
}

public function buildView(FormView $view, FormInterface $form, array $options) {
    $view->vars['customAttribute'] = $options['customAttribute'];
}

}

现在,我们创建了自定义类型,因此我们将其添加到表单工厂:

$formFactory = Forms::createFormFactoryBuilder()
    ->addTypeExtension( new TextCustomType() ) // once the class is loaded simply pass fresh instance to ->addTypeExtension() method.
    ->getFormFactory()
    ->createBuilder()
    ->add('test', 'text', array('customAttribute' => true))
    ->getForm()
    ->createView();

刷新浏览器,你应该好好去!希望你明白了。

根据OP的建议更新。

答案 1 :(得分:1)

答案很简单!这只是寻找合适的地方的问题。 FormFactoryBuilder是关键:

use Symfony\Form\Component\Form\Forms;

$form = Forms::createFormFactoryBuilder()
    ->addTypeExtension(new MyExtension())
    ->getFormFactory()
    ->create();

$form变量现在知道我的新“后缀”属性。