PHP:『パーフェクトPHP』のフレームワークでシステム開発する ~ 『ケーキ管理』その2 ~

PHP

『ケーキ管理』というケーキの販売管理システムを開発していく

前回の記事では、ユーザ管理機能まで作成が終わりました。今回はその続きとなります。

この記事のプログラムで完成するもの

このページの内容で、完成したものはこちらになります。
前回の記事で作成した『ユーザ管理機能』とドッキングしました。
ログイン画面から、
ユーザ:admin
パスワード:admin
で、システム管理者としてログインできます。
また、
ユーザ:haichoru
パスワード:haichoru
で、一般ユーザとしてのログインです。
メニューの内容と数が変化します。

ログインの機能を作成

LoginController.phpの作成

cake-manager/controllersフォルダの中に、LoginController.phpと名前をつけ、新規でファイルを作成します。
ファイルの中に下記のコードを記入し、文字コードUTF-8で保存します。

<?php

/**
 * LoginController.
 *
 * @author haichoru(ハイチョル)
 */
class LoginController extends Controller
{
    protected $auth_actions = array();

    private const SENDER_TOKEN = "********";

    private $user_name = "";
    private $password = "";
    private $user_name_error = "";
    private $password_error = "";

    private function getSqlData()
    {
        return array(
            'user_name' => $this->user_name,
            'password'  => $this->password,
        );
    }

    private function getViewData()
    {
        return array_merge($this->getSqlData(), array(
            '_token' => $this->generateCsrfToken(self::SENDER_TOKEN),
            'user_name_error' => $this->user_name_error,
            'password_error'  => $this->password_error,
        ));
    }

    public function setPostData()
    {
        $this->user_name = $this->request->getPost('user_name');
        $this->password = $this->request->getPost('password');
    }

    public function validateInputData($id = null)
    {
        if (!strlen($this->user_name)) $this->user_name_error = "入力がありません";
        if (!strlen($this->user_name_error) && !preg_match('/\A[0-9a-zA-Z]{4,20}\z/', $this->user_name)) $this->user_name_error = "入力が不正です";

        if (!strlen($this->password)) $this->password_error = "入力がありません";
        if (!strlen($this->password_error) && !preg_match('/\A[0-9a-zA-Z]{4,20}\z/', $this->password)) $this->password_error = "入力が不正です";

        if (!strlen($this->user_name_error) && !strlen($this->password_error)) {

            return true;
        }

        return false;
    }

    public function senderAction()
    {
        $this->session->clear();
        $this->session->setAuthenticated(false);

        return $this->render($this->getViewData());
    }

    public function recieverAction()
    {
        if (!$this->request->isPost()) {
            $this->forward404();
        }

        $token = $this->request->getPost('_token');
        if (!$this->checkCsrfToken(self::SENDER_TOKEN, $token)) {
            $this->forward404();
        }

        $this->setPostData();

        if ($this->validateInputData()) {

            $user = $this->db_manager->get('Login')->fetchUser($this->getSqlData());

            if (!(!$user)) {

                $this->session->setAuthenticated(true);
                $this->session->set('user', $user);

                return $this->redirect('/menu/index');

            } else {

                $this->password_error = "パスワードが違います";
            }
        }

        return $this->render($this->getViewData(), 'sender');
    }
}

********はデータ通信のパスワードになりますので、書き換えてください。

sender.phpの作成

cake-manager/viewsフォルダの中に、loginフォルダを作成します。
cake-manager/views/loginフォルダの中に、sender.phpと名前をつけ、新規でファイルを作成します。
ファイルの中に下記のコードを記入し、文字コードUTF-8で保存します。

<?php $this->setLayoutVar('title', "Login"); ?>

<div class="row">

    <div class="col-sm-offset-3 col-sm-6">

        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title"><span class="glyphicon glyphicon-tasks" aria-hidden="true"></span> ログイン<br><small>Login</small></h3>
            </div><!-- panel-heading -->
            <div class="panel-body">

                <form onsubmit="return false;" class="form-horizontal" method="post" action="<?php echo $base_url; ?>/login/reciever">
                    <input type="hidden" name="_token" value="<?php echo $this->escape($_token); ?>" />

                    <div class="form-group form-group-sm<?php if (strlen($user_name_error) > 0) echo ' has-error'; ?>">
                        <label class="control-label col-sm-4" for="user_name">ユーザ:</label>
                        <div class="col-sm-8">
                            <input type="text" class="form-control" name="user_name" id="user_name" value="<?php echo $this->escape($user_name); ?>" placeholder="半角英数字4文字以上20文字以内" autocomplete="off" />
                            <p class="help-block"><?php if (strlen($user_name_error) > 0) echo "<span class=\"glyphicon glyphicon-alert\" aria-hidden=\"true\"></span> {$this->escape($user_name_error)}"; ?></p>
                        </div>
                    </div>

                    <div class="form-group form-group-sm<?php if (strlen($password_error) > 0) echo ' has-error'; ?>">
                        <label class="control-label col-sm-4" for="password">パスワード:</label>
                        <div class="col-sm-8">
                            <input type="password" class="form-control" name="password" id="password" value="<?php echo $this->escape($password); ?>" placeholder="半角英数字4文字以上20文字以内" autocomplete="off" />
                            <p class="help-block"><?php if (strlen($password_error) > 0) echo "<span class=\"glyphicon glyphicon-alert\" aria-hidden=\"true\"></span> {$this->escape($password_error)}"; ?></p>
                        </div>
                    </div>

                    <div class="form-group">
                        <div class="col-sm-offset-4 col-sm-8">
                            <button type="button" class="btn btn-primary btn-sm">
                                <span class="glyphicon glyphicon-log-in" aria-hidden="true"></span> ログイン
                            </button>
                        </div>
                    </div>

                </form>

            </div><!-- panel-body -->
        </div><!-- panel -->

    </div><!-- col -->

