前回は掲示板を作成しました。⇒掲示板パート1【Laravel】
今回は、掲示板にページャーと記事の修正と削除を追加します。
参考サイト
・iNet Solutions(https://www.inet-solutions.jp/technology/laravel-tutorial/)
・実践的Web開発メソッド(https://blog.hiroyuki90.com/articles/laravel-pagination/)
実装の手順は前回と同様です。
やること
1. ページャー
2. 記事の削除
3. 記事の更新
1. ページャー
コマンドプロンプトで以下を実行。
views/vendor/pagination/・・・に自動でファイルが作成されます。
php artisan vendor:publish --tag=laravel-pagination
app/Http/Controllers/PostsController.php編集
・public function index()で取得する記事数を変更
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Post; use Illuminate\Support\Facades\Validator; use Redirect; class PostsController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $posts = Post::paginate(2);//2件ずつ表示 return view('bbs.index')->with('posts', $posts);//index.blade.phpに値をわたす } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { return view('bbs.create'); } /** * Display the specified resource. * * @param \App\Post $post * @return \Illuminate\Http\Response */ public function show($id) { $post = Post::find($id); return View('bbs.single')->with('post', $post); } public function showCategory($id) { $category_posts = Post::where('cat_id', $id)->get(); return view('bbs.category') ->with('category_posts', $category_posts); } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { $rules = [ 'title' => 'required', 'content'=>'required', 'cat_id' => 'required', ]; $messages = array( 'title.required' => 'タイトルを正しく入力してください。', 'content.required' => '本文を正しく入力してください。', 'cat_id.required' => 'カテゴリーを選択してください。', ); $validator = Validator::make($request->all(), $rules, $messages); if ($validator->passes()) { $post = new Post; $post->title = $request->input('title'); $post->content = $request->input('content'); $post->cat_id = $request->input('cat_id'); $post->save(); return Redirect::back() ->with('message', '投稿が完了しました。'); }else{ return Redirect::back() ->withErrors($validator) ->withInput(); } } }
resources/viwes/bbs/index.blade.php編集
・$posts->links(‘vendor/pagination.default’)により、paginationの構造を呼び出し
@extends('layouts.default') @section('content') <div class="col-xs-8 col-xs-offset-2"> <div class=""> <p>{{ link_to("/bbs/create", '新規作成', array('class' => 'btn btn-primary')) }}</p> </div> @foreach($posts as $post) <h2>タイトル:{{ $post->title }} <small>投稿日:{{ date("Y年 m月 d日",strtotime($post->created_at)) }}</small> </h2> <p>カテゴリー:{!! link_to("/bbs/category/{$post->category->id}", $post->category->name, array('class' => '')) !!}</p> <p> <?php echo $post->comments->count(); ?> 件のコメント</p> <p>{{ $post->content }}</p> <p>{{ link_to("/bbs/{$post->id}", '続きを読む', array('class' => 'btn btn-primary')) }}</p> @endforeach <div class="paginate"> {{ $posts->links('vendor/pagination.default') }} </div> </div> @stop
http://localhost/test/public/bbsのページ下部にページャーが追加されました。
2. 記事の削除
routes/web.php編集
・削除確認referenceと削除機能deleteを追加
<?php use Illuminate\Support\Facades\Route; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); Route::resource('bbs', 'PostsController');//bbsにアクセスした際にPostsControllerに処理させる Route::get('bbs/category/{id}', 'PostsController@showCategory'); Route::get('bbs/{id}/reference', 'PostsController@reference'); Route::post('delete', 'PostsController@delete'); Route::resource('comment', 'CommentsController');
app/Http/Controllers/PostsController.php編集
・ページ下部にpublic function reference($id)とpublic function delete(Request $request)を追加
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Post; use Illuminate\Support\Facades\Validator; use Redirect; class PostsController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $posts = Post::all();//全記事取得 return view('bbs.index')->with('posts', $posts);//index.blade.phpに値をわたす } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { return view('bbs.create'); } /** * Display the specified resource. * * @param \App\Post $post * @return \Illuminate\Http\Response */ public function show($id) { $post = Post::find($id); return View('bbs.single')->with('post', $post); } public function showCategory($id) { $category_posts = Post::where('cat_id', $id)->get(); return view('bbs.category') ->with('category_posts', $category_posts); } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { $rules = [ 'title' => 'required', 'content'=>'required', 'cat_id' => 'required', ]; $messages = array( 'title.required' => 'タイトルを正しく入力してください。', 'content.required' => '本文を正しく入力してください。', 'cat_id.required' => 'カテゴリーを選択してください。', ); $validator = Validator::make($request->all(), $rules, $messages); if ($validator->passes()) { $post = new Post; $post->title = $request->input('title'); $post->content = $request->input('content'); $post->cat_id = $request->input('cat_id'); $post->save(); return Redirect::back() ->with('message', '投稿が完了しました。'); }else{ return Redirect::back() ->withErrors($validator) ->withInput(); } } /** * Remove the specified resource from storage. * * @param \App\Post $post * @return \Illuminate\Http\Response */ public function reference($id) { $post = Post::find($id); return View('bbs.reference')->with('post', $post); } public function delete(Request $request) { Post::destroy($request->id); return view('bbs.delete'); } }
resources/viwes/bbs/reference.blade.php作成
@extends('layouts.default') @section('content') <div class="col-xs-8 col-xs-offset-2"> <h1>削除確認ページ</h1> {{-- 投稿完了時にフラッシュメッセージを表示 --}} @if(Session::has('message')) <div class="bg-info"> <p>{{ Session::get('message') }}</p> </div> @endif {{ Form::open(['action' => 'PostsController@delete'], array('class' => 'form')) }} <input name="id" type="hidden" value="{{ $post->id }}"> <div class="form-group"> <label for="title" class="">タイトル</label> <div class=""> <p>{{ $post->title }}</p> </div> </div> <div class="form-group"> <label for="cat_id" class="">カテゴリー</label> <div class=""> <p><?php if($post->cat_id == 1){ echo("電化製品"); } else if($post->cat_id == 2){ echo("食品"); }?></p> </div> </div> <div class="form-group"> <label for="content" class="">本文</label> <div class=""> <p>{{ $post->content }}</p> </div> </div> <div class="form-group"> <button type="submit" class="btn btn-primary">削除する</button> </div> {{ Form::close() }} </div> @stop
resources/viwes/bbs/delete.blade.php作成
@extends('layouts.default') @section('content') <div class="col-xs-8 col-xs-offset-2"> <h1>削除完了</h1> <a href="{{ action('PostsController@index') }}" class="btn btn-primary">一覧に戻る</a> </div> @stop
resources/viwes/bbs/index.blade.php編集
・<p>{{ link_to(“/bbs/{$post->id}/reference”, ‘削除’, array(‘class’ => ‘btn btn-primary’)) }}</p>により削除ボタン追加
@extends('layouts.default') @section('content') <div class="col-xs-8 col-xs-offset-2"> <div class=""> <p>{{ link_to("/bbs/create", '新規作成', array('class' => 'btn btn-primary')) }}</p> </div> @foreach($posts as $post) <h2>タイトル:{{ $post->title }} <small>投稿日:{{ date("Y年 m月 d日",strtotime($post->created_at)) }}</small> </h2> <p>カテゴリー:{!! link_to("/bbs/category/{$post->category->id}", $post->category->name, array('class' => '')) !!}</p> <p> <?php echo $post->comments->count(); ?> 件のコメント</p> <p>{{ $post->content }}</p> <p>{{ link_to("/bbs/{$post->id}", '続きを読む', array('class' => 'btn btn-primary')) }}</p> <p>{{ link_to("/bbs/{$post->id}/reference", '削除', array('class' => 'btn btn-primary')) }}</p> @endforeach <div class="paginate"> {{ $posts->links('vendor/pagination.default') }} </div> </div> @stop
3. 記事の記事の更新
routes/web.php編集
・編集確認editと編集完了updateを追加
<?php use Illuminate\Support\Facades\Route; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); Route::resource('bbs', 'PostsController');//bbsにアクセスした際にPostsControllerに処理させる Route::get('bbs/category/{id}', 'PostsController@showCategory'); Route::get('bbs/{id}/reference', 'PostsController@reference'); Route::post('delete', 'PostsController@delete'); Route::get('bbs/{id}/edit', 'PostsController@edit'); Route::post('bbs/edit', 'PostsController@update'); Route::resource('comment', 'CommentsController');
app/Http/Controllers/PostsController.php編集
・public function edit($id)とpublic function update(Request $request)を追加
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Post; use Illuminate\Support\Facades\Validator; use Redirect; class PostsController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $posts = Post::all();//全記事取得 return view('bbs.index')->with('posts', $posts);//index.blade.phpに値をわたす } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { return view('bbs.create'); } /** * Display the specified resource. * * @param \App\Post $post * @return \Illuminate\Http\Response */ public function show($id) { $post = Post::find($id); return View('bbs.single')->with('post', $post); } public function showCategory($id) { $category_posts = Post::where('cat_id', $id)->get(); return view('bbs.category') ->with('category_posts', $category_posts); } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { $rules = [ 'title' => 'required', 'content'=>'required', 'cat_id' => 'required', ]; $messages = array( 'title.required' => 'タイトルを正しく入力してください。', 'content.required' => '本文を正しく入力してください。', 'cat_id.required' => 'カテゴリーを選択してください。', ); $validator = Validator::make($request->all(), $rules, $messages); if ($validator->passes()) { $post = new Post; $post->title = $request->input('title'); $post->content = $request->input('content'); $post->cat_id = $request->input('cat_id'); $post->save(); return Redirect::back() ->with('message', '投稿が完了しました。'); }else{ return Redirect::back() ->withErrors($validator) ->withInput(); } } /** * Remove the specified resource from storage. * * @param \App\Post $post * @return \Illuminate\Http\Response */ public function reference($id) { $post = Post::find($id); return View('bbs.reference')->with('post', $post); } public function delete(Request $request) { Post::destroy($request->id); return view('bbs.delete'); } /** * Show the form for editing the specified resource. * * @param \App\Post $post * @return \Illuminate\Http\Response */ public function edit($id) { $post = Post::find($id); return view('bbs.edit')->with('post', $post); } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param \App\Post $post * @return \Illuminate\Http\Response */ public function update(Request $request) { $rules = [ 'title' => 'required', 'content'=>'required', 'cat_id' => 'required', ]; $messages = array( 'title.required' => 'タイトルを正しく入力してください。', 'content.required' => '本文を正しく入力してください。', 'cat_id.required' => 'カテゴリーを選択してください。', ); $validator = Validator::make($request->all(), $rules, $messages); if ($validator->passes()) { $post = Post::find($request->id); $post->title = $request->title; $post->content = $request->content; $post->cat_id = $request->cat_id; $post->save(); return view('bbs.update'); }else{ return Redirect::back() ->withErrors($validator) ->withInput(); } } }
resources/viwes/bbs/edit.blade.php作成
@extends('layouts.default') @section('content') <div class="col-xs-8 col-xs-offset-2"> <h1>修正ページ</h1> {{-- 投稿完了時にフラッシュメッセージを表示 --}} @if(Session::has('message')) <div class="bg-info"> <p>{{ Session::get('message') }}</p> </div> @endif {{-- エラーメッセージの表示 --}} @foreach($errors->all() as $message) <p class="bg-danger">{{ $message }}</p> @endforeach {{ Form::open(['action' => 'PostsController@update'], array('class' => 'form')) }} <input name="id" type="hidden" value="{{ $post->id }}"> <div class="form-group"> <label for="title" class="">タイトル</label> <div class=""> <input class="" name="title" type="text" value="{{ $post->title }}"> </div> </div> <div class="form-group"> <label for="cat_id" class="">カテゴリー</label> <div class=""> <select name="cat_id" type="text" class=""> <option></option> <option <?php if($post->cat_id == 1){ echo("selected"); } ?> value="1" name="1">カテゴリーその1</option> <option <?php if($post->cat_id == 2){ echo("selected"); } ?> value="2" name="2">カテゴリーその2</option> </select> </div> </div> <div class="form-group"> <label for="content" class="">本文</label> <div class=""> <textarea class="" name="content" cols="50" rows="10">{{ $post->content }}</textarea> </div> </div> <div class="form-group"> <button type="submit" class="btn btn-primary">投稿する</button> </div> {{ Form::close() }} </div> @stop
resources/viwes/bbs/update.blade.php作成
@extends('layouts.default') @section('content') <div class="col-xs-8 col-xs-offset-2"> <h1>修正完了</h1> <a href="{{ action('PostsController@index') }}" class="btn btn-primary">一覧に戻る</a> </div> @stop
resources/viwes/bbs/index.blade.php編集
・<p>{{ link_to(“/bbs/{$post->id}/edit”, ‘修正’, array(‘class’ => ‘btn btn-primary’)) }}</p>により編集ボタン追加
@extends('layouts.default') @section('content') <div class="col-xs-8 col-xs-offset-2"> <div class=""> <p>{{ link_to("/bbs/create", '新規作成', array('class' => 'btn btn-primary')) }}</p> </div> @foreach($posts as $post) <h2>タイトル:{{ $post->title }} <small>投稿日:{{ date("Y年 m月 d日",strtotime($post->created_at)) }}</small> </h2> <p>カテゴリー:{!! link_to("/bbs/category/{$post->category->id}", $post->category->name, array('class' => '')) !!}</p> <p> <?php echo $post->comments->count(); ?> 件のコメント</p> <p>{{ $post->content }}</p> <p>{{ link_to("/bbs/{$post->id}", '続きを読む', array('class' => 'btn btn-primary')) }}</p> <p>{{ link_to("/bbs/{$post->id}/edit", '修正', array('class' => 'btn btn-primary')) }}</p> <p>{{ link_to("/bbs/{$post->id}/reference", '削除', array('class' => 'btn btn-primary')) }}</p> @endforeach <div class="paginate"> {{ $posts->links('vendor/pagination.default') }} </div> </div> @stop
以上で、掲示板の作成は終わりです。