我有一个使用Symfony的一些组件的项目。即Twig,Doctrine和Form。
我想修改所有表单字段类型,以便在创建时可以使用新的“后缀”参数。看起来这在完整的Symfony堆栈中通常很简单,可以通过扩展现有的表单类型来完成。但是,在使用独立的表单组件时,我不确定如何让表单组件加载我的自定义扩展。
任何帮助都会很棒,谢谢!
答案 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
变量现在知道我的新“后缀”属性。