WinRoadのLaravel4初心者講座

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

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

開発メモ6_ProfileControllerの修正

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

Profileの追加項目をAdminが作成して、その内容を各ユーザーが登録するように変更したので、以前作成したProfileControllerを下記の内容で修正しました。

修正内容及び検討内容

  1. createメソッドは、Adminが作成した項目内容の未入力部分を入力するために使用します。
  2. Aminへの権限移行に伴い、項目作成のためのItemメソッドを削除。
  3. updateメソッドは、既に入力済みの値を変更するために使用する予定。
  4. 只、旧データを保存するのに、わざわざ新しいファイルを作成する必要があるかどうか検討中。
  5. 修正データは、履歴専用のテーブルを作成して、そこに保存した方がいいのではないのかという案もある。
  6. 修正履歴で必要な項目、①修正日、②修正した人、③修正項目名、④旧データ、⑤修正データ、⑥修正理由?

ProfileControllerの修正

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($column){
 //itemsテーブルの未入力データを取得
 $data['items']=Profile::item($column,true);
 //配列数が0なら
 if(count($data['items']) == 0){
 $message='未入力データはありません';
 }else{
 $message=null;
 }
 //カテゴリデータを取得
 $category=Category::where('name','=',$column)->first();
 //項目名データを取得
 $data['description']=$category->description;
 $data['column']=$category->name;
 //新規作成ページの表示
 return View::make('profile/create',$data)
 ->with('message',$message);
 }

 public function postCreate(){
 //POSTデータの取得
 $inputs=Input::except('id','column','_token');
 //バリデーションルールの作成
 foreach($inputs as $key=>$value):
 $rules[$key]='required';
 endforeach;
 //バリデーション処理
 $val=Validator::make($inputs,$rules);
 //バリデーションNGなら
 if($val->fails()){
 return Redirect::back()
 ->withInput()
 ->withErrors($val);
 }
 $column=Input::get('column');
 //データの新規作成
 $profile=Profile::where('user_id','=',Auth::user()->id)->first();
 //カラム内がNULLなら
 if($profile->$column == null){
 //入力値の配列を保存
 $profile->$column=serialize($inputs);
 $profile->save();
 }else{
 //カラム内がNULLでなければ
 $a=unserialize($profile->$column); //元データ
 $b=$inputs; //受信データ
 //2つの配列を併合して一つの配列へ
 $merge=array_merge($a,$b);
 //Proileを取得
 $profile=Profile::where('user_id','=',Auth::user()->id)->first();
 //シリアライズ処理した配列を入力
 $profile->$column=serialize($merge);
 //データ保存
 $profile->save();
 }
 //一覧ページへ移動
 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','プロフィールを作成してください');
 }
}

Profileモデルの修正

app/models/Profile.php
<?php
class Profile extends Eloquent{
 protected $softDelete=true;
 protected $guarded=array('id');
/*
|--------------------------------------------
| リレーションの指定
|--------------------------------------------
*/
 public function user(){
 return $this->belongsTo('User');
 }

/*
|--------------------------------------------
| 各項目内の配列を取得する
|--------------------------------------------
| 第2引数がtrueなら、未入力配列をリターンする
*/
 static public function item($item,$empty=false){
 //ログイン中のユーザーの最新情報を取得
 $query=Profile::where('user_id','=',Auth::user()->id)
 ->orderBy('created_at','desc')
 ->first();
 //第2引数がfalseなら項目内の配列をリターン
 if($query->$item != null and $empty==false){
 //アンシリアライズして、配列データを返します。
 $data=unserialize($query->$item);
 return $data;
 //第2引数がtrueなら項目内の未入力配列をリターン
 }elseif($query->$item != null and $empty == true){
 //カテゴリIDの取得
 $cat=Category::where('name',$item)->first();
 //登録アイテムを取得
 $regist_item=Item::where('category_id',$cat->id)->lists('id','name');
 //登録済みアイテムを取得
 $my_item=unserialize($query->$item);
 //登録アイテムから登録済みアイテムを取り除く
 foreach($my_item as $key=>$value):
 if(array_key_exists($key,$my_item)){
 array_pull($regist_item,$key);
 }
 endforeach;
 return $regist_item;
 //項目内が未入力で、第2引数がtrueなら
 }elseif($query->$item == null and $empty == true){
 //カテゴリIDの取得
 $cat=DB::table('categories')->where('name','=',$item)->pluck('id');
 //登録アイテムを取得
 $regist_item=DB::table('items')->where('category_id','=',$cat)->lists('id','name');
 return $regist_item;
 }else{
 //項目がNULLなら
 return null;
 }
 }
}

次回予定

次回は、履歴テーブルの作成について考えてみたいと思います。

« »

コメントを残す

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