2012-07-23 7 views
17

私の質問は基本的には、埋め込みのフィールドのオプションを親フォームから変更することは可能ですか?埋め込みフォームのsymfony2変更フィールドのオプション

問題を説明するには、これを考慮してください。このように、

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のラベルを別のものに変更するには、AppleFormが使用されているすべての場所ではなく、FruitFormでのみこれを実行します。すべての私を失敗している

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

が、これらの(および他の試行回数)のいずれ:

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

か:私のような何かを行うことができることを望んでいました。私が見ることができるsetOptionメソッドが存在しません。

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

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

答えて

35

私もオプションを変更したい、既存のフィールドのための明白な "ラベルを変更" ケースから

おかげ

+7

$オプションs = $フィールド - > getOptions();しかし、私にとってはうまくいきませんでしたが、$ field-> getConfig() - > getOptions()はトリックでした!再度、感謝します ! – Steven

+0

私のために働かない –

+0

私のためにうまく働いた。 @Stevenでは、 '$ form-> get(" field ") - > getOptions()'を使う必要があります。そうでない場合、その名前のフィールドはまだ存在しません。 – Adambean

8

はこのような何かを試してみてくださいFOSUserBundle私はTwigや翻訳でこれを行うことができることを知っています。

@redbirdoは、 "同じ名前のフィールドを追加すると置き換えられるように見えます"と、正しい方向に私を指摘しました。私は、フォームビルダコードにアクセスするが、'required' => trueを追加するためのフィールドオプションをオーバーライドすることはできません場合には午前

$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 
+0

答えてくれてありがとう、私はこれがオプションだと知っていますが、AppleFormTypeがベンダーバンドルに入っているので、これを動作させるためにはオーバーライドまたは置き換えなければならないでしょう。私は 'FruitFormType'クラスで完全に解決できるソリューションを期待していました。 – lopsided

+1

申し訳ありませんが、私はあなたがそれを編集したくないと思っていましたが、あなたがそれを上書きすることで大丈夫と思っていました。 $ builder-> get( 'apple') - > add( 'qty'、 'integer'、array( 'label' => 'より良いラベル')をオプションにしますか?FormBuilderの(2.0)ドキュメントを読むことから同じ名前のフィールドを追加するとそれが置き換えられますが、明らかにラベルだけでなくすべてのオプションを再定義する必要があります。 – redbirdo

+0

EDITED - FormBuilderInterfaceのAPIが見つかりました。get/setAttributeあなたは$ builder-> get( 'apple') - > get( 'qty') - > setAttribute( 'label'、 'better label');を使ってみましたか? – redbirdo

3

:ここソリューションです。

@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、教義/教義バンドル:1.2.0および教義/ ORM:ビューを変更2.3.6

0

は、多くの場合、このために多くの方が簡単です変更の種類。

$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

8

@Peter Woosterに感謝します。

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

そして、私はに必要な別のカスタムフォームタイプで

タイプを拡張:私はそうのようにフィールドを追加するカスタムフォームタイプを持っている

: のSymfony 3.0では、私は少し違うものを使用していましたいくつかのオプションを変更してください:

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

上記のおかげで、私は私の助けになるはずです。

関連する問題