WinRoadのLaravel4初心者講座

次世代PHPフレームワークのLaravel4を初心者向けに解説して参ります。

Winroad徒然草の管理人がお届けします
開発メモ3_AdminController及びAdminフィルター

開発メモ3_AdminController及びAdminフィルター

このエントリーをはてなブックマークに追加

UserControllerを作成して、ログインできるようになったら、Adminで作成されているユーザーの名称とメールアドレス、パスワード等を変更するために、AdminControllerを作成。

AdminControllerの作成

UserController内をRoleで制御して、Adminで実行できるコマンド、Userが実行できるコマンドと振り分けてもいいのですが、Adminの作業は特殊ですので、別途AdminControllerを作成した方が簡単だと判断。よってAdminControllerを作成。

app/controllers/AdminController.php
<?php
class AdminController extends BaseController{
/*
|----------------------------------------
| コンストラクター
|----------------------------------------
*/
 public function __construct(){
 //adminフィルター
 $this->beforeFilter('admin');
 //全POSTにcsrfフィルターの適用
 $this->beforeFilter('csrf',array('on'=>'post'));
 }
/*
|------------------------------------
| TOPページ
|------------------------------------
*/
 public function getIndex(){
 return View::make('admin/index');
 }
/*
|------------------------------------
| ユーザー一覧ページ
|------------------------------------
| 1. getで全ユーザー表示
| 2. postでユーザー検索
*/
//全ユーザー表示
 public function getUser(){
 $data['users']=User::paginate(10);
 return View::make('admin/user/index',$data);
 }
 //検索ユーザー表示
 public function postUser(){
 $inputs=Input::get('search');
 $data['users']=User::where('name','LIKE','%'.$inputs.'%')->paginate(10);
 return View::make('admin/user/index',$data);
 }
/*
|-----------------------------------
| ユーザー新規作成
|-----------------------------------
| 1.GETでビューの表示
| 2.POSTでユーザー登録
*/
 //GETの処理
 public function getCreate(){
 //ロール名リスト作成
 $data['roles']=Role::orderBy('id','desc')->lists('name','id');
 //グループ名リスト作成
 $data['groups']=Group::lists('name','id');
 return View::make('admin/user/create',$data);
 }
 //POSTの処理
 public function postCreate(){
 //受信データの整理
 $inputs=Input::all();
 //バリデーションの指定
 $rules=array(
 'name'=>'required',
 'email'=>'required|email|unique:users',
 'password'=>'required|min:4',
 );
 //バリデーションチェック
 $val=Validator::make($inputs,$rules);
 //バリデーションNGなら
 if($val->fails()){
 return Redirect::back()
 ->withErrors($val)
 ->withInput();
 }
 //ユーザーの新規作成
 $inputs['onepass']=md5(Input::get('name').time());
 //新規作成
 $user=User::create($inputs);
 //コントローラアクションへパラメーターを渡し、リダレクト
 return Redirect::action('AdminController@getView',array('id'=>$user->id));
 }
/*
|------------------------------------
| ユーザー詳細ページ
|------------------------------------
*/
 public function getView(){
 $id=Input::get('id');
 $data['user']=User::find($id);
 return View::make('admin/user/view',$data);
 }
/*
|------------------------------------
| ユーザー更新ページ
|------------------------------------
*/
 public function getUpdate(){
 $id=Input::get('id');
 //更新ユーザーデータの取得
 $data['user']=User::find($id);
 //ロールリストの作成
 $data['roles']=Role::orderBy('id','desc')->lists('name','id');
 //グループリストの作成
 $data['groups']=Group::lists('name','id');
 return View::make('admin/user/update',$data);
 }
 public function postUpdate(){
 //受信データの整理
 $inputs=Input::all();
 //バリデーションの指定
 $rules=array(
 'name'=>'required',
 'email'=>'required|email',
 );
 //バリデーションチェック
 $val=Validator::make($inputs,$rules);
 //バリデーションNGなら
 if($val->fails()){
 return Redirect::back()
 ->withErrors($val)
 ->withInput();
 }
 //ユーザー情報の更新
 $id=Input::get('id');
 $user=User::find($id);
 $user->name=Input::get('name');
 $user->email=Input::get('email');
 $user->activate=Input::get('activate');
 $user->role_id=Input::get('role_id');
 $user->group_id=Input::get('group_id');
 $user->save();
 $data['users']=$user;
 //コントローラアクションへ名前付きパラメーターを渡し、リダレクト
 //return Redirect::action('AdminController@getUpdate',array('id'=>$id))
 return Redirect::back()
 ->with('warning','データを更新しました');
 }
/*
|------------------------------------
| ユーザー削除ページ
|------------------------------------
*/
 public function getDelete(){
 $id=Input::get('id');
 $data['user']=User::find($id);
 return View::make('admin/user/delete',$data); 
 }
 public function postDelete(){
 $id=Input::get('id');
 User::destroy($id);
 return Redirect::to('admin/user/index'); 
 }
/*
|------------------------------------
| 削除ユーザー一覧
|------------------------------------
*/
 public function getDeleted(){
 $data['users']=User::onlyTrashed()->paginate(10);
 return View::make('admin/user/index',$data)
 ->with('warning','削除ユーザー一覧');
 }
 public function postDeleted(){
 $inputs=Input::get('search');
 $data['users']=User::onlyTrashed()
 ->where('name','LIKE','%'.$inputs.'%')
 ->paginate(10);
 return View::make('admin/user/index',$data)
 ->with('warning','削除ユーザー一覧');
 }
/*
|------------------------------------
| 削除ユーザーの復活
|------------------------------------
*/
 public function getRestore(){
 $id=Input::get('id');
 $user=User::onlyTrashed()->where('id',$id)->restore();
 return Redirect::back()
 ->with('waning','ユーザーを復活させました');
 }
}
  • 134行目:フラッシュデータが引き渡されない。どこのコードを間違えているのだろう。?

