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のみこれを行いたいです。私は次のようなことができることを望んでいました:FruitFormAppleForm

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 に答える