SilverStripe 通过 Ajax 提交 HTML 表单
SilverStripe submit HTML form through Ajax
我想通过 Ajax 将数据从简单的 HTML 表单传递到控制器,然后处理数据并 return 返回响应。
目前我有以下内容:
HomePage.ss
<form method="POST" class="form-horizontal submit-form" onsubmit="return checkform(this);">
<!-- Text input-->
<div class="form-group">
<label class="col-md-4 control-label" for="name">Name</label>
<div class="col-md-8">
<input id="name" name="name" type="text" placeholder="insert full Name" class="form-control input-md" required="" />
</div>
</div>
<!-- Button -->
<div class="form-group">
<label class="col-md-4 control-label" for="send-btn"></label>
<div class="col-md-8">
<button id="send-btn" name="send-btn" class="btn btn-primary">Submit</button>
</div>
</div>
</form>
JavaScript
$('form.submit-form').submit(function() {
$.ajax({
type: 'POST',
url: 'processForm',
data: $(this).serialize(),
success: function(data) {
alert('data received');
}
});
});
HomePage.php
class HomePage_Controller extends Page_Controller {
public function events() {
$events = CalendarEvent::get();
return $events;
}
public function processForm() {
if (Director::is_ajax()) {
echo 'ajax received';
} else {
//return $this->httpError(404);
return 'not ajax';
}
}
}
在开发人员工具中,我可以看到我得到了带有 404 未找到错误的 xhr processForm。
如何让这个 Ajax 表单与 SilverStripe 控制器一起正常工作?
您需要了解 SilverStripe 中如何处理 HTTP 请求路由。
当您发送请求 POST /processForm 时,它被视为页面并由 ModelAsController 管理。这就是您收到 404 错误的原因 - 没有 URLSegment = processForm.
的 SiteTree 记录
解决方案 1
使用表单对象。它在运行时自动创建所有路由配置。阅读更多
https://docs.silverstripe.org/en/3.3/tutorials/forms/
https://docs.silverstripe.org/en/3.3/developer_guides/forms/
解决方案 2
当你真的想深入到简单的一个方法请求处理程序时,使用这种方法。注册自定义控制器和路由。
你在mysite/_config/routing.yml
中指定你的路线
---
Name: siteroutes
---
Director:
rules:
processCustomForm: CustomFormController
处理您的请求
class CustomFormController extends Controller
{
public function handleRequest( SS_HTTPRequest $request, DataModel $model ) {
if (!$request->isPost()) {
// handle invalid request
}
$name = $request->postVar('name')
// process your form
}
}
蜘蛛,
我已经做了类似下面的事情。这是一个快速而肮脏的演示,尚未经过测试,但它可能会让您走上正确的道路。如果您不熟悉表单在 SilverStripe 中的工作方式,请参阅 SilverStripe 中的前端表单课程。我发现这些课程对我个人很有用,并提供了课程的代码:http://www.silverstripe.org/learn/lessons/introduction-to-frontend-forms?ref=hub
Page.php
<?php
class Page extends SiteTree
{
}
class Page_Controller extends Content_Controller
{
private static $allowed_actions = array(
'MyForm',
);
public function MyForm()
{
Requirements::javascript(THIRDPARTY_DIR . '/jquery/jquery.min.js');
Requirements::javascript(THIRDPARTY_DIR . '/jquery-validate/jquery.validate.min.js');
Requirements::javascript('/path/to/your/validation/script.js');
$fields = FieldList::create(
TextField::create('name')
->setTitle('Name')
);
$actions = FieldList::create(
FormAction::create('doSubmit')
->setTitle('Submit')
);
$requiredFields = RequiredFields::create(
'name'
);
$form = Form::create($this, 'MyForm', $fields, $actions, $requiredFields);
return $form;
}
public function doSubmit($data, $form)
{
//process $data or create your new object and simpley $form->saveInto($yourObject); then $yourObject->write()
//then deal with ajax stuff
if ($this->request->isAjax()) {
return $this->customise(array(
'YourTemplateVar' => 'Your Value'
))->renderWith('YourIncludeFile');
} else {
//this would be if it wasn't an ajax request, generally a redirect to success/failure page
}
}
}
YourValidationScript.js
(function ($) {
$(function () {
$('#MyForm_Form').validate({
submitHandler: function (form) {
$.ajax({
type: $(form).attr('method'),
url: $(form).attr('action') + "?isAjax=1",
data: $(form).serialize()
})
.done(function (response) {
$('.content').html(response);
})
.fail(function (xhr) {
alert('Error: ' + xhr.responseText);
});
},
rules: {
name: "required"
}
});
})
})(jQuery);
我想通过 Ajax 将数据从简单的 HTML 表单传递到控制器,然后处理数据并 return 返回响应。
目前我有以下内容:
HomePage.ss
<form method="POST" class="form-horizontal submit-form" onsubmit="return checkform(this);">
<!-- Text input-->
<div class="form-group">
<label class="col-md-4 control-label" for="name">Name</label>
<div class="col-md-8">
<input id="name" name="name" type="text" placeholder="insert full Name" class="form-control input-md" required="" />
</div>
</div>
<!-- Button -->
<div class="form-group">
<label class="col-md-4 control-label" for="send-btn"></label>
<div class="col-md-8">
<button id="send-btn" name="send-btn" class="btn btn-primary">Submit</button>
</div>
</div>
</form>
JavaScript
$('form.submit-form').submit(function() {
$.ajax({
type: 'POST',
url: 'processForm',
data: $(this).serialize(),
success: function(data) {
alert('data received');
}
});
});
HomePage.php
class HomePage_Controller extends Page_Controller {
public function events() {
$events = CalendarEvent::get();
return $events;
}
public function processForm() {
if (Director::is_ajax()) {
echo 'ajax received';
} else {
//return $this->httpError(404);
return 'not ajax';
}
}
}
在开发人员工具中,我可以看到我得到了带有 404 未找到错误的 xhr processForm。
如何让这个 Ajax 表单与 SilverStripe 控制器一起正常工作?
您需要了解 SilverStripe 中如何处理 HTTP 请求路由。
当您发送请求 POST /processForm 时,它被视为页面并由 ModelAsController 管理。这就是您收到 404 错误的原因 - 没有 URLSegment = processForm.
的 SiteTree 记录解决方案 1
使用表单对象。它在运行时自动创建所有路由配置。阅读更多 https://docs.silverstripe.org/en/3.3/tutorials/forms/ https://docs.silverstripe.org/en/3.3/developer_guides/forms/
解决方案 2
当你真的想深入到简单的一个方法请求处理程序时,使用这种方法。注册自定义控制器和路由。
你在mysite/_config/routing.yml
中指定你的路线--- Name: siteroutes --- Director: rules: processCustomForm: CustomFormController
处理您的请求
class CustomFormController extends Controller { public function handleRequest( SS_HTTPRequest $request, DataModel $model ) { if (!$request->isPost()) { // handle invalid request } $name = $request->postVar('name') // process your form } }
蜘蛛,
我已经做了类似下面的事情。这是一个快速而肮脏的演示,尚未经过测试,但它可能会让您走上正确的道路。如果您不熟悉表单在 SilverStripe 中的工作方式,请参阅 SilverStripe 中的前端表单课程。我发现这些课程对我个人很有用,并提供了课程的代码:http://www.silverstripe.org/learn/lessons/introduction-to-frontend-forms?ref=hub
Page.php
<?php
class Page extends SiteTree
{
}
class Page_Controller extends Content_Controller
{
private static $allowed_actions = array(
'MyForm',
);
public function MyForm()
{
Requirements::javascript(THIRDPARTY_DIR . '/jquery/jquery.min.js');
Requirements::javascript(THIRDPARTY_DIR . '/jquery-validate/jquery.validate.min.js');
Requirements::javascript('/path/to/your/validation/script.js');
$fields = FieldList::create(
TextField::create('name')
->setTitle('Name')
);
$actions = FieldList::create(
FormAction::create('doSubmit')
->setTitle('Submit')
);
$requiredFields = RequiredFields::create(
'name'
);
$form = Form::create($this, 'MyForm', $fields, $actions, $requiredFields);
return $form;
}
public function doSubmit($data, $form)
{
//process $data or create your new object and simpley $form->saveInto($yourObject); then $yourObject->write()
//then deal with ajax stuff
if ($this->request->isAjax()) {
return $this->customise(array(
'YourTemplateVar' => 'Your Value'
))->renderWith('YourIncludeFile');
} else {
//this would be if it wasn't an ajax request, generally a redirect to success/failure page
}
}
}
YourValidationScript.js
(function ($) {
$(function () {
$('#MyForm_Form').validate({
submitHandler: function (form) {
$.ajax({
type: $(form).attr('method'),
url: $(form).attr('action') + "?isAjax=1",
data: $(form).serialize()
})
.done(function (response) {
$('.content').html(response);
})
.fail(function (xhr) {
alert('Error: ' + xhr.responseText);
});
},
rules: {
name: "required"
}
});
})
})(jQuery);