WinRoadのLaravel4初心者講座

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

Winroad徒然草の管理人がお届けします
開発メモ4_ProfileController

開発メモ4_ProfileController

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

AdminControllerの作成はひとまず置いといて、ProfileControllerの作成にとりかかります。プロフィール情報は、基本情報と追加情報に分かれるが、結構追加情報が多くて、今までは結構、整理が大変でした。

そこで、追加情報を基本的に、いくつかに分類して、中身は配列情報として保存しておくことにします。そうすれば、追加情報が増えるたびにデータベーステーブルのカラム(フィールド)を増やさなくても済むはず。

ProfileControllerの作成

とりあえずプロフィール作成上のいくつかの問題点を列記しておきます。

問題点

  1. プロフィールの作成で、一番気を遣うのは、会社として把握しておかなければならない基本情報と、各ユーザー間で連絡を取り合うのに必要な情報、この辺の情報をどのユーザーにどの程度公開するのかが問題になります。
  2. ユーザー情報も、社内のユーザー(社内でも役職により相違)、取引先のユーザーによっても公開の範囲が異なります。
  3. 仕事のスムーズな運営と個人情報保護の観点から、十分に配慮する必要あり。
  4. 追加項目は、各ユーザーによって作成できるようにしたが、各ユーザーに一任するのは、情報が煩雑になりすぎる可能性あり。
  5. よって追加項目は、Adminが作成して、各ユーザーはその情報内で入力していく形へ後日変更予定。
  6. 追加項目用のテーブル(items)の作成を検討。
app/controllers/ProfileController.php
<?php
class ProfileController extends BaseController{
/*
|----------------------------------------
| コンストラクター
|----------------------------------------
*/
 public function __construct(){
 //authフィルター
 $this->beforeFilter('auth');
 //全POSTにcsrfフィルターの適用
 $this->beforeFilter('csrf',array('on'=>'post'));
 }

/*
|----------------------------------------
| Topページ
|----------------------------------------
*/
 public function getIndex(){
 //データの取得
 $data['profiles']=Profile::all();
 return View::make('profile/index',$data);
 }
/*
|----------------------------------------
| 新規作成ページ
|----------------------------------------
*/
 public function getCreate(){
 //新規作成ページの表示
 return View::make('profile/create');
 }
 public function postCreate(){
 //POSTデータの取得
 $inputs=Input::except('id');
 //バリデーションルールの作成
 $rules=array(
 'tel'=>'required',
 );
 //バリデーション処理
 $val=Validator::make($inputs,$rules);
 //バリデーションNGなら
 if($val->fails()){
 return Redirect::back()
 ->withInput()
 ->withErrors($val);
 }
 //データの新規作成
 Profile::create($inputs);
 //一覧ページへ移動
 return Redirect::to('profile/index')
 ->with('message','データを作成しました');
 }
/*
|----------------------------------------
| 詳細ページ
|----------------------------------------
*/
 public function getView($id){
 //データの取得
 $data['profile']=Profile::find($id);
 $data['address']=Profile::item('address');
 $data['body']=Profile::item('body');
 $data['license']=Profile::item('license');
 $data['labor']=Profile::item('labor');
 $data['family']=Profile::item('family');
 //プロフィール数が0で無ければ
 if(isset($data['profile'])){
 return View::make('profile/view',$data);
 }
 return Redirect::action('ProfileController@getCreate')
 ->with('message','プロフィールを作成してください');
 }
/*
|----------------------------------------
| 項目作成
|----------------------------------------
*/
 public function getItem($item){
 $data['item']=$item;
 $profiles=Profile::orderBy('created_at','desc')->first();
 return View::make('profile/item',$data);
 }
 public function postItem(){
 //受信データ
 $inputs=Input::only('name','detail');
 //バリデーションルール作成
 $rules=array(
 'name'=>'required',
 'detail'=>'required',
 );
 //バリデーション処理
 $val=Validator::make($inputs,$rules);
 //バリデーションNGなら
 if($val->fails()){
 return Redirect::back()
 ->withInput()
 ->withErrors($val);
 }
 //データの整理
 $item=Input::get('item');
 $name=Input::get('name');
 $detail=Input::get('detail');
 $profile=Profile::where('user_id','=',Auth::user()->id)
 ->orderBy('created_at','desc')
 ->first();
 //項目内が空でなければ
 if($profile->$item != null){
 $data=unserialize($profile->$item);
 $data+=array($name=>$detail);
 $profile->$item=serialize($data);
 //項目内が空なら
 }else{
 $profile->$item=serialize(array($name=>$detail));
 }
 //データの登録
 $profile->save();
 //Profile/viewへ移動
 return Redirect::to('profile/view/'.Auth::user()->id)
 ->with('message','データを作成しました');
 }
}
  • 25-54行目:新規作成に関しては、運用未定。データの変更があった場合、過去データとして残しておくつもりだが、いつの時点で、どのように新規作成するかが、未定。
  • また、User作成時点で、Profileも作成して、profilesテーブルのuser_idだけは、入力しておくこと。後日修正予定。
  • 63-67行目:Profileモデル内に下記の新規メソッドを作成。

