Web家計簿を、CakePHP3 Webサーバー環境構築で構築した環境にアップすることを目標に、複数回に分けてWeb家計簿を作って行きます。
============================
CakePHP3でWeb家計簿 記事一覧
③Security.saltの変更~DebugKitの非表示
⑦ユーザー登録機能の作成 ←現在の記事
============================
今回は、ユーザー登録機能の作成を行います。
ユーザー登録機能では、性別・誕生日・ユーザーイメージ画像・ページレイアウトイメージなどを、【usersテーブル】に登録します。
手順1.ユーザー登録ページの作成
作成したプロジェクト\src\Template\Users に『entry.ctp』を作成します。日本語でメッセージを出力するため、ファイルをUTF-8で保存します。
<?php
//ページタイトル変更
$this->assign('title', 'ユーザー登録 - オンライン家計簿');
?>
<!-- ページナビの生成 -->
<nav class="top-bar expanded" data-topbar role="navigation">
<ul class="title-area large-3 medium-4 columns">
<li class="name">
<h1><a href="/PROJECTNAME/users/top">オンライン家計簿 <?=$this->Html->image('imgchar.png',array('width'=>'20','height'=>'20')); ?></a></h1>
</li>
</ul>
<div class="top-bar-section">
<ul class="right">
<li><a href="/PROJECTNAME/users/login">ログイン</a></li>
</ul>
</div>
</nav>
<!-- ユーザー登録フォーム生成 -->
<div class="users form large-12 medium-12 columns content">
<?= $this->Form->create($user) ?>
<fieldset>
<h3>ユーザー登録</h3>
<?php
echo $this->Form->control('email',['label' => 'メールアドレス(認証用ID)']);
echo $this->Form->control('password',['label' => 'パスワード']);
echo $this->Form->control('username',['label' => 'ユーザー名(表示用)']);
?>
<!-- 性別ラジオボタンの作成 -->
<div class="input radio required">
<label>性別</label>
<input type="hidden" name="sex" value=""/>
<span>
<label for="sex-1">
<input type="radio" name="sex" value="1" id="sex-1">男性
</label>
<label for="sex-2">
<input type="radio" name="sex" value="2" checked="checked" id="sex-2">女性
</label>
</span>
</div>
<!-- 誕生日ドロップダウンリストの作成 -->
<?php
echo $this->Form->control('birthday',[
'label' => '誕生日',
'type' => 'date',
'dateFormat' => 'YMD',
'monthNames' => false,
'maxYear' => date('Y'),
'minYear' => date('Y') - 50,
'empty' => '---'
]);
echo $this->Form->control('postcode',['label' => '郵便番号']);
?>
<!-- ユーザーイメージ画像ラジオボタンの作成 -->
<div class="input radio required">
<label>ユーザーイメージ画像を選択</label>
<input type="hidden" name="userimg" value=""/>
<span>
<label for="userimg-1">
<input type="radio" name="userimg" value="1" checked="checked" id="userimg-1">
<?php echo $this->Html->image('userimg1.png',array('width'=>'30','height'=>'30')); ?>
</label>
<label for="userimg-2">
<input type="radio" name="userimg" value="2" id="userimg-2">
<?php echo $this->Html->image('userimg2.png',array('width'=>'30','height'=>'30')); ?>
</label>
<label for="userimg-3">
<input type="radio" name="userimg" value="3" id="userimg-3">
<?php echo $this->Html->image('userimg3.png',array('width'=>'30','height'=>'30')); ?>
</label>
</span>
</div>
<!-- ページレイアウトイメージラジオボタンの作成 -->
<div class="input radio required">
<label>ページレイアウトイメージを選択</label>
<input type="hidden" name="pageimg" value=""/>
<span>
<label for="pageimg-1">
<input type="radio" name="pageimg" value="1" checked="checked" id="pageimg-1">
<?php echo $this->Html->image('pageimg1.png',array('width'=>'30','height'=>'30')); ?> シンプルピンク
</label>
<label for="pageimg-2">
<input type="radio" name="pageimg" value="2" id="pageimg-2">
<?php echo $this->Html->image('pageimg2.png',array('width'=>'30','height'=>'30')); ?> シンプルブルー
</label>
<label for="pageimg-3">
<input type="radio" name="pageimg" value="3" id="pageimg-3">
<?php echo $this->Html->image('pageimg3.png',array('width'=>'30','height'=>'30')); ?> シンプルオレンジ
</label>
<label for="pageimg-4">
<input type="radio" name="pageimg" value="4" id="pageimg-4">
<?php echo $this->Html->image('pageimg4.png',array('width'=>'30','height'=>'30')); ?> シンプルグリーン
</label>
</span>
</div>
</fieldset>
<?= $this->Form->button(__('登録')) ?>
<?= $this->Form->end() ?>
</div>
手順2.ユーザー登録メソッドの作成
作成したプロジェクト\src\Controller にある『UsersController.php』を編集します。
class UsersController extends AppController
{
//ユーザー登録
public function entry()
{
//DB上書きフラグ
$save_flag = true;
//自動遷移先
$url = 'https://www.google.co.jp/';
//現在日付を取得
$now_year = date("Y");
$now_month = date("m");
$now_day = date("d");
//入力された誕生日が未来日付なら、自動遷移先に遷移する
if(isset($this->request->data['birthday'])){
$post_year = $this->request->data['birthday']['year'];
$post_month = $this->request->data['birthday']['month'];
$post_day = $this->request->data['birthday']['day'];
if($now_year == $post_year && $now_month < $post_month){
$this->Flash->error(__('未来日付は使用できません。'));
$save_flag = false;
$this->redirect($url);
}
if($now_year == $post_year && $now_month == $post_month && $now_day < $post_day){
$this->Flash->error(__('未来日付は使用できません。'));
$save_flag = false;
$this->redirect($url);
}
}
$user = $this->Users->newEntity();
//DB上書きフラグがtrueかつ、postリクエストがあったときユーザー登録処理をする
if ($save_flag == true && $this->request->is('post')) {
$user = $this->Users->patchEntity($user, $this->request->getData());
if ($this->Users->save($user)) {
$this->Flash->success(__('ユーザー登録しました。'));
return $this->redirect(['action' => 'login']);
}
$this->Flash->error(__('ユーザー登録出来ませんでした。'));
}
$this->set(compact('user'));
$this->set('_serialize', ['user']);
}
//他の処理・・・・・
}
次回記事では、トップページ表示機能の作成を行います。