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アクション)の作成』です。