我是Laravel的初学者,也是面向前端的编程(我的大多数背景都是数据库管理)。我正在尝试整合一个允许用户在数据层次结构中移动的多页表单:
我这样做的黑客方式就是让第一个后面的每个页面成为一个POST路由,它抓取上一步的识别数据,为视图生成正确的选择字段并正确填充数据库。然而,经过一些研究,我了解到直接调用后期路径中的视图是一种笨拙的做事方式(混合使用GET和POST方法),尤其明显的是验证错误重定向不适用于后期路由。因此,如果用户在表单中搞砸了,而不是被重定向到带有错误列表的最后一个阶段,他们最终会得到一个Method Not Allowed异常。
实现这种多页表单的更好(RESTful)方式是什么?我不是很擅长前端的东西,如果可以的话我宁愿避免使用Ajax。
以下是我的一些代码:
路线文件:
Route::get('newentry', 'NewEntryController@index');
Route::get('newentry/selectjob','NewEntryController@selectjob');
Route::post('newentry/selectday','NewEntryController@selectday');
Route::post('newentry/upload','NewEntryController@upload');
表单页面的示例方法
public function selectday()
{
//get post from job form and validate
$request = Request::all();
$job_id = intval(Request::get('job_id'));
//create data variable, pass job_id for hidden field
$data = [];
$data['job_id'] = $job_id;
//apply ruleset
$rules = array(
'job_id' => 'required'
);
$validator = Validator::make($request, $rules);
if ($validator->passes()) {
//get the subset of days
$data['days'] = DB::table('daily_runs')
->where('job_id',$job_id)
->orderBy('id', 'asc')
->lists('start_time','id');
return View::make('newentry.day')->with('data', $data);
} else {
return Redirect::to('newentry/selectjob')->withInput()->withErrors($validator); //this redirect will not work.
}
} //end selectday
如果用户没有犯错(如我所说,如果他们搞砸了验证重定向会抛出一个方法不允许的异常),那么这段代码就可以工作了,但是从我听到的我接近它的编码习惯很差。我可以在控制器/视图结构中采取哪些步骤来使其更好?
答案 0 :(得分:0)
您必须在一个页面上在Ajax中执行此操作。这是无稽之谈 为每个选择列表使用一个页面。
这是您的第一个选择列表
<form>
<input class="target" type="text" value="Field 1">
<select class="target">
<option value="option1" selected="selected">Option 1</option>
<option value="option2">Option 2</option>
</select>
</form>
这是AJAX代码
$(document).ready(function(){
// when the select list changes
$( ".target" ).change(function(e) {
e.preventDefault();
// gets the selected value
var selectedoption = $(this).text();
// sends it via Ajax Post to the controller
$.ajax({
type:"POST",
url: 'your uri to controller',
data: {'whatever waits at your controller' :selectedoption}
});
});
});
注意:在Laravel中为避免CSRF出现问题,您需要查看我的其他帖子, 你只需要在我的链接
中输入页面中控制器的URILaravel: workaround the CSRF token via Ajax issue :
使用Controller获取的值,它将查询发送到模型,从模型获取回复,然后将结果返回给视图。
在视图中,您仍然位于第一个选择列表所在的同一页面上。
第二个选择列表选择该值并在填充第二个选择列表的foreach循环中使用它。