php – Symfony2表单组件可变形式数据用于调查
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – Symfony2表单组件可变形式数据用于调查,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3043字,纯文字阅读大概需要5分钟。
内容图文
![php – Symfony2表单组件可变形式数据用于调查](/upload/InfoBanner/zyjiaocheng/794/7a9272aa250d40e3a5a03ae150c5a2ee.jpg)
我想创建一个由多个问题(不同的实现类)组成的调查.
我很乐意将Survey创建以及所有问题表示为FormType,以便从Symfony Form Component中轻松获得验证和所有好东西.
嵌套像described here这样的表格非常容易.
但现在是棘手的部分:
每个问题都有自己的FormType,应该在一个页面上创建和回答(由调查接受者填写).所以在一页上的所有问题.或多或少,这就像Google表单一样,能够快速地在一个页面上添加新问题,并使用户能够轻松地立即查看所有问题.
我的2个问题是:
>如何添加在运行时已知嵌套类型的FormType(管理员可以选择要添加的问题类型)?
>当调查接受者填写调查表时,如何在一个页面上验证和存储所有表格?
我很想听听你的一些想法.
谢谢,
卢卡斯
解决方法:
>使用听众的力量.您可以使用CollectionType与ResizeListener使用的几乎相同的流.
public function preSetData(FormEvent $event)
{
$form = $event->getForm();
$data = $event->getData();
...
foreach ($data as $name => $value) {
$form->add($name, $this->getTypeByClass($value), array_replace(array(
'property_path' => '['.$name.']',
), $this->options));
}
}
...
public function preSubmit(FormEvent $event)
{
$form = $event->getForm();
$data = $event->getData();
...
if ($this->allowAdd) {
foreach ($data as $name => $value) {
if (!$form->has($name)) {
// put special value into sub-form to indicate type of the question
$type = $value['type'];
unset($value['type']);
$form->add($name, $type, array_replace(array(
'property_path' => '['.$name.']',
), $this->options));
}
}
}
}
尝试使用allowDelete,allowAdd功能实现非常相似的流程.
>还应该有另一个类,例如SurveyData.{items,survey,…},与Survey,SurveyItem.{answer,…}有n-1关系,与QuestionAnswer有n-1关联.在您的结构的基础上应该有书面验证器.
可以使用Valid约束触发级联验证.
http://symfony.com/doc/current/reference/constraints/Valid.html
UPDATE
>如何形成可变部分.
public function buildForm(FormBuilderInterface $builder, array $options)
{
if ($options['allow_add'] && $options['prototyped']) {
// @var ['prototype_name' => '__name__', 'type' => 'question_type']
foreach ($options['prototypes'] as $prototype) {
$prototype = $builder->create($prototype['prototype_name'], $options['type'], $options['options']);
$prototype->add('type', 'hidden', ['data' => $options['type'], 'mapped' => false]);
$prototypes[$options['type']] = $prototype->getForm();
}
$builder->setAttribute('prototypes', $prototypes);
}
...
}
public function buildView(FormView $view, FormInterface $form, array $options)
{
$view->vars = array_replace($view->vars, array(
'allow_add' => $options['allow_add'],
'allow_delete' => $options['allow_delete'],
));
if ($form->getConfig()->hasAttribute('prototypes')) {
$view->vars['prototypes'] = $form->getConfig()->getAttribute('prototypes')->createView($view);
}
}
现在可以在树枝中使用表单块中的原型.
{% for key, prototype in prototypes %}
{% set data_prototypes[key] = form_row(prototype) %}
{% endfor %}
{% set attr = attr|merge({'data-prototypes' : data_prototypes|json_encode })
现在你不需要JS中的ajax请求 – 只需使用原型.
(var collection = $('your_collection')).append(collection.data('prototypes')[question_type].replace(/__name__/g, counter+1));
您已将元素添加到集合中,现在管理员可以填充它并提交表单.其余的工作(将数据映射到类)将由Symfony完成.
内容总结
以上是互联网集市为您收集整理的php – Symfony2表单组件可变形式数据用于调查全部内容,希望文章能够帮你解决php – Symfony2表单组件可变形式数据用于调查所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。