続:掲示板を作ろう その7
今回もセッション管理の為にコントローラとビューをいじっていきます
ビュー login.php を作成
application/views/
<?php $user_id = array( 'name' => 'user_id', 'value' => set_value('user_id'), 'size' => 25 ); $password = array( 'name' => 'password', 'value' => set_value('password'), 'size' => '25', ); $submit = array( 'name' => 'submit', 'value' => 'ログイン' ); ?> <div class="top_form"> <?php echo form_error('user_id'); ?> <?php echo form_error('password'); ?> <?php echo $login_error['error_message']; ?> <?php echo form_open('board'); ?> <p>ユーザID:<?php echo form_input($user_id); ?></p> <p>パスワード:<?php echo form_password($password); ?></p> <?php echo form_submit($submit) ?> <?php echo form_close(); ?>
ビューの内容はこれと言って新しいところはないはず。
ユーザーID、パスワード、送信ボタンを連想配列にして form_ に渡してます。
コントローラ board.php を修正
ここはだいぶ修正。
まず、ログインもするならログアウトもするよね。ってことで、両方使うライブラリ、ヘルパーなどをコンストラクタに移す。その上で、肝心のセッション。
参照:セッションクラス : CodeIgniter ユーザガイド 日本語版
セッションは通常、各ページの読込みに対してグローバルに動作します。ですので、セッションクラスは、 コントローラ のコンストラクタで 初期化 されるか、あるいは、システムで 自動読込み されるか、どちらかが必要になります。 単にクラスを初期化することが、セッションを読み込み、作成し、更新することになるので、大部分で、 セッションクラスはバックグラウンドで勝手に動作します。
とのこと。使うのは、
$this->load->library('session');
その上でのコンストラクタ
public function __construct() { parent::__construct(); $this->load->library('session'); $this->load->helper(array('form', 'url')); $this->load->library('form_validation'); $this->load->database(); $this->load->model('boardmodel'); }
ライブラリ | セッション & フォームバリデーション |
---|---|
ヘルパー | フォーム & URL |
クラス | データベースクラス |
モデル | boradmodel |
を読み込み
ログインしている、していない状態を管理
まずはログインしているか、していないかの分岐
// ログインしている if($this->session->userdata(’logged_in’) === TRUE) { // 処理 // ログインしていない } else { // 処理 }
- if($this->session->userdata('logged_in') === TRUE)
- これは ここ での $newdata に連想配列で渡した logged_in の値
これが TRUE の時はログイン状態を示して、それ以外はログイン状態でないと。
ログイン時の処理は今までやってきた事のままなので割愛。
ログイン状態でないときの管理
ここがややこしかった。
-
チェックすること
- フォームバリデーション
- フォームバリデーションが正しいとき、ユーザーIDとパスワードは正しいか
- フォームバリデーション
// フォームに空欄があった時など if ($this->form_validation->run('login') === FALSE) { // 処理 } // フォームがちゃんと記入されてる時など else { // 処理 }
ここで、form_validation のルール設定のお話。
今までは、コントローラにバリデーションルールを設定してたと思う。 こことか
でも邪魔になってきたので、違うところでルール設定。
参照:フォームバリデーション(検証) : CodeIgniter ユーザガイド 日本語版
検証ルールを保存するには、単純に、 form_validation.php というファイルを application/config/ フォルダ内に作成します。 このファイル内では、検証ルールは $config という名前の配列を格納してください。
ということなので、
application/config/form_validation.php
<?php $config = array( 'login' => array( array( 'field' => 'user_id', 'label' => 'ユーザーID', 'rules' => 'trim|required|alpha_numeric' ), array( 'field' => 'password', 'label' => 'パスワード', 'rules' => 'trim|required' ) ) );
login という配列要素に、連想配列で field, label, rules それぞれの値を設定して、それを $config に入れると。多次元配列かつ連想配列・・・混乱の極みですな。
これで、フォームバリデーションでのチェックはOK。
- ユーザーIDとパスワードは正しいか
モデルで入力されたユーザーIDとパスワードのチェックをしてくれるので、まずは loginout.php を呼び出し。
んで、loginout.php の中で 説明忘れてたけどこんなん書いてたりらじばんだり。
$data = array( 'error_message' => 'ユーザIDかパスワードが間違っています' ); return $data;
ユーザーIDとパスワードが間違ってた時は、連想配列で error_message に「ユーザIDかパスワードが間違ってます」と入れて、コントローラに渡すと。
$this->load->model('loginout'); $login_error = $this->loginout->login(); if(isset($login_error)) { $data['login_error'] = $this->loginout->login(); $this->load->view('login', $data); } else { redirect('board'); }
モデル loginout を呼び出し、さらにその中の login() を呼び出し。
$login_error にその値を入れとくと。
ユーザーID & パスワードが合ってたとき | $login_errorの値は空 |
ユーザーID & パスワードが間違ってた時 | $login_errorの値は空ではない |
こんな感じで、ID、パスワードの一致不一致を管理するようにしてみた。
これで一応、動いてくれたのでOKかな!
<?php class Board extends CI_Controller { public function __construct() { parent::__construct(); $this->load->library('session'); $this->load->helper(array('form', 'url')); $this->load->library('form_validation'); $this->load->database(); $this->load->model('boardmodel'); } public function index() { $data['comment'] = $this->boardmodel->comments(); $this->load->view('templates/header'); // ログイン時 if($this->session->userdata('logged_in') === TRUE) { if ($this->form_validation->run('comments') === FALSE) { $this->load->view('form'); } else { $this->boardmodel->insert(); redirect('board'); } // 非ログイン時 } else { if ($this->form_validation->run('login') === FALSE) { $data['login_error'] = array( 'error_message' => '' ); $this->load->view('login', $data); } else { $this->load->model('loginout'); $login_error = $this->loginout->login(); if(isset($login_error)) { $data['login_error'] = $this->loginout->login(); $this->load->view('login', $data); } else { redirect('board'); } } } $this->load->view('comment', $data); $this->load->view('templates/footer'); $this->db->close(); }