掲示板パート2【Laravel】

Pocket

前回は掲示板を作成しました。⇒掲示板パート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

以上で、掲示板の作成は終わりです。