Profileモデルにitemメソッドの追加作成

app/models/Profile.php
/*
|--------------------------------------------
| 各項目内の配列を取得する
|--------------------------------------------
*/
 static public function item($item){
 //ログイン中のユーザーの最新情報を取得
 $query=Profile::where('user_id','=',Auth::user()->id)
 ->orderBy('created_at','desc')
 ->first();
 //引数に指定した項目がNULLでなければ
 if($query->$item != null){
 //アンシリアライズして、配列データを返します。
 $data=unserialize($query->$item);
 return $data;
 //項目がNULLなら
 }else{
 return null;
 }
 }
  • itemメソッドを作成。モデル内のメソッドの作成方法がいまいちわからないので、この記述方法が、正しいのかどうかは不明。一応コードは動きます。
  • itemメソッドは、引数と同じ名前のフィールドから、ログイン中のユーザーの個人情報を取得して配列としてリターンしています。
  • ProfileController内で、毎回同じようなコードを作成するのは、面倒なので、作成しました。
  • 指定の情報項目がNULL値なら、NULLをリターンします。

Profile用ビューの作成

app/profile/view.blade.php
@extends('layouts.f4.user.base')
@section('content')
<table width="100%" border="1">
<tr>
<th width="23%" scope="row">ユーザー名</th>
<td width="77%">{{Auth::user()->name}}</td>
</tr>
<tr>
<th scope="row">電話番号</th>
<td>{{$profile->tel}}</td>
</tr>
<tr>
<th scope="row">{{ HTML::link('profile/item/address','住所情報') }}</th>
<td>
@if($address)
@foreach($address as $key=>$value)
{{ $key }} : {{ $value }}<br />
@endforeach
@endif
</td>
</tr>
<tr>
<th scope="row">{{ HTML::link('profile/item/body','身体情報') }}</th>
<td>
@if($body)
@foreach($body as $key=>$value)
{{ $key }} : {{ $value }}<br />
@endforeach
@endif
</td>
</tr>
<tr>
<th scope="row">{{ HTML::link('profile/item/license','資格情報') }}</th>
<td>
@if($license)
@foreach($license as $key=>$value)
{{ $key }} : {{ $value }}<br />
@endforeach
@endif
</td>
</tr>
<tr>
<th scope="row">{{ HTML::link('profile/item/labor','労務情報') }}</th>
<td>
@if($labor)
@foreach($labor as $key=>$value)
{{ $key }} : {{ $value }}<br />
@endforeach
@endif
</td>
</tr>
<tr>
<th scope="row">{{ HTML::link('profile/item/family','家族情報') }}</th>
<td>
@if($family)
@foreach($family as $key=>$value)
{{ $key }} : {{ $value }}<br />
@endforeach
@endif
</td>
</tr>
</table>

@stop
app/views/profile/create.blade.php
@extends('layouts.f4.user.base')
@section('content')
@if(isset($message))
<div data-alert class="alert-box alert radius">
 {{ $message }}
 <a href="#" class="close">&times;</a>
</div>
@endif
 {{ Form::open(array('url'=>'profile/create')) }}
 {{ Form::label('電話番号') }}
 {{ Form::text('tel','') }}
 @if($errors->has('tel'))
 <h5 style="color:red;text-align:center">
 {{ $errors->first('tel') }}
 </h5>
 @endif
 {{ Form::label('住所情報') }}
 {{ Form::text('address','') }}
 {{ Form::label('身体情報') }}
 {{ Form::text('body','') }}
 {{ Form::label('資格情報') }}
 {{ Form::text('license','') }}
 {{ Form::label('労務情報') }}
 {{ Form::text('labor','') }}
 {{ Form::label('家族情報') }}
 {{ Form::text('family','') }}
 {{ Form::label('その他') }}
 {{ Form::text('note','') }}
 {{ Form::hidden('user_id',Auth::user()->id) }}
 {{ Form::submit('送信',array('class'=>'button')) }}
 {{ Form::close() }}
@stop
app/views/profile/item.blade.php
@extends('layouts.f4.user.base')
@section('content')
@if(isset($message))
<div data-alert class="alert-box alert radius">
 {{ $message }}
 <a href="#" class="close">&times;</a>
</div>
@endif
 {{ Form::open(array('url'=>'profile/item')) }}
 {{ Form::label('項目名') }}
 {{ Form::text('name','',array('style'=>'ime-mode:active')) }}
 @if($errors->has('name'))
 <h5 style="color:red;text-align:center">
 {{ $errors->first('name') }}
 </h5>
 @endif
 {{ Form::label('項目内容') }}
 {{ Form::text('detail','',array('style'=>'ime-mode:active')) }}
 @if($errors->has('detail'))
 <h5 style="color:red;text-align:center">
 {{ $errors->first('detail') }}
 </h5>
 @endif
 {{ Form::submit('送信',array('class'=>'button')) }}
 {{ Form::hidden('item',$item) }}
 {{ Form::close() }}
@stop

« »

コメントを残す

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