FuelPHPで基本プロフィールの作成と表示

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

今日は、ユーザーのプロフィールを作成してみましょう。プロフィールの作成に関しては、1回で作成しようとも思ったのですが、思ったよりボリュームがありそうなので数回に分けて作成します。今日はその中の基本プロフィールを作成したいと思います。ちなみ、同じような表題が続くと分かりづらいので、主題と副題の順番を入れ替えました。

1. 基本プロフィールと言ってもこれといった形があるわけではありません。これは私が考えた形ですが、ユーザー管理をする上で、必ず必要となる情報、これを基本プロフィールとして登録し、後は、状況やユーザーに応じて追加作成すればいいのではないのかなと考えました。

2. それでは、プロフィール管理用にuserフォルダの中に新しくprofileコントローラを作成し、beforeアクション、indexアクションを作成します。

app/classes/controller/user/profile.php

<?php
class Controller_User_Profile extends Controller{

 /**********************************
 *
 * beforeアクション(アクセス制限)
 *
 **********************************/

 public function before(){
 parent::before();
 //ログインしていなければ
 if(!Auth::check()){
 //ログインページへ移動
 Response::redirect('user/login/index');
 }
 }

 /**************************
 *
 * トップページの表示
 *
 **************************/

 public function action_index(){
 //テーマの表示
 return Model_User::profile_theme('template','user/profile/index');
 }

2. 今回もモデルは作成しないで、Userモデルで代用します。只、テーマのレイアウトを多少変更しますので、Userモデルにプロフィール用のテーマを呼び出すメソッドを作成します。下記のコードを追加します。

app/classes/model/user.php

//プロフィール用のテーマ
 public static function profile_theme($template,$content){
 //テーマのインスタンス化
 $theme=\Theme::forge();
 //テーマにテンプレートのセット
 $theme->set_template($template);
 //テーマのテンプレートにタイトルをセット
 $theme->get_template()->set('title',Auth::get_screen_name().'さんのプロフィール');
 //テーマのテンプレートにビューとページデータをセット
 $theme->get_template()->set('content',$theme->view($content,Model_User::userdata()));
 //テーマのテンプレートにサイドバーをセット
 $theme->get_template()->set('sidebar',$theme->view('user/profile/sidebar'));
 return $theme;
 }

3.  今回はレイアウトにサイドバーを使用しますので、userフォルダにprofileフォルダを作成し、sidebar.phpを下記のように作成します。

app/views/user/pfofile/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>項目追加</td>
 </tr>
 <tr>
 <td>項目修正</td>
 </tr>
 <tr>
 <td>項目削除</td>
 </tr>
 </table>
 </div>

4. プロフィールページのトップページのビューファイルを下記のように記述します。

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="span3">項目名</th>
 <th class="span7">内容</th>
 </tr>
 </thead>
 <tbody>
 <?php foreach($users as $key=>$value):?>
 <tr>
 <th><?php echo $key;?></th>
 <td><?php echo $value;?></td>
 </tr>
 <?php endforeach;?>
 </tbody>
 </table>
 </div>

1行目のAuth::get_profile_fieldsメソッドは、現在ログイン中のユーザーのプロフィールフィールドを配列で返します。取得したプロフィールを11行目から16行目のforeachで表示しています。

5. 基本項目入力用のビューファイルを下記のように記述します。

app/views/user/profile/base.php 

<?php $profile=Auth::get_profile_fields();?>
 <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="address">住所</label>
 <div class="controls">
 <?php echo Form::input('address',Arr::get($profile,'住所',''));?>
 </div>
 </div>
 <div class="control-group">
 <label class="control-label" for="sex">性別</label>
 <div class="controls">
 <div class="span1">男性&nbsp;<?php echo Form::radio('sex','男性',Arr::get($profile,'性別')=='男性' ? array('checked'=>'checked'):'');?></div>
 <div class="span1">女性&nbsp;<?php echo Form::radio('sex','女性',Arr::get($profile,'性別')=='女性' ? array('checked'=>'checked'):'');?></div>
 </div>
 </div>
 <div class="control-group">
 <label class="control-label" for="birthday">生年月日</label>
 <div class="controls">
 <?php echo Form::input('birthday',Arr::get($profile,'生年月日',''));?>
 </div>
 </div>
 <?php echo Form::submit('submit','基本項目入力',array('class' => 'btn btn-primary btn-large span7'));?>
 <?php echo Form::close();?>
 </div><!--/span7 offset2-->

早速、前回『FuelPHPのARRクラス』で調べたgetメソッドを使っています。9行目のArr::get()メソッドは、第1引数の配列『$profile』から第2引数の値『住所』をキーとして値を取得しています。つまり既に値が入力されている場合はその値が表示されます。第3引数に『”』を指定しているので、もし見つからなかった場合空白が表示されます。

6. それでは、基本プロフィール入力用のbaseメソッドを下記のように作成します。

app/classes/controller/user/profile.php

/**************************
 *
 * 基本項目の入力
 *
 **************************/
public function action_base(){
 //POST送信なら
 if(Input::method() == 'POST'){
 //バリデーションの初期化
 $val = Validation::forge();
 //バリデーションフィールドの追加
 $val->add_field('address', '住所', 'required|max_length[255]');
 $val->add_field('sex', '性別', 'required');
 $val->add_field('birthday', '生年月日', 'required');
 //バリデーションOKなら
 if($val->run()){
 //ユーザーの特定
 $user=Auth::get_screen_name();
 //受信データの整理
 $value=array(
 '住所'=>Input::post('address'),
 '性別'=>Input::post('sex'),
 '生年月日'=>Input::post('birthday'),
 );
 //ユーザー情報の更新
 $auth=Auth::instance();
 $auth->update_user($value,$user);
 Response::redirect('user/profile/index/');
 }
 //バリデーションNGなら
 Session::set_flash('error', $val->show_errors());
 }
 //テーマの表示
 return Model_User::profile_theme('template','user/profile/base');
 }

18行目のAuthクラスのget_screen_nameメソッドで、ユーザーを特定します。27行目のupdate_userメソッドは、第1引数の配列の内容で第2引数指定のユーザーのprofile_fieldsを更新します。

7. それでは、早速データを入力してみましょう。

8. 入力したユーザーのプロフィールが表示されました。

9. このようにSimpleAuthのupdate_userメソッドやget_profileメソッドは、内部的にシリアライズ、アンシリアライズ処理をしますので、シリアライズ化されている配列の取り出しはとても簡単です。

10. 尚、再度基本項目入力のリンクをクリックすると、既存のデータがそのまま表示されますので、入力したデータの修正は簡単に行えます。

本日は以上です。

 

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

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

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

コメントをどうぞ

このページの先頭へ