На некоторых страницах я использую формы в моделях bootstrap. Я передаю форму с помощью Ajax и проверяется в контроллере. Большинство пользователей правильно заполнят форму, но если проверка не выполняется, форма повторно отображается и отправляется обратно пользователю. Мне это совсем не нравится, но я не могу найти лучший способ, потому что я не могу получить доступ к ошибкам проверки полей. У кого-то есть лучший подход для получения ошибок проверки, отправляемых обратно в JSON?Symfony2 форма проверки в Ajax
ответ
если я правильно понял, у вас есть форма, и вам нужно получить ошибки для каждого поля отдельно. если да, то посмотрите на \ Symfony \ Component \ Form \ Form :: getErrorsAsString() & сделать что-л в виде:
function getFormErrors($form)
{
$errors = array();
// get the form errors
foreach($form->getErrors() as $err)
{
// check if form is a root
if($form->isRoot())
$errors['__GLOBAL__'][] = $err->getMessage();
else
$errors[] = $err->getMessage();
}
// check if form has any children
if($form->count() > 0)
{
// get errors from form child
foreach ($form->getIterator() as $key => $child)
{
if($child_err = getFormErrors($child))
$errors[$key] = $child_err;
}
}
return $errors;
}
Удивительный! Не могли бы вы объяснить, почему вам нужно проверить, является ли форма корнем? – rvaliev
Я создал функцию сам
public function getFormErrors(Form $form) {
$errors = $form->getErrors();
foreach ($form->all() as $child) {
foreach ($child->getErrors() as $key => $error) {
$template = $error->getMessageTemplate();
$parameters = $error->getMessageParameters();
foreach ($parameters as $var => $value) {
$template = str_replace($var, $value, $template);
}
$errors[$child->getName()][] = $template;
}
}
return $errors;
}
У меня только есть такая же проблема сегодня!
Я отправил форму с помощью ajax, и если мой контроллер отправил мне не json 'OK', форма обновится с новой формой, отправленной контроллером, который содержит ошибки. Данные 'OK' отправляются, когда form-> isValid(), иначе он возвращает визуализацию формы.
HTML:
<div class="form_area">
<form id="myform" action.... >
...code form ...
</form>
</div>
Действие контроллера:
use Symfony\Component\HttpFoundation\JsonResponse;
public function myEditAction(){
.......
if ($request->getMethod() == 'POST') {
$form->bind($request);
if ($form->isValid()) {
... code whn valide ...
if ($request->isXmlHttpRequest()) {
return new JsonResponse('OK');
}
}
}
return $form;
}
JS:
$('#myform').on('submit',function(e){
var formdata = $('#myform').serialize();
var href = $(this).attr('action');
$.ajax({
type: "POST",
url: href,
data: formdata,
cache: false,
success: function(data){
if(data != "OK") {
$('.form_area').html(data);
}
},
error: function(){},
complete: function(){}
});
return false;
});
Это решение, которое мне не нравится. Это просто противно и непрактично. См. Мой собственный ответ в том, как я решил проблему. –
Я бы сказал, что самое чистое решение для реализации JMSSerializerBundle (http://jmsyst.com/bundles/JMSSerializerBundle), который использует следующий класс:
затем в вашем контроллер:
// ...
if ($request->isXMLHttpRequest()) {
$jsonResponse = new JsonResponse();
$serializer = $this->container->get('jms_serializer');
$form = $serializer->serialize($form, 'json');
$data = array('success' => false,
'errorList' => $form);
$jsonResponse->setData($data);
return $jsonResponse;
}
Действительно чистый подход. Должен быть ответ. –
Не очень чистый IMO, потому что вам нужно разобрать JSON, содержащуюся в поле 'errorList' ответа. Это означает, что вы должны 'JSON.parse' строку, содержащуюся в ответе JSON ... – Cyrille
- 1. Symfony2 условная форма проверки
- 2. Symfony2 форма проверки соответствующих полей
- 3. Symfony2: Форма проверки между сущностями
- 4. Symfony2 форма проверки исчерпана память
- 5. Symfony2 форма проверки без класса
- 6. Struts ajax форма проверки
- 7. Symfony2 форма - дата проверки поля не работает
- 8. Symfony2 форма проверки - это значение недействительно
- 9. symfony2 форма проверки: form.errors VS form.fieldname.errors
- 10. Symfony2 - форма глобальной проверки не работает, если определена группа проверки
- 11. Symfony2 ajax: параметр + форма, ошибка привязки
- 12. Простая форма в symfony2
- 13. Динамическая форма (объект-коммутатор) symfony2
- 14. Форма проверки jquery с загруженной формой ajax
- 15. PHP Ajax форма проверки не проходит json
- 16. jquery - форма проверки разрывов ajax post
- 17. HTML5 форма проверки для кнопки AJAX submit
- 18. форма всегда действует в Symfony2
- 19. Symfony2 переопределение модель проверки
- 20. Почему моя форма не отправляется с Ajax в symfony2
- 21. Форма AJAX отправляет внутри twitter bootstrap modal (Symfony2)
- 22. Symfony2 делать Форма проверки, а затем проверку базы данных
- 23. Symfony2 форма проверки для многократного поля требуется только один
- 24. Кнопка конфигурации Symfony2 Форма
- 25. форма проверки
- 26. форма проверки
- 27. Symfony2 FOSUserBundle - дополнительная форма
- 28. Symfony2 Форма Вариант Разрешение
- 29. Symfony2: Форма: данные связывают
- 30. Symfony2 форма поле выбора
Вы можете сделать валидация в JS, но лучший подход imho taht для проверки на стороне сервера. Данные Snding через JSON - хороший выбор. Что не так с этим подходом? – Pawel
Нет, я не использую проверку JS, потому что не хочу определять валидации в двух отдельных местах. В настоящий момент я проверю серверную сторону, но не могу найти достойный способ получить все ошибки из свойств формы + объекта и валидаторов. –
Просто взаимодействуйте с элементами из формы и получите ошибки каждого. – Pawel