21

我的问题基本上是,是否可以从父表单更改嵌入字段的选项?

为了说明问题,请考虑这一点;我有一个像这样的父表单类型类:

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我可以看到的方法。

有谁知道这样做的方法?

谢谢

4

5 回答 5

43

我还想更改选项,即 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
于 2013-02-05T02:32:28.910 回答
12

非常感谢@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);
}

感谢楼上的回答,希望对我有帮助!

于 2016-05-09T09:49:55.230 回答
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'))
        ;
    }
}
于 2012-07-23T17:09:35.810 回答
4

我处于无法访问表单构建器代码但必须覆盖字段选项以添加'required' => true.

扩展 @peter-wooster 和 @thedamnedrhino 对 github 上的 symfony 问题的回复(https://github.com/symfony/symfony/issues/11188),我最终得到了这段代码。

$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-bundle:1.2.0 和教义/orm:2.3.6

于 2015-07-27T20:02:42.380 回答
1

对于这种更改,修改视图通常要容易得多。

$view->vars['label'] = 'New label';

通常,您的视图将是父表单,因此它可能如下所示 - 从“日期”>“发布日期”更改:

$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';
}

由于最终传递给模板引擎进行渲染的大部分内容都是直接数组形式,因此此时您可能会弄乱很多东西。

于 2015-11-09T23:11:23.990 回答