FuelPHPでプロフィール項目の追加

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

今日は、前回の『基本プロフィールの作成と表示』の続きをやりたいと思います。前回は、基本的なプロフィール項目をあらかじめ決めておいて、プロフィール情報を登録しました。今回は、そのプロフィールに新たに項目を追加する方法を調べてみたいと思います。

1. まずサイドバーにリンクを作成します。下記のように修正します。

app/views/user/profile/sidebar.php

<div class="span2">
<table class="table table-bordered">
 <tr>
 <td><?php echo Html::anchor('user/index','TOPページへ');?></td>
 </tr>
 <tr>
 <td><?php echo Html::anchor('user/profile/base','基本項目入力');?></td>
 </tr>
 <tr>
 <td><?php echo Html::anchor('user/profile/create','項目追加');?></td>
 </tr>
 <tr>
 <td><?php echo Html::anchor('user/profile/update','項目修正');?></td>
 </tr>
 <tr>
 <td><?php echo Html::anchor('user/profile/delete','項目削除');?></td>
 </tr>
</table>
</div>

新規プロフィール項目の追加

2. 新規項目を追加するためのビューファイルを下記のように記述します。

app/views/user/profile/create.php

<div class="span7 hero-unit">
<h2 style="text-align:center"><?php echo Asset::img('winlogo.png');?></h2><br>
<?php echo Form::open(array('name'=>'create','method'=>'post','class'=>'form-horizontal')); ?>
<?php echo '<div class="alert-error"><p>'.Session::get_flash('error').'</p></div>'?>
<div class="control-group">
 <label class="control-label" for="key">新規項目名</label>
 <div class="controls">
 <?php echo Form::input('key',Input::post('key'));?>
 </div>
</div>
<div class="control-group">
 <label class="control-label" for="value">データ内容</label>
 <div class="controls">
 <?php echo Form::textarea('value',Input::post('value'),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-->

考え方としては、プロフィールの配列情報のキー(key)を新規項目名の値、配列情報の値をデータ内容(value)の値としてPOST送信します。

3. 新規プロフィール作成用のcreateアクションを下記のように記述します。

app/classes/controller/user/profile.php

/**************************
 *
 * 新規プロフィールの作成
 *
 **************************/

 public function action_create(){
 //POST送信なら
 if(Input::method()=='POST'){
 //受信データの整理
 $key=Input::post('key');
 $value=Input::post('value');
 //バリデーションの初期化
 $val=Validation::forge();
 //バリデーションフィールドの追加
 $val->add_field('key','新規項目名','required');
 $val->add_field('value','データ内容','required');
 //バリデーションOKなら
 if($val->run()){
 //新規プロフィールの配列の作成
 $new_profile=array($key=>$value);
 //ユーザー情報の追加
 $auth=Auth::instance();
 $auth->update_user($new_profile,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/create');
 }

受け取ったPOSTデータの’key’を連想配列のキー、’value’を連想配列の値として新規プロフィールの配列を作成し、24行目のSimpleAuthのupdate_userメソッドで、’profile_fields’の配列を更新しています。

4. それでは、実際にプロフィール項目を追加してみましょう。

5. 新しいプロフィールが追加されているのが確認できます。

6. 実際には、データベースにどのように保存されているかも見てみましょう。

 

プロフィールの修正

7. 次にプロフィールの修正方法を調べてみましょう。修正のためのビューファイルupdate.phpを下記のように記述します。

app/views/user/profile/update.php

<?php $profile=Auth::get_profile_fields();?>
<?php foreach($profile as $key=>$value):?>
<?php $data[$key]=$key;?>
<?php endforeach;?>
<div class="span7 hero-unit">
<h2 style="text-align:center"><?php echo Asset::img('winlogo.png');?></h2><br>
<?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>'?>
<div class="control-group">
 <label class="control-label" for="key">修正項目名</label>
 <div class="controls">
 <?php echo Form::select('key',null,$data);?>
 </div>
</div>
<div class="control-group">
 <label class="control-label" for="value">データ内容</label>
 <div class="controls">
 <?php echo Form::textarea('value',Input::post('value'),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 offset2-->

ポイントは、2~4行目です。12行目で第3引数に、普通に$profileを指定すると、プロフィールの値の一覧が表示されます。そこで、キーをキー、値もキーとする配列を構成し直します。こうすることにより、修正項目名に、既存のプロフィールの項目名の一覧が表示されます。まあ、こういう使い方は、滅多に無いとは思いますが。尚、ビューファイルにビジネスロジックを書くのに抵抗のある方は、モデル内に記述して下さい。

8.  プロフィール修正のためのupdateアクションを下記に記述します。基本的なところは、createメソッドとほとんど変わりません。

app/classes/controller/user/profile.php

/**************************
 *
 * プロフィールの修正
 *
 **************************/

 public function action_update(){
 //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()){
 //修正プロフィールの整理
 $update=array($key=>$value);
 //*ユーザー情報の追加
 $auth=Auth::instance();
 $auth->update_user($update,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/update');
 }

尚、このupdateアクションには、欠点があります。このままでは、選択したプロフィールの内容を全て更新してしまいます。部分的に(既存のデータを表示しながら)更新することが出来ません。次回、この辺を修正しながらプロフィールデータの修正及び削除方法について調べてみたいと思います。

本日は以上です。

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

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

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

コメントをどうぞ

このページの先頭へ