Javascript Symfony2-验证失败时重建动态表单

Javascript Symfony2-验证失败时重建动态表单,javascript,forms,symfony,twig,Javascript,Forms,Symfony,Twig,符号狂人!:) 我有一个非常复杂的表单,由嵌入在其他表单上的表单组成,嵌入在其他表单上,等等,4层。使用原型和一点javaScript(与示例不同)一切都很好,但我有一个大问题: 当我提交表单时,验证失败,它会重新加载页面,并且只呈现第一层(外层)表单。 是否有一种简单(或任何其他)的方法可以在提交之前将所有内容重新构建到状态?一些方向将非常感谢 谢谢你的关注 ---更新: 代码的相关部分 形式类型:课堂和活动。教室里有各种活动 教室管理员 class ClassroomControll

符号狂人!:)

我有一个非常复杂的表单,由嵌入在其他表单上的表单组成,嵌入在其他表单上,等等,4层。使用原型和一点javaScript(与示例不同)一切都很好,但我有一个大问题:

当我提交表单时,验证失败,它会重新加载页面,并且只呈现第一层(外层)表单。 是否有一种简单(或任何其他)的方法可以在提交之前将所有内容重新构建到状态?一些方向将非常感谢

谢谢你的关注

---更新:

代码的相关部分 形式类型:课堂活动。教室里有各种活动

教室管理员

    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当然可以。刚刚做了:)