『ケーキ管理』というケーキの販売管理システムを開発していく
前回の記事では、ユーザ管理機能まで作成が終わりました。今回はその続きとなります。
この記事のプログラムで完成するもの
このページの内容で、完成したものはこちらになります。
前回の記事で作成した『ユーザ管理機能』とドッキングしました。
ログイン画面から、
ユーザ: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" onclick="submit();">
<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>,</code>・二重引用符<code>"</code>・アポストロフィ<code>'</code>・アクセント記号<code>`</code>・番号記号<code>#</code>・
パーセント記号<code>%</code>・不等号(より大)<code>></code>・不等号(より小)<code><</code>・感嘆符<code>!</code>・ピリオド<code>.</code>・
角かっこ<code>[]</code>・アスタリスク<code>*</code>・ドル記号<code>$</code>・セミコロン<code>;</code>・コロン<code>:</code>・
疑問符<code>?</code>・キャレット<code>^</code>・中かっこ<code>()</code>・正符号<code>+</code>・バックスラッシュ(円記号)<code>\</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; ?>
これで、ログインとメニューの機能の完成になります。
お疲れさまでした。
次回は、お客様の情報を登録する機能の作成になります。
コメント