AdminControllerをルーターに追加

AdminコントローラーをRESTフルコントローラとしてルーターに追加

Route::controller('admin','AdminController');

Adminフィルターの作成

次にAdmin以外がAdmin専用ページへアクセスできないように、adminフィルターを作成

app/filters.php
Route::filter('admin', function(){
 //ログインしていなければ、ログインページへ
 if(Auth::guest()) return Redirect::guest('user/login');
 //ログインしていてもAdminで無ければ、Userページへ
 if(Auth::user()->role_id<>1){
 return Redirect::intended('user');
 }
});
  • 今回は、Adminフィルターを作成したが、いずれは、Roleフィルターを作成して、Roleに応じてアクセス権限を作成する予定。
  • また、フィルターはRoldeだけでなく、グループでもフィルターを作成する予定(Adminグループ以外は、各グループ内の情報しか取得できないようにする予定、データベースの検索条件の限定)。

Admin用レイアウトテンプレート

Admin用ページを表示するために、Admin用レイアウトのベーステンプレートを作成。

app/views/layouts/f4/admin/base.blade.php
{{--Admin用ベーステンプレート--}}
<!DOCTYPE html>
<!--[if IE 8]> <html class="no-js lt-ie9" lang="ja"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="ja"> <!--<![endif]-->

<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>Builwing管理室</title>

{{ HTML::style('f4/css/normalize.css') }}
{{ HTML::style('f4/css/foundation.css') }}
{{ HTML::style('f4/css/mystyle.css') }}
{{ HTML::script('f4/js/vendor/custom.modernizr.js') }}

</head>
<body style="background:#FCF">

@section('topbar')
{{ View::make('layouts.f4.admin.topbar') }}
@show

<!-- メインコンテンツとサイドバー -->
<div class="row">
<!-- メインコンテンツ -->
<div class="large-9 push-3 columns" role="content">

@yield('content')

</div><!-- メインコンテンツの終了 -->

<!-- サイドバー -->
<aside class="large-3 pull-9 columns">

