2016-11-18 2 views
1

У меня есть проект веб-приложения, над которым я работал, большая часть функциональности приложений работает, за исключением отправки флага на ресурсе. Я хочу использовать модальную форму для отправки данных в базу данных, а затем на странице с изображением с пометкой отображаются все помеченные ресурсы Name & Description (из таблицы ресурсов) Flag_Reason & Other_Comments (из таблицы с флагом) Я работал над тем, где она подавала только Flag_Reason and Other_Comments и не обновлять мою таблицу ресурсов вообще. Я считаю, что в настоящее время у меня проблемы с путями, потому что после того, как меняю функцию, чтобы обновить таблицу ресурсов и создать новую запись флага в БД я получаю сообщение об ошибке, как этогоПроблемы с маршрутизацией Laravel для модальной формы

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

Вот некоторые из моего кода , надеюсь, кто-то может помочь мне окончательно разобраться в этом раз и навсегда.

Маршруты

Route::get('resource', array('as'=>'viewResource', 'uses' => '[email protected]')); 
 

 
Route::get('flags', '[email protected]'); 
 

 
Route::post('resource', ['as' => 'resource', 'uses'=>'[email protected]']); 
 

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

Если я изменить свой маршрут, чтобы посмотреть, как этот Route::post('resource/{Resource_ID}', ['as' => 'resource', 'uses'=>'[email protected]'])

Я получаю сообщение об ошибке, как этот 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'); 
 
    } 
 
}

Resource View

... 
 

 
@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

Modal, внутри Ресо urces Посмотреть

<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 функция принимает идентификатор, но мой маршрут ресурс не нужен { id} на нем.

Если кто-то может взглянуть на мои маршруты и помочь мне отладить его, было бы здорово. Заранее спасибо.

ответ

0

Вам необходимо сохранить маршрут, как вы его получили, чтобы он прошел Resource_ID, но затем вам необходимо передать его при настройке формы.

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

Что касается Вашего комментария, и, приглядевшись на свой код, я думаю, что это может иметь смысл пересмотреть, как это работает.

Вы передаете несколько ресурсов этому представлению, поэтому я думаю, что добавление идентификатора ресурса к 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="" /> 

Тогда вы уже слушаете бутстраповское шоу события и захватывая правильный идентификатор ресурса, нам нужно просто добавить его к значению.

 $('#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 = \Input::get('resource_id'); 
+0

Благодарим вас за ответ. В вашем методе формы '$ yourId', какой ID я должен использовать там? Я пробовал '$ id', я получаю' undefined variable id', я пробовал '$ resource' и получал ошибку' Array to string conversion'. –

+0

Я просто обновил ответ, возможно, лучше сделать другой путь, так как мы имеем дело с несколькими ресурсами. – user3158900

0

Ваша функция addFlag внутри FlagsController принимает параметр с именем $ ID исключением вы получаете, потому что у вас есть забыл добавить параметр к вашему маршруту.

Route::post('resource', ['as' => 'resource', 'uses'=>'[email protected]']); 

должен быть

Route::post('resource/{id}', ['as' => 'resource', 'uses'=>'[email protected]']); 

Я считаю, что параметры Laravel маршрута являются названием конкретного поэтому {resource_id} не работает.

Вы можете прочитать больше о маршрутизации с параметрами в Laravel here Как для модального внутри ресурсов просмотра вам необходимо также передать параметр ресурса вы обновляете на форме

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

Убедитесь заменить $ yourIdHere с ресурсом, который вы хотите добавить.

Все остальное, кажется, в порядке.