模态表格的Laravel路由问题

时间:2016-11-18 21:13:18

标签: php sql laravel routes modal-dialog

我有一个我一直在研究的Web应用程序项目,除了在资源上提交标志外,大多数应用程序功能都有效。我想使用模态表单将数据提交到数据库,然后在Flagged视图页面上显示所有标记的资源Name & Description(来自Resources表)Flag_Reason & Other_Comments(来自Flagged表)我有它工作到它只提交Flag_Reason and Other_Comments的地方,而不是更新我的资源表。我相信我现在遇到路由问题,因为在更改我的函数以更新我的资源表并在数据库中创建一个新的Flag条目后我得到一个像这样的错误

Missing argument 1 for App\Http\Controllers\FlagsController::addFlag()

这是我的一些代码,希望有人可以帮助我最终一劳永逸地解决这个问题。

路线

Route::get('resource', array('as'=>'viewResource', 'uses' => 'ResourceController@resource'));

Route::get('flags', 'FlagsController@index');

Route::post('resource', ['as' => 'resource', 'uses'=>'FlagsController@addFlag']);

///Route::post('resource', ['as' => 'resource', 'uses'=>'FlagsController@postFlag']);///
This route works fine, and only inserts the Flagged table data into the database.

如果我将路线修改为Route::post('resource/{Resource_ID}', ['as' => 'resource', 'uses'=>'FlagsController@addFlag'])

我收到这样的错误 Missing required parameters for [Route: resource] [URI: resource/{Resource_ID}].

标志控制器

class FlagsController extends Controller
{
    public function index()
    {
        $resources =  Resources::where('Flagged', 1)->with('flags')->get();

        return view('pages.flags', ['resource' => $resources]);
    }

    public function addFlag($id)
    {
        $flag = Flagged::create(Request::all());

        $resource = Resources::findOrFail($id);

        $resource->update(array('Flagged' => 1));

        $resource->flags()->attach([$flag->id]);

        dd($resource::all());
        return back();
    }
    ////////  This function inserts only the Flagged table data into the Flagged table, It doesnt do what I want it to do, so i've commented it out///// 
    public function postFlag()
    {
        $flag = Flagged::create([
            'Flag_Reason' => Input::get('reason'),
            'Other_Comments' =>Input::get('comments')]);
        $flag->save();

        \Session::flash('flash_message', 'Flagged!');

        return redirect('resource');
    }
}

资源视图

... 

@foreach($resources as $resource) @foreach ($resource->locations as $location)
<tr>
  <td> <a class="btn btn-small btn-default" style="float:right; margin-right:5px;" href="{{ URL::to('resource/addToCart/' .$resource->Resource_ID) }}">+</a> {{ $resource->Name }}</td>
  <td>{{ $resource->Description }}</td>
  <td>{{ $location->Address }}</td>
  <td>{{ $location->City }}</td>
  <td>{{ $location->Zip_Code }}</td>
  <td>{{ $location->County }}</td>
  <td>
    <button type="button" class=" msgBtn btn btn-default" style=" display:inline; margin-right:auto;"><a href="pages/editresources/{{$resource['Resource_ID']}}">Edit</a>
    </button>
    <button type="button" id="submitFlag" class=" msgBtn btn btn-default" style=" display:inline; margin-right:auto;"><a href="#flagResource" data-toggle="modal" data-resource-id="{{ $resource->Resource_ID }}" data-resource-name="{{ $resource->Name }}">Flag</a>
    </button>
    <button type="button" class=" msgBtn3 btn btn-default pull-right" style="display:inline; margin-right:auto;"><a href="pages/deleteResource/{{$resource['Resource_ID']}}">Delete</a>
    </button>
  </td>

</tr>
@endforeach 
@endforeach

模态,在资源视图中

