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