私の質問は基本的に、親フォームから埋め込み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
メソッドは存在しません。
誰かがこれを行う方法を知っていますか?
ありがとう
また、オプションを変更したかったのです。これは、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
@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);
}
上記の回答のおかげで、私が助けてくれることを願っています!
次のようなものを試してください。
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'))
;
}
}
私はフォームビルダーコードにアクセスできないが、'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で正常に機能します。
この種の変更では、多くの場合、ビューの変更がはるかに簡単です。
$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';
}
レンダリングのために最終的にテンプレートエンジンに渡されるもののほとんどは直線配列形式であるため、この時点でかなり多くのものをいじることができます。