<div class="modal fade" id="flagResource" tabindex="-1" role="dialog" aria-labelledby="flagModalLabel">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">&times;</span></button>
                    <h4 class="modal-title"
                        id="flagResourceLabel" style="text-align:center;"> Flagged
                    </h4>

                </div>
            <div class="modal-body">
                {!! Form::open(array('route'=>'resource', 'class'=>'form', 'method'=>'POST')) !!}
                <div class="form-group">
                    <label for="reason" class="control-label">Reason for Flagging:</label>
                    {!! Form::text('reason', null, array('class'=> 'form-control', 'placeholder'=>'Reason')) !!}
                </div>

                <div class="form-group">
                    <label for="comments" class="control-label">Other Comments:</label>
                    {!! Form::text('comments', null, array('class'=> 'form-control', 'placeholder'=>'Comments'))  !!}
                </div>
            </div>
               <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                    <span class="pull-right">
                    <button id="submitFlag" type="submit" class="btn btn-primary" style="margin-left:5px;">Flag</button>
                    </span>
                </div>
                {!! Form::close() !!}
            </div>
        </div>
    </div>
    <script>
            $('#flagResource').on('show.bs.modal', function(e) {
                    //var submitFlag = $(e.relatedTarget);
                    var resourceName = $(e.relatedTarget).data('resource-name');
                    var resourceId = $(e.relatedTarget).data('resource-id');
                    var modal = $(this);
                    modal.find('.modal-title').text(resourceName);
            });

    </script>

我认为正在发生的问题是我在模态中打开的表单 {!! Form::open(array('route'=>'resource', 'class'=>'form', 'method'=>'POST')) !!},我的addFlag函数接受一个I​​D,但我的资源路由上不需要{id}。

如果有人可以查看我的路线并帮我调试,那就太好了。提前谢谢。

2 个答案:

答案 0 :(得分:0)

您需要保留路线的方式,以便它通过Resource_ID但是您需要在设置表单时传递它。

{!! Form::open(array('route'=>'resource' array('Resource_ID' => $yourId), 'class'=>'form', 'method'=>'POST')) !!}

关于您的评论,并仔细查看您的代码,我认为重新考虑其工作方式可能是有意义的。

您正在将多个资源传递给此视图,因此我认为像我最初建议的那样将资源ID添加到URL并不是最好的主意,因为它需要是动态的,具体取决于所点击的资源和URL不是最简单的方法是通过javascript进行更改。

我认为更好的解决方案是返回使用Form::open(array('route'=>'resource', 'class'=>'form', 'method'=>'POST')) !!},然后从您的路线中移除/{Resource_ID}部分,并从$id移除public function addFlag(),因为我们不再通过URL传递它。

然后在表单中,为resource_id

添加一个隐藏的有效内容
<input type="hidden" name="resource_id" id="resource_id" value="" />

然后你已经在监听bootstrap show事件并获取正确的资源ID,我们只需要将它添加到值中。

        $('#flagResource').on('show.bs.modal', function(e) {
                //var submitFlag = $(e.relatedTarget);
                var resourceName = $(e.relatedTarget).data('resource-name');
                var resourceId = $(e.relatedTarget).data('resource-id');
                var modal = $(this);
                modal.find('.modal-title').text(resourceName);
                $('#resource_id').val(resourceId);
        });

在您的addFlag()方法中,您可以通过...

获取资源ID
$id = \Input::get('resource_id');

答案 1 :(得分:0)

FlagsController中的addFlag函数接受一个名为$ id的参数,您接收的异常是因为您忘记将参数添加到路径中。

Route::post('resource', ['as' => 'resource', 'uses'=>'FlagsController@addFlag']);

应该

Route::post('resource/{id}', ['as' => 'resource', 'uses'=>'FlagsController@addFlag']);

我认为Laravel Route参数是特定于名称的,这就是 {Resource_ID} 不起作用的原因。

您可以在Laravel here中阅读有关使用参数进行路由的详细信息 至于资源视图中的模态,您还需要传递要在表单上更新的资源的参数

{!! Form::open(array('route'=>'resource', array('id' => $yourIdHere), 'class'=>'form', 'method'=>'POST')) !!}

确保将 $ yourIdHere 替换为您想要的资源。

其他一切似乎都是有序的。