web-dev-qa-db-ja.com

Symfony2は埋め込みフォームのフィールドオプションを変更します

私の質問は基本的に、親フォームから埋め込み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メソッドは存在しません。

誰かがこれを行う方法を知っていますか?

ありがとう

19
lopsided

また、オプションを変更したかったのです。これは、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
40
Peter Wooster

@Peter Woosterに感謝します。 Symfony 3.0では、少し異なるものを使用する必要がありました。

次のようなフィールドを追加するカスタムフォームタイプがあります。

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('my_field', ChoiceType::class, [
        // Some options here...
        'multiple' => false,
    ]);
}

また、別のカスタムフォームタイプでは、extend上記のタイプを使用して、いくつかのオプションを変更する必要があります。

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);
}

上記の回答のおかげで、私が助けてくれることを願っています!

9
peamak

次のようなものを試してください。

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'))
        ;
    }
}
8
redbirdo

私はフォームビルダーコードにアクセスできないが、'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/doctrine-bundle:1.2.0、およびdoctrine/orm:2.3.6で正常に機能します。

3
Daishi

この種の変更では、多くの場合、ビューの変更がはるかに簡単です。

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

レンダリングのために最終的にテンプレートエンジンに渡されるもののほとんどは直線配列形式であるため、この時点でかなり多くのものをいじることができます。

0
Henry