速習Larave3(その6)、削除処理

タグ: Laravel3  

記事の削除を実装しましょう。なにせ、最初はバリデーションを入れていませんでしたから、でたらめな記事がわんさか出来たことでしょう。見苦しい記事は無かったことにしなくてはなりません。

最初に削除のためのルートを定義しましょう。post/delete/ポスト番号です。routes.phpに付け加えてください。

// 記事削除
//  フォーム表示
Route::get('/post/delete/(:num)', array('as' => 'post-delete', 'uses' => 'post@delete'));
//  フォーム処理
Route::post('/post/delete/(:num)', array('as' => 'post-delete', 'before' => 'csrf', 'uses' => 'post@delete'));

続いてPostコントローラーに削除処理を付け加えます。

    /**
     * 記事削除確認表示
     */
    public function get_delete($id)
    {
        $post = Post::find($id);
        if ( $post === null )
        {
            return Redirect::error('404');
        }

        return view('post.delete')
                ->with('post', $post);
    }

    /**
     * 記事削除確認処理および削除
     */
    public function post_delete($id)
    {
        $post = Post::find($id);
        if ( $post === null )
        {
            return Redirect::error('404');
        }

        $rules = array(
            'delete-confirm' => 'accepted',
        );

        $input = Input::only(array('delete-confirm'));

        $val = Validator::make($input, $rules);

        if ( $val->passes() )
        {
            $post->delete();

            return Redirect::to_route('post-index')
                    ->with('message', '記事を削除しました。');
        }
        else
        {
            return Redirect::to_route('post-delete', array( $post->id ))
                    ->with_errors($val->errors)
                    ->with_input();
        }
    }

なんだか入力項目名が長いですね。それには秘密があります。その秘密とは…CM2の後で!

削除の確認フォームを作成します。なにせ、いきなり削除は危ないですからね。application/views/post/delete.blade.phpです。

@layout('template')

@section('title')
    記事削除
@endsection

@section('content')
<h2>記事削除の確認</h2>
<p>下記のレコードを削除します。確認してください。</p>
<p>タイトル:{{ e($post->title) }}</p>
<p>内容:{{ e($post->body) }}</p>
<p>作成日時:{{ $post->created_at }}</p>
{{ Form::open() }}
    <div>
        {{ Form::checkbox('delete-confirm', '1', Input::old('delete-confirm', '')) }}
        この記事を削除する
    </div>
    @if ($errors->has('delete-confirm'))
        <p style="color: red;">{{ $errors->first('delete-confirm') }}</p>
    @endif

    <div>
        {{ Form::submit('削除実行') }}
    </div>
    {{ Form::token() }}
{{ Form::close() }}
@endsection

削除の確認をチェックボックで行います。

削除のようにデータ破壊的なアクションを取らせる前に、慎重に考えさせるため、わざと手間を取らせるのはUIデザインの基本です。間違って削除したら、戻せませんからね。(自身がある方は、戻せるようにコーディングしてください。それもデザインの一手です。いつでも戻せるというのはユーザーに安心感を与えます。)

さて、削除はこれで出来ますが、いちいちURLを叩くのは面倒です。一覧ページからワンクリックで行えるようにしましょう。ビューの変更だけで済みますからね。index.blade.viewです。

@layout('template')

@section('title')
    一覧表示
@endsection

@section('content')
    <table>
        <tr>
            <th>タイトル</th>
            <th>作成日</th>
            <th>削除</th>
        </tr>
        @foreach($posts as $post)
            <tr>
                <td>{{ HTML::link_to_route('post-show', $post->title ,array($post->id)) }}</td>
                <td>{{ $post->created_at }}</td>
                <td>{{ HTML::link_to_route('post-delete', '✖', array($post->id)) }}</td>
            </tr>
        @endforeach
    </table>
@endsection

ようし、できました。早速動かしてみましょう。

動作には問題が無いですが、エラーメッセージには問題があります。「delete-confirmを承認してください。」ですか、そうそう、前にやりましたね。language/ja/validation.phpの中で設定するんでしたね。

    'attributes' => array(
        'title' => 'タイトル',
        'body' => '本文',
        'delete-confirm' => '削除',
    ),

これで、「削除を承認してください。」になりました。よしよし。

しかしです…もしかしたらユーザーは間違って削除実行ボタンを押しちゃったのかも知れません。Enterを叩いちゃったのかも知れません。それなのに、承認しろというメッセージはやや不親切です。ここは、オリジナルメッセージを表示しましょう。同じPHPファイルのちょっと上に、customという項目があります。

このcustomには、フィールド名、続いて下線、最後にバリデーションルール名でキーを指定すると、その組み合わせのオリジナルメッセージを定義できるのです。そのために下線を使用しない、やや長い名前を付けました。短すぎる名前ですと、他のビューでも使用され、かぶってしまう可能性があります。

では、これをセットしましょう。

    'custom' => array(
        'delete-confirm_accepted' => '削除する場合は、チェックを入れてください。',
    ),

こうした文言もセンスが問われます。もちろん、あなたが良いと思うメッセージを選んでください。