要解决AJAX Symfony表单中错误未正确返回到子表单的问题,可以按照以下步骤进行操作:
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
public function submitForm(Request $request)
{
$form = $this->createForm(MyFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// 处理表单提交逻辑
return new JsonResponse(['success' => true]);
}
// 获取表单错误信息
$errors = $this->getFormErrors($form);
return new JsonResponse(['success' => false, 'errors' => $errors]);
}
private function getFormErrors($form)
{
$errors = [];
foreach ($form->getErrors(true) as $error) {
$errors[] = $error->getMessage();
}
foreach ($form->all() as $childForm) {
if ($childForm instanceof FormInterface) {
$childErrors = $this->getFormErrors($childForm);
if (!empty($childErrors)) {
$errors[$childForm->getName()] = $childErrors;
}
}
}
return $errors;
}
$(document).ready(function() {
$('form').submit(function(event) {
event.preventDefault();
var form = $(this);
var url = form.attr('action');
var method = form.attr('method');
var formData = form.serialize();
$.ajax({
url: url,
method: method,
data: formData,
dataType: 'json',
success: function(response) {
if (response.success) {
// 表单提交成功逻辑
} else {
// 清除之前的错误消息
form.find('.form-error-message').remove();
// 更新子表单的错误消息
$.each(response.errors, function(field, errors) {
var fieldElement = form.find('[name="' + field + '"]');
var fieldContainer = fieldElement.closest('.form-field');
$.each(errors, function(index, error) {
var errorMessage = $('
');
fieldContainer.append(errorMessage);
});
});
}
}
});
});
});
通过以上代码示例,能够正确处理AJAX Symfony表单提交和错误返回,并更新嵌入式子表单中的错误消息。