web-dev-qa-db-ja.com

コントローラーから埋め込みSymfonyフォームにオプションを渡すときにオプションが存在しないというエラー

フォームの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がうまく機能しない理由を誰かが理解できますか?

17
crmpicco

あなたが発見したように、各フォームタイプにはオプションの定義済みリストがあります。新しいオプションを追加するには、少し調整が必要です。実際の方法は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,
    ));

あなたのフォームタイプとあなたは行くのが良いはずです。

27
Cerad

ビデオで、「発明」オプションにフォームタイプ拡張を作成する必要があることを確認しました。

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が必要です。

0
Darius.V