@section('sidebar')
{{ View::make('layouts.f4.admin.sidebar') }}
@show
</aside>
<!-- サイドバーの終了 -->
</div><!-- メインコンテンツとサイドバーの終了 -->

@section('footer')
<hr>
{{ View::make('layouts.f4.admin.footer') }}
@show

<script>
document.write('<script src="f4/js/vendor/'
+ ('__proto__' in {} ? 'zepto' : 'jquery')
+ '.js"><\/script>');
</script>
{{ HTML::script('f4/js/foundation.min.js') }}
<script>
$(document).foundation();
</script>

</body>
</html>
  • 48行目:”f4/js/vendor/’の箇所は、状況によってはjavaが起動しないので、”http://ドメイン名/f4/js/vendor/’に変更すれば起動します。
  • このベーステンプレートでトップバー、サイドバー、フッターを変更できるので、ユーザーに応じて変更可能。いずれ対応する予定。そうすれば、Admin用ベーステンプレートとかUser用ベーステンプレートとかを作成する必要は無くなる。

一覧表示用ビューの作成

Adminのユーザー操作用トップページは、ユーザー一覧を表示するように作成。

app/views/admin/user/index.blade.php
@extends('layouts.f4.admin.base')
@section('content')
@if(isset($warning))
<div data-alert class="alert-box alert">
{{ $warning }}
</div>
@else
<div data-alert class="alert-box success">
ユーザー一覧
</div>
@endif
<table width="100%" border="1">
<thead>
 <tr>
 <th scope="col">ユーザー名</th>
 <th scope="col">Eメール</th>
 <th scope="col">処理</th>
 </tr>
</thead>
@foreach($users as $user)
 <tr>
 <td>
@if($user->deleted_at== null)
 {{ HTML::linkAction('AdminController@getView',$user->name,
 array('id'=>$user->id)) }}
@else
 {{ $user->name }}
@endif
 </td>
 <td>{{ $user->email }}</td>
 <td>
@if($user->deleted_at== null)
 {{ HTML::linkAction('AdminController@getUpdate','修正',array('id'=>$user->id)) }}&nbsp;
 {{ HTML::linkAction('AdminController@getDelete','削除',array('id'=>$user->id)) }}
@else
 {{ HTML::linkAction('AdminController@getRestore','復活',array('id'=>$user->id)) }}
@endif 
 </td>
 </tr>
@endforeach
</table>
{{ $users->links() }}
@stop
  • 23-24行目:Laravel3では、ブレードテンプレート内で、改行するとコードを認識できなかったが、{{}}内で、改行してもきちんとコードが動くように改良されているみたいです。使いやすくなりました。
  • 32-37行目:削除ユーザーの表示ページもindex.blade.phpで兼用するために作成。これだとワンクリックで削除ユーザーを復活させることができる。

Update用ビューの作成

ユーザーの基本情報を変更するための、Updateビューファイルを下記のように作成。とりあえずは簡単に変更できるように作成しているが、いずれは、メール認証か何かで修正許可するように変更した方がいいのかどうか思案中。

app/views/admin/update.blade.php
@extends('layouts.f4.admin.base')
@section('content')
@if(isset($warning))
<div data-alert class="alert-box alert">
{{ $warning }}
</div>
@else
<div data-alert class="alert-box success">
ユーザー更新
</div>
@endif
{{ Form::open() }}
<fieldset>
<legend><h4>ID:{{$user->id}}</h4></legend>
<div class="row">
 <div class="small-3 columns">
 {{ Form::label('','氏名',array('class'=>'right')) }}
 </div>
 <div class="small-9 columns">
 {{ Form::text('name',$user->name,array('style'=>'ime-mode:active')) }}</td>
 </div>
</div>
<div class="row">
 <div class="small-3 columns">
 {{ Form::label('','Eメール',array('class'=>'right')) }}
 </div>
 <div class="small-9 columns">
 {{ Form::text('email',$user->email,array('style'=>'ime-mode:inactive')) }}
 </div>
