Laravel形成多个页面

时间:2015-06-30 16:26:49

标签: php forms laravel redirect post

我是Laravel的初学者,也是面向前端的编程(我的大多数背景都是数据库管理)。我正在尝试整合一个允许用户在数据层次结构中移动的多页表单:

  1. 在第一页上,他们可以选择一个项目或创建一个新项目,
  2. 在第二个他们选择该项目的一个子部分(或再次,做一个新的)
  3. 在第三页上,他们可以执行文件上传或特定任务 小节。
  4. 我这样做的黑客方式就是让第一个后面的每个页面成为一个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
    

    如果用户没有犯错(如我所说,如果他们搞砸了验证重定向会抛出一个方法不允许的异常),那么这段代码就可以工作了,但是从我听到的我接近它的编码习惯很差。我可以在控制器/视图结构中采取哪些步骤来使其更好?

1 个答案:

答案 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出现问题,您需要查看我的其他帖子, 你只需要在我的链接

中输入页面中控制器的URI

Laravel: workaround the CSRF token via Ajax issue :

使用Controller获取的值,它将查询发送到模型,从模型获取回复,然后将结果返回给视图。

在视图中,您仍然位于第一个选择列表所在的同一页面上。

第二个选择列表选择该值并在填充第二个选择列表的foreach循环中使用它。