続:掲示板を作ろう その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();
        }