从控制器到嵌入式Symfony表单传递选项时,选项不存在错误

时间:2015-10-26 10:49:59

标签: php forms symfony symfony-forms php-5.6

尝试在我的某个表单中向我的buildForm方法传递选项时出现以下错误。

  

选项“numOfHoles”不存在。定义的选项包括:“action”,“allow_extra_fields”,“attr”,“auto_initialize”,“block_name”,“by_reference”,“cascade_validation” ,“compound”,“constraints”,“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“,”intent“,”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没有通过?

3 个答案:

答案 0 :(得分:22)

正如您所发现的,每种表单类型都有一个预定义的选项列表。添加新选项需要稍作调整。实际方法在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,
    ));

对于您的表单类型,您应该很高兴。

答案 1 :(得分: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,并看到了与塞拉德回答的一样。因此,据我所知,仅当我们要扩展第三方表单类型时,才需要formExtention。

答案 2 :(得分:-1)

尝试这样做:

getWindow().getDecorView().setSystemUiVisibility(
    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

getWindow().setStatusBarColor(Color.TRANSPARENT);

然后:

$numOfHoles = array('numOfHoles' => $options['numOfHoles']));

然后你需要在buildForm之前调用它:

$oForm = $this->createForm(new CompanyForm($numOfHoles));