我的问题基本上是,是否可以从父表单更改嵌入式for字段的选项?
为了说明问题,请考虑这一点;我有一个父表单类型类,如下所示:
class FruitFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', 'text')
->add('apple', new AppleFormType())
;
}
和一个单独的包中的子表单类型类,我不想编辑,如下所示:
class AppleFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', 'text')
->add('qty', 'integer', array('label' => 'rubbish label')
;
}
我希望将qty
的标签更改为其他内容,但我只想在FruitForm
中执行此操作,而不是在使用AppleForm
的任何位置执行此操作。我曾希望能够做到这样的事情:
class FruitFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', 'text')
->add('apple', new AppleFormType(), array('qty' => array('label' => 'better label')))
;
}
或:
class FruitFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', 'text')
->add('apple', new AppleFormType())
;
$builder->get('apple')->get('qty')->setOption('label', 'better label');
}
但这些(以及其他一些尝试)都没有让我失望。我看不到setOption
方法。
有没有人知道这样做的方法?
由于
答案 0 :(得分:40)
我还想更改选项,即FOSUserBundle中现有字段的明显“更改标签”案例。我知道我可以在Twig或翻译中做到这一点。
@redbirdo指出了我正确的方向,“似乎添加一个具有相同名称的字段将取代它”。这是解决方案:
$field = $builder->get('username'); // get the field
$options = $field->getOptions(); // get the options
$type = $field->getType()->getName(); // get the name of the type
$options['label'] = "Login Name"; // change the label
$builder->add('username', $type, $options); // replace the field
答案 1 :(得分:8)
尝试这样的事情:
class AppleFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', 'text')
->add('qty', 'integer', array('label' => $options['qtyLabel'])
;
}
public function getDefaultOptions()
{
return array(
'qtyLabel' = 'rubbish label';
);
}
}
和
class FruitFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', 'text')
->add('apple', new AppleFormType(), array('qtyLabel' => 'better label'))
;
}
}
答案 2 :(得分:8)
非常感谢@Peter Wooster。 在Symfony 3.0中,我不得不使用一些不同的东西:
我有一个自定义表单类型添加如下字段:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('my_field', ChoiceType::class, [
// Some options here...
'multiple' => false,
]);
}
在另一个自定义表单类型中,我需要扩展上面的类型并更改一些选项:
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
$myField = $builder->get('my_field');
$fieldOptions = $myField->getOptions();
// Retrieve the FormType. That is the part that is different.
$fieldType = get_class($myField->getType()->getInnerType());
$fieldOptions['multiple'] = true;
// I can obviously put the name 'my_field' directly here
$builder->add($myField->getName(), $fieldType, $fieldOptions);
}
感谢上面的答案,我希望我的帮助!
答案 3 :(得分:3)
我遇到无法访问表单构建器代码但必须覆盖字段选项以添加'required' => true
的情况。
扩展@ peter-wooster和@thedamnedrhino回复github(https://github.com/symfony/symfony/issues/11188)上的symfony问题,我最终得到了这段代码。
$field = $form->get('combinaisons');
$options = $field->getConfig()->getOptions();
$type = $field->getConfig()->getType()->getName();
$options['required'] = true;
unset($options['em']);
$form->add('combinaisons', $type, $options);
这适用于symfony / symfony:2.3.21,doctrine / doctrine-bundle:1.2.0和doctrine / orm:2.3.6
答案 4 :(得分:0)
对于这种更改,修改视图通常要容易得多。
$view->vars['label'] = 'New label';
通常,您的视图将是父视图,因此它可能看起来像这样 - 从' Date'更改> '出版日期':
$view = $form->createView(...);
$view->children['date']->vars['label'] = 'Publication date';
如果表单是以自己的类型封装的,则可以使用finishView函数:
public function finishView(FormView $view, FormInterface $form, array $options)
{
$view->children['date']->vars['label'] = 'Publication date';
}
由于最终传递给模板引擎进行渲染的大多数都是直接数组形式,所以此时你可以搞砸很多东西。