FuelPHP

FuelPHPでメッセージアプリ(その3)

更新日:

Createアクションの作成

前回の『Messageアプリのモデル作成』は、Messageアプリの基本的な部分、リレーションの設定、テーマクラス呼び出し用のメソッド、ページネーションの作成、検索用のメソッドの作成を行いました。本日から実際に動かすために、コントローラとビューファイルを作成していきたいと思います。

Messageコントローラの作成

1. まず、最初に、Messageコントローラの基本的な部分を作成します。

app/classes/controller/message.php

<?php
class Controller_Message extends Controller{

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

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

 /*********************************
 * トップページ
 *********************************/
 public function action_index(){
 //POST送信なら
 if(Input::method()=='POST' && Input::post('search')!=null){
 $search=Input::post('search');
 //検索受信メッセージの取得
 $data['messages']=Model_Message::search($search);
 }else{
 $data['messages']=Model_Message::pagedata(10);
 }
 //テーマの表示
 return Model_Message::theme('message/index',$data);
 }

まず、Messageアプリは会員専用サイトの中で使用しますので、アクセス制限をかけます。次に、前回言ったように、message/indexページには検索用の窓を作成しますので、POST送信の中身がnull値で無ければ、受け取ったPOSTデータを元に、Model_Messageのsearchメソッドで、検索データを取得して、テーマの$dataに渡します。それ以外の場合は、pagedataメソッドで取得したデータをテーマクラスに渡します。

2. createアクション(グループ宛メッセージの作成)を下記のように作成します。

app/classes/controller/message.php

/*********************************
 * グループメッセージ新規作成
 *********************************/
 public function action_create(){
 //POST送信なら
 if(Input::method()=='POST'){
 //バリデーションの初期化
 $val=Validation::forge();
 //バリデーションフィールドの追加
 $val->add_field('title','タイトル','required');
 $val->add_field('body','内容','required');
 //バリデーションOKなら
 if($val->run()){
 //発信者IDの特定
 $contributor=Model_User::login()->id;
 //データの整理
 $data=array(
 'title'=>Input::post('title'),
 'body'=>Input::post('body'),
 'contributor'=>$contributor, //発信者ID
 'group'=>Input::post('group'), //受信者グループ
 );
 //モデルのインスタンス化
 $message=Model_Message::forge($data);
 //メッセージの保存
 $message->save();
 //全受信ユーザーの抽出
 $users=Model_User::find()
 ->where('group','>=',Input::post('group'))
 ->get();
 //未読メッセージの整理
 foreach($users as $user):
 //旧未読メッセージを配列に変換(アンシリアライズ処理)
 $unread=unserialize($user->unread);
 //新規メッセージを配列に変換
 $info=$message->title." (".$message->cont->username;
 $info.=":".date('Y/m/d H:i',$message->created_at).")";
 $new=array($message->id=>$info);
 //旧未読メッセージに新規メッセージをセット
 Arr::set($unread,$new);
 //シリアライズして保存
 $user->unread=serialize($unread);
 $user->save();
 endforeach;
//メッセージのトップページへ移動
 Response::redirect('message/index');
 }
 //バリデーションNGなら
 Session::set_flash('error',$val->show_errors());
 }
 //グループデータの取得
 $data['groups']=Model_Message::config_groups();
 //テーマの表示
 return Model_Message::theme('message/create',$data);
 }
  •  13行目までは特に問題は無いと思います。
  • 14行目から26行目は、POSTで受け取ったデータを元に新規メッセージを作成しています。
  • 27行目から44行目までは、usersテーブルのunreadフィールドに、POSTで受け取ったデータを元にデータの配列を作成し、シリアライズして保存しています。
  • 52行目は、config_groupsというメソッドからデータを取得しています。このメソッドは、下記に記述しておきます。

3. モデルにconfig_groupsというメソッドを追加します。

app/classes/model/message.php

/***********************************
 * Configデータの取得
 ***********************************/
 public static function config_groups(){
 //config/simpleauthのgroups配列を取得
 $config=Config::get('simpleauth.groups');
 //取得配列の再構成
 foreach($config as $key=>$row):
 $groups[$key]=$row['name'];
 endforeach;
 //一般ユーザー以下及びAdminを削除
 Arr::delete($groups,array(-1,0,100));
 //配列$groupsを返す
 return $groups;
 }

4. PC用のビューファイルを下記のように作成します。レイアウトはTwitter Bootstrapのレスポンシブデザインを使用していますが、PC用のビューファイルはあまりレイアウトにこだわっていませんので、皆さんで作成した方がいいと思います。

app/views/message/create.php

<div>
<div>
<h2 style="text-align:center"><?php echo Auth::get_screen_name();?>さん、新規メッセージを作成して下さい。</h2><br>
<?php echo Form::open(array('name'=>'create','method'=>'post','class'=>'form-horizontal')); ?>
<?php echo '<div>'.Session::get_flash('error').'</div>'?>
<div>
<label for="group">送信先グループ</label>
<div>
<?php echo Form::select('group',1,array('group'=>$groups));?>
</div>
</div>
<div>
 <label for="title">タイトル</label>
 <div>
 <?php echo Form::input('title',Input::post('title'));?>
 </div>
</div>
<div>
<label for="body">内容</label>
<div>
<?php echo Form::textarea('body',Input::post('body'));?>
</div>
</div>
<?php echo Form::submit('submit','新規メッセージ作成',array('class' => 'btn btn-primary btn-large span7'));?>
<?php echo Form::close();?>
</div><!--/span7 offset2-->
</div><!--/row-->

5. スマートフォン用(jQueryMobile)のビューファイルを下記のように作成します。

app/themes/mobile/message/create.php

<div data-role="page" id="page1" data-theme="e">
<div data-role="header" data-theme="b">
<h1>グループメッセージ作成</h1>
<?php echo Html::anchor('/','ホーム',array('rel'=>'external','data-icon'=>'home','data-iconpos'=>'notext','class'=>'ui-btn-left'));?>
<?php echo Html::anchor('#menu','menu',array('data-rel'=>'dialog','data-icon'=>'info','class'=>'ui-btn-right'));?>
</div><!--/header-->
<nav data-role="navbar">
<ul>
<li><?=Html::anchor('message/','メッセージ一覧',array('data-theme'=>'c'))?></li>
<li><?=Html::anchor('message/person','個人メッセージ作成',array('data-theme'=>'c'))?></li>
</ul>
</nav>
<div data-role="content">
<?php echo Form::open(array('name'=>'create','method'=>'post')); ?>
<?php echo '<div>'.Session::get_flash('error').'</div>'?>
<div>
 <label for="title">タイトル</label>
 <div>
 <?php echo Form::input('title',Input::post('title'));?>
 </div>
</div>
<div>
<label for="body">内容</label>
<div>
<?php echo Form::textarea('body',Input::post('body'));?>
</div>
</div>
<div>
<label for="group">送信先グループ</label>
<div>
<?php echo Form::select('group',1,array('group'=>$groups),array('data-theme'=>'e'));?>
</div>
</div>
<?php echo Form::submit('submit','新規メッセージ作成');?>
<?php echo Form::close();?>
</div><!--/content-->
<div data-role="footer" data-theme="b" style="text-align:center">
themes/mobile/message/create
</div><!--/footer-->
</div><!--/page-->

6. どのように表示されているかブラウザで確認してみます。

現状、送信先グループは、config/simpleauthの表示名が使用されていますが、実際に運用するときには、社員に分かり易い名前(部署名等)にconfig/simpleauthの表示名を変更する予定です。

7. それでは、実際にデータを登録して、welcome/indexページを見てみます。左のPC用ブラウザは、未読メッセージがある人用の表示です。右のスマートフォン用のメッセージは未読メッセージが無い人の表示です。メッセージの文面をクリックすると明細ページへ移動して、次に、トップページへ移動したときに、クリックしたリンクが表示されないように作成します。明細ページは次回作成します。

本日は以上です。

次回は、『明細ページ(detailアクション)の作成』です。

-FuelPHP
-

Copyright© WinRoad徒然草 , 2018 All Rights Reserved Powered by AFFINGER5.