Я новичок в Laravel, и я не понимаю, как сделать формы действий и маршрутизацию для редактирования поста
Вот мои маршруты —
Route::post('/menu', 'MenuController@store');
Route::resource('/menu', 'MenuController');
вот контроллер —
public function update(Request $request, $id)
{
$this->validate($request, [
'menuName' => 'required',
'menuLink' => 'required'
]);
//create new menu
return $id;// $menus->name = $request->input('menuName');
//$menus->link = $request->input('menuLink');
//$menus->save();
//return redirect('/menu')->with('success', 'Menu updated');
}
Возврат $ id предназначен для проверки того, что «id» даст мне, а он мне — «{id}»
вот форма —
<form action = "/menu/{id}" method = "POST">
{{ csrf_field() }}
<input name = "_method" type = "hidden" value = "PUT">
<input type="text" id="menuName" name="menuName" class="input-block-level" placeholder="Menu name">
<input type="text" id="linkName" name="menuLink" class="input-block-level" placeholder="Menu link ">
<button type="submit" class="btn btn-success pull-right">Submit</button>
</form>
Я действительно все испортил и не знаю, что я делаю неправильно. Я не могу понять, почему функция обновления возвращает мне «{id}», а не значение идентификатора, и как я могу сделать так, чтобы все это работало
Вы не передаете идентификатор в своем представлении, вы передаете его в виде строки, вам нужно, чтобы он создал переменную, присвоил ей правильный идентификатор и передал ее в вашу форму.
Измените форму действия с
action = "/menu/{id}"
в
action = "/menu/".$id"
или вы можете использовать лезвие Laravel
Form::open(['route' => ['menu.update', $id]])
и не забудьте закрыть форму в конце
{!!Form::close!!}
Вы сделали что-то не так с action
приписывать. Измените это на:
action="/menu/{{ $id }}"
Хорошо,
у вас есть метод редактирования, который будет показывать форму, этот метод должен вернуть объект меню
public function update($id)
{
// get the menu you wan to edit
$menu = Menu::find($id);
// return the form with the menu object
return view('your.form.view', compact('menu'));
}
Теперь форма должна быть такой
// use that object u returned in the form action
<form action = "/menu/{{ $menu->id }}" method = "POST">
{{ csrf_field() }}
<input name = "_method" type = "hidden" value = "PUT">
<input type="text" id="menuName" name="menuName" class="input-block-level" placeholder="Menu name">
<input type="text" id="linkName" name="menuLink" class="input-block-level" placeholder="Menu link ">
<button type="submit" class="btn btn-success pull-right">Submit</button>
</form>
Теперь метод обновления должен быть примерно таким
public function update(Request $request, $id)
{
$this->validate($request, [
'menuName' => 'required',
'menuLink' => 'required'
]);
// update the data
$bool = Menu::where('id',$id)->update([
'menuName'=> $request->menuName,
'menuLink'=> $request->menuLink,
]);
if(!$bool){
Session::flash('alert','error');
return view('page.index');
}
Session::flash('alert','success');
return view('page.index');
}
Этот первый метод — «get» edit, который должен показывать форму,
вторая — это обновление, которое должно получить данные из формы (после метода show) и использовать i для обновления.
Я решил ошибку —
в обновлении лезвия перед формой я добавил foreach
<div class="container">
<div class="row">
@foreach($menus as $menus)
<form action="/menu/{{$menus->id}}" method="POST">
@endforeach
{{ csrf_field() }}
<input name = "_method" type = "hidden" value = "PUT">
<input type="text" id="menuName" name="menuName" class="input-block-level" placeholder="Menu name">
<input type="text" id="linkName" name="menuLink" class="input-block-level" placeholder="Menu link ">
<button type="submit" class="btn btn-success pull-right">Submit</button>
</form>
</div>
</div>
Но сейчас он редактирует только 1-й пост и не имеет значения, какой пост он редактирует.
вот контроллер —
public function edit($id)
{
$menus = Menu::all();
return view('admin.editmenu')->with('menus', $menus);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$this->validate($request, [
'menuName' => 'required',
'menuLink' => 'required'
]);
//create new menu
$menus = Menu::find($id);
$menus->name = $request->input('menuName');
$menus->link = $request->input('menuLink');
$menus->save();
return redirect('/menu')->with('success', 'Menu updated');
}
лезвие списка меню —
@if(count($menus) > 1)
@foreach($menus as $menus)
<tr>
<th scope="row">1</th>
<td>{{$menus->name}}</td>
<td>{{$menus->link}}</td>
<td>{{$menus->created_at}}</td>
<td>{{$menus->updated_at}}</td>
<td>
<button type = "button"class = "btn btn-outline-danger btn-sm">Delete</button>
<a href = "/menu/{{$menus->id}}/edit" class = "btn btn-outline-warning btn-sm">Edit</button>
</td>
</tr>
@endforeach
@else
Хорошо, я понял и решил.
Начну с маршрутов
маршруты ———-
Route::resource('menu', 'MenuController');
этот почтовый маршрут был ненужным, но это ни на что не повлияло
контроллер ——-
public function edit($id)
{
$menus = Menu::find($id);
return view('admin.editmenu')->with('menus', $menus);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$this->validate($request, [
'menuName' => 'required',
'menuLink' => 'required'
]);
//create new menu
$menus = Menu::find($id);
$menus->name = $request->input('menuName');
$menus->link = $request->input('menuLink');
$menus->save();
return redirect('/menu')->with('success', 'Menu updated');
}
Где в функции редактирования я должен найти идентификатор, который нужно редактировать
список меню ——————
@if(count($menus) > 1)
@foreach($menus as $menu)
<tr>
<th scope="row">1</th>
<td>{{$menu->name}}</td>
<td>{{$menu->link}}</td>
<td>{{$menu->created_at}}</td>
<td>{{$menu->updated_at}}</td>
<td>
<button type = "button"class = "btn btn-outline-danger btn-sm">Delete</button>
<a href = "/menu/{{$menu->id}}/edit" class = "btn btn-outline-warning btn-sm">Edit</button>
</td>
</tr>
@endforeach
@else
<p class = "well"> No menu items created!</p>
@endif
Для ясности я изменил только $ menus как $ menus в $ menus as $ menu.
редактировать лезвие ————
@extends('admin.main')
@section('content')
<div class="container">
<div class="row">
<form action="/menu/{{$menus->id}}" method="POST">
{{ csrf_field() }}
<input name = "_method" type = "hidden" value = "PUT">
<input type="text" id="menuName" name="menuName" class="input-block-level" placeholder="Menu name" value="{{ $menus->name }}">
<input type="text" id="linkName" name="menuLink" class="input-block-level" placeholder="Menu link " value="{{ $menus->link }}">
<button type="submit" class="btn btn-success pull-right">Submit</button>
</form>
</div>
</div>
@endsection
Здесь я удалил @foreach, как сказал @Snapey, и добавил параметр value.
Я думаю, что значение параметра всегда давало мне ошибки.
Спасибо всем за внимание и желание помочь! Надеюсь, что когда-нибудь я смогу помочь другим своими знаниями.