PHP +SIlex+Mysql根据查询决定使用的表单类型


PHP +SIlex+Mysql deciding on the type of used form by query

我有这个小问题(我是一个初学者编码,不是英语母语的人,所以请原谅我的愚蠢),我谦卑地请求你的帮助。我正在编写一个测量系统。根据调查问卷创建者选择的问题类型(封闭式或开放式),我希望此表单显示选择项或文本区域。我真的不知道如何做这样的事情,如果"如果"的形式是可能的。(请不要把我送到文档页面,那里很黑暗,到处都是尸体)。大致代码如下:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
            ->add(
                'answers',
                'choice', 
                array(
                    'choices'  => $this->xxx($this->app),
                    'expanded' => false
                )
            )
            ->add(
                'answers',
                'textarea',
         if (question.type == 'closed'){
         }else{
         }
    }

不阅读文档是不可能做到这一点的。这是一个相当高级的主题,涉及Symfony FormBuilderInterface的几个不同方面,可能需要服务器端php和客户端javascript

您正在做的事情似乎与在提交表单的动态生成中解释的类似。这种方法使用事件监听器表单修饰符函数。

例如,您可以根据POstrongET_DATA事件修改表单,根据其他字段的数据添加额外的字段。

下面是一个框架buildForm方法,它显示了所有可用的事件监听器:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $options = array('open','closed');
    $choices = array('choice a','choice b','choice c');
    $builder
        ->add('answer_option', 'choice', 
            array(
                'choices'  => $options,
                'expanded' => true 
            )
        )
        ->add('answer_choices', 'choice', 
            array(
                'choices'  => $choices,
                'expanded' => false
            )
        )
        ->add('answer_textarea', 'textarea')
        ->add('submit', 'submit')
    ;
    $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
        error_log(print_r('PRE_SET_DATA',1).' '.__FILE__.' '.__LINE__.PHP_EOL,0);
        $data = $event->getData();
        $form = $event->getForm();
    });
    $builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) {
        error_log(print_r('POST_SET_DATA',1).' '.__FILE__.' '.__LINE__.PHP_EOL,0);
        $data = $event->getData();
        $form = $event->getForm();
    });
    $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
        error_log(print_r('PRE_SUBMIT',1).' '.__FILE__.' '.__LINE__.PHP_EOL,0);
        $data = $event->getData();
        $form = $event->getForm();
    });
    $builder->addEventListener(FormEvents::SUBMIT, function (FormEvent $event) {
        error_log(print_r('SUBMIT',1).' '.__FILE__.' '.__LINE__.PHP_EOL,0);
        $data = $event->getData();
        $form = $event->getForm();
    });
    $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
        error_log(print_r('POST_SUBMIT',1).' '.__FILE__.' '.__LINE__.PHP_EOL,0);
        $data = $event->getData();
        $form = $event->getForm();
    });
}