</div>
<div class="row">
 <div class="small-3 columns">
 {{ Form::label('','アクティベート',array('class'=>'right')) }}
 </div>
 <div class="small-9 columns">
 @if($user->activate==1)
 {{ Form::radio('activate','1',true)}} 認証済み
 {{ Form::radio('activate','0') }} 未認証
 @else
 {{ Form::radio('activate','1')}} 認証済み
 {{ Form::radio('activate','0',true) }} 未認証
 @endif
 </div>
</div>
<div class="row">
 <div class="small-3 columns">
 {{ Form::label('','ロール',array('class'=>'right')) }}
 </div>
 <div class="small-9 columns">
 {{ Form::select('role_id',$roles,isset($user->role_id) ? $user->role->id :null) }}
 </div>
</div>
<div class="row">
 <div class="small-3 columns">
 {{ Form::label('','グループ',array('class'=>'right')) }}
 </div>
 <div class="small-9 columns">
 {{ Form::select('group_id',$groups,isset($user->group_id) ? $user->group->id :null) }}
 </div>
</div>
<div class="row">
 <div class="small-3 small-centered columns">
 {{ Form::submit('更新',array('class'=>'button')) }}
 </div>
</div>
</fieldset>
{{ Form::hidden('id',$user->id) }}
{{ Form::close() }}
@stop
  • 20行目:ime-mode*で初期入力モードを日本語に指定。
  • 28行目:同じくime-modeで初期入力モードを英数字に指定。disabledに指定してもいいのかも?
  • 36-42行目:ちょっとコードがださい。何かいい方法はないかな?

Admin用トップバーの作成

{{--Admin用トップバー--}}
<nav class="top-bar">
<!--タイトルエリア-->
<ul class="title-area">
<li class="name">
 <h1>{{ HTML::link('admin','Builwing管理室') }}</h1>
</li>
<!-- smallサイズ表示用 -->
<li class="toggle-topbar menu-icon"><a href="#"><span>menu</span></a></li>
</ul><!--タイトルエリア終了-->
<section class="top-bar-section">
<!--左メニュー開始-->
<ul><!--タイトルエリアの終了-->
 <li class="divider"></li>
 {{ Form::open(array('url'=>'admin/user')) }}
 <li>
 <div class="small-10 large-centered columns">
 <div class="row collapse">
 <div class="small-8 columns">
 {{ Form::text('search','',array('placeholder'=>'ユーザー検索')) }}</div>
 <div class="small-4 columns">
 {{ Form::submit('検索',array('class'=>'button')) }}</div>
 </div>
 </li>
{{ Form::close() }}
</ul><!--左メニュー終了-->
<!--右メニュー開始-->
<ul class="right">
 <li class="divider"></li>
 <li class="has-dropdown">
 <a href="#">ユーザー管理</a>
 <ul class="dropdown">
 <li>{{ HTML::link('admin/user','登録ユーザー') }}</li>
 <li>{{ HTML::link('admin/deleted','削除ユーザー') }}</li>
 <li>{{ HTML::link('admin/create','ユーザー作成') }}</li>
 <li>{{ HTML::link('#','その他') }}</li>
 </ul>
 </li>
 <li class="divider"></li>
 <li class="has-dropdown">
 <a href="#">グループ管理</a>
 <ul class="dropdown">
 <li>{{ HTML::link('#','登録グループ') }}</li>
 <li>{{ HTML::link('#','削除グループ') }}</li>
 <li>{{ HTML::link('#','グループ作成') }}</li>
 <li>{{ HTML::link('#','その他') }}</li>
 </ul>
 </li>
 <li class="divider"></li>
 <li class="has-dropdown">
 <a href="#">ログ管理</a>
 <ul class="dropdown">
 <li>{{ HTML::link('#','一覧') }}</li>
 <li>{{ HTML::link('#','その他') }}</li>
 </ul>
 </li>
</ul><!--右メニュー終了-->
</section>
</nav>

laravel028

サイドバーとフッターのイメージがまだできていないので、本日はここまで。

« »

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です