</div><!-- row -->

LoginRepository.phpの作成

cake-manager/modelsフォルダの中のLoginRepository.phpを書き換え。
ファイルの中に下記のコードを記入し、文字コードUTF-8で保存します。

<?php

/**
 * LoginRepository.
 *
 * @author haichoru(ハイチョル)
 */
class LoginRepository extends DbRepository
{
    public function fetchUser($data)
    {
        $sql = "
            SELECT id, user_name, is_manager
            FROM user
            WHERE
                delete_date IS NULL
                AND user_name = :user_name
                AND password = :password
        ";

        return $this->fetch($sql, array(
            ':user_name' => $data['user_name'],
            ':password'  => $data['password'],
        ));
    }
}

CakeManagerApplication.phpの編集

10行目の配列を下記に修正します。

protected $login_action = array('Login', 'sender');

17行目からの関数を下記に修正します。

protected function registerRoutes()
{
    return array(
        '/'
            => array('controller' => 'Login', 'action' => 'sender',),
        '/login/:action'
            => array('controller' => 'Login',),
        '/menu/:action'
            => array('controller' => 'Menu',),

        '/user/insert'
            => array('controller' => 'User', 'action' => 'insert',),
        '/user/insert-register'
            => array('controller' => 'User', 'action' => 'insertRegister',),
        '/user/update'
            => array('controller' => 'User', 'action' => 'update',),
        '/user/update-register'
            => array('controller' => 'User', 'action' => 'updateRegister',),
        '/user/delete'
            => array('controller' => 'User', 'action' => 'delete',),
        '/user/delete-register'
            => array('controller' => 'User', 'action' => 'deleteRegister',),
    );
}

すぐあとから作成します、メニュー機能もついでに登録しています。

メニューの機能を作成

MenuController.phpの作成

cake-manager/controllersフォルダの中に、MenuController.phpと名前をつけ、新規でファイルを作成します。
ファイルの中に下記のコードを記入し、文字コードUTF-8で保存します。

<?php

/**
 * MenuController.
 *
 * @author haichoru(ハイチョル)
 */
class MenuController extends Controller
{
    protected $auth_actions = true;

    public function indexAction()
    {
        $user = $this->session->get('user');

        return $this->render(array('is_manager' => $user['is_manager'],));
    }
}

sender.phpの作成

cake-manager/viewsフォルダの中に、menuフォルダを作成します。
cake-manager/views/menuフォルダの中に、index.phpと名前をつけ、新規でファイルを作成します。
ファイルの中に下記のコードを記入し、文字コードUTF-8で保存します。

<?php $this->setLayoutVar('title', 'Menu'); ?>

<div class="row">

    <div class="col-sm-12">

        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title"><span class="glyphicon glyphicon-tasks" aria-hidden="true"></span> ご注意ください<br><small>Warning</small></h3>
            </div><!-- panel-heading -->
            <div class="panel-body">

                <p>すべての入力において、禁則文字の入力は禁止されます。禁則文字とは半角の下記の文字をさします。</p>

                <p>
                    半角スペース・タブ・改行・リターン・改ページ・
                    カンマ<code>&#044;</code>・二重引用符<code>&#034;</code>・アポストロフィ<code>&#039;</code>・アクセント記号<code>&#096;</code>・番号記号<code>&#035;</code>・
                    パーセント記号<code>&#037;</code>・不等号(より大)<code>&#062;</code>・不等号(より小)<code>&#060;</code>・感嘆符<code>&#033;</code>・ピリオド<code>&#046;</code>・
                    角かっこ<code>&#091;&#093;</code>・アスタリスク<code>&#042;</code>・ドル記号<code>&#036;</code>・セミコロン<code>&#059;</code>・コロン<code>&#058;</code>・
                    疑問符<code>&#063;</code>・キャレット<code>&#094;</code>・中かっこ<code>&#040;&#041;</code>・正符号<code>&#043;</code>・バックスラッシュ(円記号)<code>&#092;</code>
                </p>

            </div><!-- panel-body -->
        </div><!-- panel -->

    </div><!-- col -->

</div><!-- row -->

<?php if ($is_manager === "1"): ?>

    <div class="row">

        <div class="col-sm-6">

            <div class="panel panel-default">
                <div class="panel-heading">
                    <a href="<?php echo $base_url; ?>/user/insert">
                        <h3 class="panel-title"><span class="glyphicon glyphicon-link" aria-hidden="true"></span> ユーザ管理<br><small>User</small></h3>
                    </a>
                </div>
                <div class="panel-body">

                    <p>ユーザの管理ができます。</p>

                </div><!-- panel-body -->

                <a href="<?php echo $base_url; ?>/user/insert">
                    <div class="panel-footer text-right">
                        <span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span> 処理を行う
                    </div>
                </a>
            </div><!-- panel -->

        </div><!-- col -->

    </div><!-- row -->

<?php endif; ?>

これで、ログインとメニューの機能の完成になります。
お疲れさまでした。

次回は、お客様の情報を登録する機能の作成になります。

コメント