У меня есть стандартная форма silverstripe, которая использует jquery validate для проверки требуемого поля. Мне нужно выполнить некоторую другую проверку перед отправкой формы, поэтому я использовал submithandler jquery validate для выполнения ajax-запроса и, если возвращается успешный результат, для отправки формы согласно приведенному ниже коду:
$('form').validate({
rules: {
{**MY FIELD RULES**}
},
submitHandler: function(form) {
$.ajax({
url: {**MY URL**},
success: function(response) {
var resp = JSON.parse(response);
if(resp.ErrorMessage == '') {
form.submit();
} else {
alert(resp.ErrorMessage);
}
},
});
}
});
При отправке формы с использованием приведенного выше кода функция Ajax вызывается и корректно возвращается, однако при отправке формы я получаю следующее сообщение:
ОШИБКА [НЕИЗВЕСТНЫЙ ТИП, ОШИБКА 404]:
IN POST {МОЯ ФОРМА URL}
Линия в
Трассировка
=====
SilverStripe \ Dev \ CliDebugView-> renderTrace ()
DetailErrorFormatter.php: 119
SilverStripe \ Logging \ DetailErrorFormatter-> output (404,,,,)
DetailErrorFormatter.php: 54
SilverStripe \ Logging \ DetailErrorFormatter-> format (Array)
HTTPResponse.php: 355
SilverStripe \ Control \ HTTPResponse-> outputBody ()
HTTPResponse.php: 283
SilverStripe \ Control \ HTTPResponse-> output ()
index.php: 26
Однако, если я размещу форму отправки перед вызовом ajax, вот так:
$('form').validate({
rules: {
{**MY FIELD RULES**}
},
submitHandler: function(form) {
form.submit();
$.ajax({
url: {**MY URL**},
success: function(response) {
var resp = JSON.parse(response);
if(resp.ErrorMessage == '') {
// form.submit();
} else {
alert(resp.ErrorMessage);
}
},
});
}
});
Форма отправки работает правильно.
У меня есть собственная маршрутизация в этом проекте, но я не думаю, что это является причиной проблемы, так как отправка формы работает во втором примере. Тем не менее, routing.yml выглядит следующим образом:
---
Name: myproject
---
SilverStripe\Core\Manifest\ModuleManifest:
project: mysite
SilverStripe\SiteConfig\SiteConfig:
extensions:
- SalonVision\SalonVision\SiteConfigExtension
---
Name: modelascontrollerroutes2
Before:
- '#modelascontrollerroutes'
After:
- '#adminroutes'
- '#graphqlroutes'
---
SilverStripe\Control\Director:
rules:
'$Salon/$Location/$URLSegment//$Action/$ID/$OtherID': 'SalonVision\SalonVision\CModelAsController'
и я использую $ form-> setFormAction ($ location-> baseLocationURL (). $ Form-> FormAction ()); добавить правильное $ Salon / $ Location в URL действия.
Я попытался отключить токен безопасности с помощью $ form-> disableSecurityToken (); просто если это было причиной проблемы, но не радости.
* * +1039 Кроме того:
Насколько я понимаю, когда вы отправляете форму Silverstripe, вызывается исходный метод формы (тот, который генерирует форму), а затем вызывается метод действия формы.
Если я отображаю страницу формы в своем браузере, а затем добавляю оператор php die в конце метода формы, а затем отправляю форму, отображается сообщение die. Если я помещу сообщение die в начало метода действия формы, появится сообщение об ошибке выше.
Это означает, что проблема должна лежать, когда silverstripe пытается вызвать метод действия формы. Я не знаю, как это работает внутренне, но любые мысли будут с благодарностью.