フォームの1つでbuildForm
メソッドにオプションを渡そうとすると、次のエラーが発生します。
オプション "numOfHoles"は存在しません。定義されているオプションは次のとおりです: "action"、 "allow_extra_fields"、 "attr"、 "auto_initialize"、 "block_name"、 "by_reference"、 "cascade_validation"、 "compound 「、「制約」、「csrf_field_name」、「csrf_message」、「csrf_protection」、「csrf_provider」、「csrf_token_id」、「csrf_token_manager」、「data」、「data_class」、「disabled」、「empty_data」、「error_bubbling」、 「error_mapping」、「extra_fields_message」、「inherit_data」、「intention」、「invalid_message」、「invalid_message_parameters」、「label」、「label_attr」、「label_format」、「mapped」、「max_length」、「method」、「pattern "、" post_max_size_message "、" property_path "、" read_only "、" required "、" translation_domain "、" trim "、" validation_groups "、" virtual "。
私のコントローラーでは:
// hardcoded here for brevity in this example
$form = $this->createForm('crmpicco_course_row', $courseRow, array('numOfHoles' => 18));
crmpicco_course_row
フォームクラス:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', 'text')
->add('course', 'crmpicco_course', array('numOfHoles' => $options['numOfHoles']))
;
}
crmpicco_course
フォームクラス:
public function buildForm(FormBuilderInterface $builder, array $options)
{
for ($i = 0; $i < $options['numOfHoles']; $i++) {
$builder->add($i, 'text', array('required' => 'false'));
}
}
/**
* @return string name
*/
public function getName()
{
return 'crmpicco_course';
}
オプションnumOfHoles
がうまく機能しない理由を誰かが理解できますか?
あなたが発見したように、各フォームタイプにはオプションの定義済みリストがあります。新しいオプションを追加するには、少し調整が必要です。実際の方法はSymfonyの開発の過程で変更されたため、古くなった古いソリューションに出くわす可能性があります。
最新のソリューションについては、ここで説明します: http://symfony.com/blog/new-in-symfony-2-7-form-and-validator-updates#deprecated-setdefaultoptions -in-favor-of-configureoptions
だから基本的に追加
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Whatever',
'numOfHoles' => 0,
));
あなたのフォームタイプとあなたは行くのが良いはずです。
ビデオで、「発明」オプションにフォームタイプ拡張を作成する必要があることを確認しました。
https://symfonycasts.com/screencast/symfony-forms/form-type-extension#play
「新しいオプションを単に「発明」して渡すことはできないことがわかりました。各フィールドには有効なオプションの具体的なセットがあります。しかし、TextareaSizeExtensionでは、新しいオプションを発明できます。」
たとえば、行属性を追加する必要がある場合、拡張では次のようにします。
public function buildView(FormView $view, FormInterface $form, array $options)
{
$view->vars['attr']['rows'] = $options['rows'];
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'rows' => 10
]);
}
そして今、フィールドを追加するときにbuildFormメソッドで、この方法でオプションを渡すことができます:
->add('content', null, ['rows' => 15])
ビデオで話されたように、これは少なくともsymfony 4で動作するはずです。おそらく3.4でも動作します。
別のビデオ https://symfonycasts.com/screencast/symfony-forms/form-options-data を見て、Ceradが答えたのと同じことを見ていた。したがって、私が理解しているように、サードパーティのフォームタイプを拡張する場合にのみformExtentionが必要です。