Javascript Symfony2-验证失败时重建动态表单
符号狂人!:) 我有一个非常复杂的表单,由嵌入在其他表单上的表单组成,嵌入在其他表单上,等等,4层。使用原型和一点javaScript(与示例不同)一切都很好,但我有一个大问题: 当我提交表单时,验证失败,它会重新加载页面,并且只呈现第一层(外层)表单。 是否有一种简单(或任何其他)的方法可以在提交之前将所有内容重新构建到状态?一些方向将非常感谢 谢谢你的关注 ---更新: 代码的相关部分 形式类型:课堂和活动。教室里有各种活动 教室管理员Javascript Symfony2-验证失败时重建动态表单,javascript,forms,symfony,twig,Javascript,Forms,Symfony,Twig,符号狂人!:) 我有一个非常复杂的表单,由嵌入在其他表单上的表单组成,嵌入在其他表单上,等等,4层。使用原型和一点javaScript(与示例不同)一切都很好,但我有一个大问题: 当我提交表单时,验证失败,它会重新加载页面,并且只呈现第一层(外层)表单。 是否有一种简单(或任何其他)的方法可以在提交之前将所有内容重新构建到状态?一些方向将非常感谢 谢谢你的关注 ---更新: 代码的相关部分 形式类型:课堂和活动。教室里有各种活动 教室管理员 class ClassroomControll
class ClassroomController extends Controller
{
public function createAction(Request $request)
{
//initialization and authoritation stuff
$newClassroom = new Classroom();
$form = $this->createForm(new ClassroomType($choices), $newClassroom);
$form->handleRequest($request);
if ($form->isSubmitted()) {
$ClassroomData = $form->getData();
$validator = $this->get('validator');
$errorsClassroom = $validator->validate($ClassroomData);
if (count($errorsClassroom) == 0) {
//stuff for Doctrine persistence
} else {
\Doctrine\Common\Util\Debug::dump("Not Valid");
}
} else {
\Doctrine\Common\Util\Debug::dump("Not Submitted");
}
$formview = $form->createView();
return $this->render("ClassroomBundle:Default:createClassroomIndex.html.twig", array(
'platforms' => $platforms,
'classroomForm' => $formview,
'errors' => $form->getErrors()));
}
createClassroomIndex.html.twig
{% extends '::base.html.twig' %}
{% block body %}
{% form_theme classroomForm 'ClassroomBundle:Form:createClassroomBaseForm.html.twig' %}
<div id="looper-background" class="col-md-12">
<div class="looper-outer-container col-sm-10 col-md-offset-1">
{{ form(classroomForm) }}
</div>
</div>
//navigation stuff
{% endblock body %}
{% block javascripts %}
function addActivityForm(collectionHolder, newLinkLi) {
// Get the data-prototype explained earlier
var thumbPrototype = getThumbnailPrototype(collectionHolder.data('index'));
var formPrototype = $(".activity-prototype-holder").data("prototype");
// get the new index
var index = collectionHolder.data('index');
// Replace '__activity_prototype_placeholder__' in the prototype's HTML to
// instead be a number based on how many items we have
var newThumb = thumbPrototype.replace(/__activity_prototype_placeholder__/g, index);
var newForm = formPrototype.replace(/__activity_prototype_placeholder__/g, index);
var newLooper = newForm;
// increase the index with one for the next item
collectionHolder.data('index', index + 1);
// Display the form in the page in an li, before the "Add a tag" link li
var newThumbObject = $(newThumb);
newLinkLi.before(newThumbObject);
addThumbDeleteButton(newThumbObject);
// Add new "loop" (page) to looper
var loopContainer = jQuery("#classroomLooper").find(".looper-inner");
loopContainer.append(newLooper);
// show new loop
var numItems = loopContainer.find(".item").length;
looperGoTo(numItems);
//Order thumbnails
animateThumbnailPosition(collectionHolder);
}
{% endblock javascripts %}
{% block form -%}
{{ form_start(form, {attr: {novalidate: 'novalidate'}}) }}
{{- block('form_nav') -}}
{{- block('form_looper') -}}
{{- block('activity_prototype') -}}
{{ block('save_btn') }}
{{ form_end(form) }}
<span class="help-block pad15 bg-danger educaErrorBox">
{{ form_errors(form) }}
</span>
{{ tinymce_init() }}
{{ block('javascripts') }}
{%- endblock form %}
{% block activity_prototype %}
{% import "ClassroomBundle:Form:createActivityFormMacro.html.twig" as activityForms %}
{% do form.activities.setRendered %}
<ul id="activities_hidden_field" display="none" class="activities activity-prototype-holder"
data-prototype="{{ activityForms.formularioLooper(form.activities.vars.prototype, false) |e }}"></ul>
{% endblock activity_prototype %}
{%extends'::base.html.twig%}
{%block body%}
{%form\u主题classroomForm'ClassroomBundle:form:createClassroomBaseForm.html.twig%}
{{form(classroomForm)}
//导航材料
{%endblock body%}
{%block javascripts%}
函数addActivityForm(collectionHolder,newLinkLi){
//获取前面解释的数据原型
var thumbPrototype=getThumbnailPrototype(collectionHolder.data('index'));
var formPrototype=$(“.activity prototype holder”).data(“prototype”);
//获取新索引
var指数=collectionHolder.data('index');
//将原型HTML中的“\u活动\u原型\u占位符”替换为
//取而代之的是一个基于我们拥有多少物品的数字
var newThumb=thumbPrototype.replace(/\uuuuu活动\uu原型\u占位符\uuuuu/g,索引);
var newForm=formPrototype.replace(/\u活动\u原型\u占位符\u\u/g,索引);
var newLooper=newForm;
//为下一项增加索引1
收集持有者数据('索引',索引+1);
//在“添加标签”链接li之前,在页面中的一个li中显示表单
var newThumbObject=$(newThumb);
newLinkLi.before(newthumbject);
addThumbDeleteButton(新建对象);
//向活套添加新的“循环”(第页)
var loopContainer=jQuery(“#classroomLooper”).find(“.looper-inner”);
loopContainer.append(newLooper);
//显示新循环
var numItems=loopContainer.find(“.item”).length;
罗珀戈托(努米特姆斯);
//订购缩略图
animateThumbnailPosition(collectionHolder);
}
{%endblock javascripts%}
createClassroomBaseForm.html.twig
{% extends '::base.html.twig' %}
{% block body %}
{% form_theme classroomForm 'ClassroomBundle:Form:createClassroomBaseForm.html.twig' %}
<div id="looper-background" class="col-md-12">
<div class="looper-outer-container col-sm-10 col-md-offset-1">
{{ form(classroomForm) }}
</div>
</div>
//navigation stuff
{% endblock body %}
{% block javascripts %}
function addActivityForm(collectionHolder, newLinkLi) {
// Get the data-prototype explained earlier
var thumbPrototype = getThumbnailPrototype(collectionHolder.data('index'));
var formPrototype = $(".activity-prototype-holder").data("prototype");
// get the new index
var index = collectionHolder.data('index');
// Replace '__activity_prototype_placeholder__' in the prototype's HTML to
// instead be a number based on how many items we have
var newThumb = thumbPrototype.replace(/__activity_prototype_placeholder__/g, index);
var newForm = formPrototype.replace(/__activity_prototype_placeholder__/g, index);
var newLooper = newForm;
// increase the index with one for the next item
collectionHolder.data('index', index + 1);
// Display the form in the page in an li, before the "Add a tag" link li
var newThumbObject = $(newThumb);
newLinkLi.before(newThumbObject);
addThumbDeleteButton(newThumbObject);
// Add new "loop" (page) to looper
var loopContainer = jQuery("#classroomLooper").find(".looper-inner");
loopContainer.append(newLooper);
// show new loop
var numItems = loopContainer.find(".item").length;
looperGoTo(numItems);
//Order thumbnails
animateThumbnailPosition(collectionHolder);
}
{% endblock javascripts %}
{% block form -%}
{{ form_start(form, {attr: {novalidate: 'novalidate'}}) }}
{{- block('form_nav') -}}
{{- block('form_looper') -}}
{{- block('activity_prototype') -}}
{{ block('save_btn') }}
{{ form_end(form) }}
<span class="help-block pad15 bg-danger educaErrorBox">
{{ form_errors(form) }}
</span>
{{ tinymce_init() }}
{{ block('javascripts') }}
{%- endblock form %}
{% block activity_prototype %}
{% import "ClassroomBundle:Form:createActivityFormMacro.html.twig" as activityForms %}
{% do form.activities.setRendered %}
<ul id="activities_hidden_field" display="none" class="activities activity-prototype-holder"
data-prototype="{{ activityForms.formularioLooper(form.activities.vars.prototype, false) |e }}"></ul>
{% endblock activity_prototype %}
{%block form-%}
{{form_start(form,{attr:{novalidate:'novalidate'}}}}
{{-block('form_nav')-}
{{-block('form_looper')-}
{{-block('activity_prototype')-}
{{block('save_btn')}
{{form_end(form)}}
{{form_errors(form)}}
{{tinymce_init()}}
{{block('javascripts')}
{%-endblock form%}
{%block activity_prototype%}
{%import“ClassroomBundle:Form:createActivityFormMacro.html.twig”作为activityForms%}
{%do form.activities.setRendered%}
{%endblock活动\u prototype%}
如果我在代码中遗漏了什么,请告诉我,我不想粘贴太多不相关的代码。:) 添加实体的代码(formType&controller;)在服务器端,您需要使用来维护用户应用的选择,但这肯定不是一件简单的事情(特别是在没有看到您的代码的情况下)。感谢您的建议,我更新了我的问题,添加了一些代码,如下所示requested@DanielParejoMu尼奥斯:你能把
createClassroomIndex.html.twig
的代码也包括进来吗?@Veve当然可以。刚刚做了:)