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

时间:2015-04-14 12:19:53

标签: javascript forms symfony twig

Symfomaniacs! :)

我有一个非常复杂的形式,由嵌入在其他表格中的表格形成,嵌入在其他表格上,等等4层深。这一切都很好使用原型和一些javaScript(来自示例in the cookbook的变体),但我有一个大问题:

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

感谢您的关注。

---更新:

相关部分代码

FormTypes:课堂活动课堂包含活动

class ClassroomType extends AbstractType
{
 public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $entity = $builder->getData();

        $builder->add('name', 'text', array(
            "label" => "Nombre",
            "required" => true,
            "trim" => true,
        ))
            //Bunch of other fields
            ->add("image", "file", array(
                "label" => "Imagen"
            ))
            //First level of embedding
            ->add("activities", 'collection',array(
                'type' => new ActivityType(),
                'allow_add' => true,
                'prototype_name' => '__activity_prototype_placeholder__'
            ))
            ->add('save', 'submit');
    }
}

class ActivityType extends AbstractType
{
 public function buildForm(FormBuilderInterface $builder, array $options)
    {
    $builder
        ->add('kindActivity', 'entity', array(
            "class" => "EducaAppBundle:ActivityKind",
            "multiple" => true,
            'error_bubbling' => true,
            "expanded" => true));

    $builder->add('name', 'text', array(
        'label' => 'Nombre del la actividad',
        ))
        ->add('sessions', 'collection',array(
            'label' => 'Sesiones',
            'type' => new SessionType(),
            'allow_add' => true,
            'by_reference' => false,
            'allow_delete' => true,
            ))
        ->add('save', 'submit', array('label' => 'Guardar'));
    //It has a save button so it can be standalone. 
    //In the twig template macro, if embedded I set "rendered"= true

    }
}

ClassroomController

    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 %}

createClassroomBaseForm.html.twig

{% 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 %}

如果我错过了代码中的某些内容,请告诉我,我不想粘贴太多不相关的代码。 :)

0 个答案:

没有答案
相关问题