FuelPHPでプロフィール項目の修正と削除

FuelPHPで会員管理(アプリ編その7)

今日は、プロフィールの項目の修正と削除方法について調べてみたいと思います。前回のupdateアクションは、プロフィールの配列のキーを一覧表示して、その内容を修正してみました。今回はプロフィールのトップページから修正ページへ移動する方法をとってみたいと思います。

1. まず、プロフィールのトップページ(index.php)を下記のように修正します。sidebarの項目修正、項目削除のリンクも削除します。

app/views/user/profile/index.php

<?php $users=Auth::get_profile_fields();?>
 <div class="span10">
 <table class="table table-bordered table-striped">
 <thead>
 <tr>
 <th class="span2">項目名</th>
 <th class="span7">内容</th>
 <th class="span1">処理</th>
 </tr>
 </thead>
 <tbody>
 <?php foreach($users as $key=>$value):?>
 <tr>
 <th><?php echo $key;?></th>
 <td><?php echo $value;?></td>
 <td><?php echo Html::anchor('user/profile/edit/'.$key,'<i class="icon-pencil"></i>');?>
 &nbsp;<?php echo Html::anchor('user/profile/delete/'.$key,'<i class="icon-remove"></i>');?></td>
 </tr>
 <?php endforeach;?>
 </tbody>
 </table>
 </div>

普通に『修正』や『削除』文字によるリンクでも構わないのですが、せっかく、Twitter Bootstrapを使っているのですから、アイコンを使って見ました(^0^)。ユーザーアクティビリティ的には下の方が見いいかもしれません。

プロフィール項目の修正

2. プロフィーの内容の修正のためのビューファイルを下記のように作成します。

app/views/user/profile/edit.php

<?php $profile=Auth::get_profile_fields();?>
 <?php $key=Uri::segment(4);?>
 <div class="span7 hero-unit">
 <h1 style="text-align:center"><?php echo Asset::img('winlogo.png');?></h1><br>
 <h3 style="text-align:center">プロフィールを修正します。</h3>
 <?php echo Form::open(array('name'=>'pfofile','method'=>'post','class'=>'form-horizontal')); ?>
 <?php echo '<div class="alert-error"><p>'.Session::get_flash('error').'</p></div>'?>
 <?php echo Form::hidden('key',$key);?>
 <div class="control-group">
 <label class="control-label" for="value"><?php echo $key?></label>
 <div class="controls">
 <?php echo Form::textarea('value',Arr::get($profile,$key,''),array('row'=>5,'cols'=>30));?>
 </div>
 </div>
 <?php echo Form::submit('submit','プロフィール修正',array('class' => 'btn btn-primary btn-large span7'));?>
 <?php echo Form::close();?>
 </div><!--/span7-->

12行目のtextareaのデフォルト値は、Arrクラスのgetメソッドで、Authクラスのget_profile_fieldsメソッドで取得した配列のキーとUriクラスのsegmentメソッドの4番目の文字が一致する配列の値を導き出して、表示しています。

3. プロフィール編集のためのeditアクションを下記のように記述します。

app/classes/controller/user/profile.php

/**************************
 *
 * プロフィールの編集
 *
 **************************/

 public function action_edit(){
 //POST送信なら
 if(Input::method()=='POST'){
 //受信データの整理
 $key=Input::post('key');
 $value=Input::post('value');
 //バリデーションの初期化
 $val=Validation::forge();
 //バリデーションフィールドの追加
 $val->add_field('value','データ内容','required');
 //バリデーションOKなら
 if($val->run()){
 //修正プロフィールの整理
 $edit=array($key=>$value);
 //Authのインスタンス化
 $auth=Auth::instance();
 //ユーザー情報の更新
 $auth->update_user($edit,Auth::get_screen_name());
 Response::redirect('user/profile/index');
 }
 //バリデーションNGなら
 Session::set_flash('error',$val->show_errors());
 }
 //テーマの表示
 return Model_User::profile_theme('template','user/profile/edit');
 }

プロフィール項目の削除

4. プロフィールの修正や追加はSimpleAuthのupdate_userメソッドを使えば簡単にできますが、プロフィール項目の削除は若干趣が違います。update_userメソッドでは、配列内の項目の追加は出来ますが、配列内の項目の削除は出来ません。

5. そこで、プロフィールの項目を削除する場合は、既存の配列を新しい配列(項目を削除した配列)で上書きする方法が必要になってきます。それでは、まず下記にdeleteビューファイルを記述します。

app/views/user/profile/delete.php

<?php $auth=Auth::get_profile_fields();?>
 <?php $profile=Uri::segment(4);?>
 <?php $key=Arr::get($auth,$profile);?>
 <div class="span7 hero-unit">
 <h1 style="text-align:center"><?php echo Asset::img('winlogo.png');?></h1><br>
 <h3 style="text-align:center">項目名『<?php echo $profile?>』を削除します。<br>よろしいですか?</h3>
 <?php echo Form::open(array('name'=>'pfofile','method'=>'post','class'=>'form-horizontal')); ?>
 <?php echo '<div class="alert-error"><p>'.Session::get_flash('error').'</p></div>'?>
 <?php echo Form::hidden('key',$profile);?>
 <?php echo Form::submit('submit','項目削除',array('class' => 'btn btn-danger btn-large span7'));?>
 <?php echo Form::close();?>
 </div><!--/span7-->

6. deleteアクションを下記に記述します。

app/classes/controller/user/profile.php

/**************************
 *
 * プロフィール項目の削除
 *
 **************************/

 public function action_delete(){
 //POST送信なら
 if(Input::method()=='POST'){
 //受信データの整理
 $key=Input::post('key');
 //Authのインスタンス化
 $auth=Auth::instance();
 //ユーザーの特定
 $user=Model_User::find('first',array(
 'where'=>array('email'=>$auth->get_email())));
 //ユーザープロフィールの取得
 $profile=$auth->get_profile_fields();
 //プロフィールから受信データをキーとする配列を削除
 Arr::delete($profile,$key);
 //profile_fieldsにシリアライズした新しい$profileを渡す
 $user->profile_fields=serialize($profile);
 //データベースを保存
 $user->save();
 Response::redirect('user/profile/index');
 }
 //テーマの表示
 return Model_User::profile_theme('template','user/profile/delete');
 }

20行目のArr::deleteメソッドで、第1引数の$profile配列から第2引数の$keyをキーとする配列を削除します。22行目で、profile_fieldsにシリアライズした新しいプロフィールを渡し、24行目で保存しています。Simpleauthのupdate_userメソッドで、Arr::deleteメソッドで削除したデータを渡しても、既存の配列項目は削除されませんので、このようにデータベーステーブルに直接上書き処理をしています。

7. これで、プロフィールから指定の項目を削除できるようになりました。

8. 今回までは、ユーザー自身でプロフィールを作成するプログラムでしたが、次回からはAdminによる各ユーザーのプロフィールの作成・修正・削除を調べてみたいと思います。

9. SimpleAuthのメソッドはほとんどログイン中のユーザーの処理をするメソッドで、他のユーザーの処理をするメソッドは(reset_passwordやdelete_userメソッドぐらいで)ほとんどありません。その辺のことを考慮しながら調べてみたいと思います。

本日は以上です。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