前回は掲示板を作成しました。⇒掲示板パート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
以上で、掲示板の作成は終わりです。