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 %}
如果我错过了代码中的某些内容,请告诉我,我不想粘贴太多不相关的代码。 :)