【发布时间】:2017-02-06 06:38:22
【问题描述】:
我有一个关于使用 slim 框架的 php 和 ajax 的问题
我创建了一些将我路由到控制器的路由,现在我想使用 Ajax 提交一个简单的表单。这工作正常,但问题是如果我将在没有 Ajax 的情况下提交表单,我会向服务器发送一个 post 请求,这将调用 createAction 而不是我的控制器中的表单 renderAction 方法(参见代码)。 但是我需要调用 formRender,因为当表单无效时,我必须再次向用户显示带有值的表单。
注意:我还没有实现任何验证代码。
这里是我提交表单的 JS 代码:
$('#reservation').on('submit', function (ev) {
ev.preventDefault();
var data = $(this).serialize();
var keyVal = data.split("&");
var values = [];
keyVal.forEach(function (element) {
values[element.split("=")[0]] = element.split("=")[1];
});
$.post("/admin/reservation/create", data).done(function (data) {
console.log(data);
}).error(function (err) {
});
});
这里是我的控制器的代码:
public function formRender(Request $request, Response $response)
{
$formData = $request->getParams();
return $this->view->render($response, '/reservations/form.twig', [
'formData' => $formData]);
}
public function createAction(Request $request, Response $response)
{
$formData = $request->getParams();
$response = $response->withJson($formData);
return $response;
}
这是我的路线:
$app->get('/reservation/create', 'ReservationController:formRender');
$app->post('/reservation/create', 'ReservationController:createAction');
这里是查看代码(使用树枝):
<form class="col s6" id="reservation" method="post">
<div class="row">
<div class="input-field col s6">
<input placeholder="Titel" id="title" name="title" type="text" class="validate"
value="{{ formData.title }}">
<label for="title">Titel</label>
</div>
<div class="input-field col s12 m6">
<select class="icons" multiple>
<option value="" disabled selected>Choose Rooms</option>
<option value="" data-icon="images/sample-1.jpg" class="circle">example 1</option>
<option value="" data-icon="images/office.jpg" class="circle">example 2</option>
<option value="" data-icon="images/yuna.jpg" class="circle">example 1</option>
</select>
<label>Rooms</label>
</div>
</div>
<div class="row">
<div class="input-field col s6">
<input value="{{ formData.startDate }}" id="startDate" name="startDate" type="date" class="validate">
</div>
<div class="input-field col s6">
<input value="{{ formData.endDate }}" id="endDate" name="endDate" type="date" class="validate">
</div>
</div>
<button type="submit" class="waves-effect waves-light btn">button</button>
</form>
我应该如何解决这个问题......所以我希望能够通过 ajax 发送数据,并且我希望能够在没有 js 的情况下提交我的表单。我正在寻找一个干净的解决方案..不是一个快速而肮脏的解决方案,带有隐藏的字段或其他东西...... 这种情况的最佳做法是什么?
【问题讨论】:
-
没有ajax怎么提交表单?
-
????嗯只是创建单独的行动路线?????????但后来我得到了重复的代码