CakePHP3でWeb家計簿 ⑦ユーザー登録機能の作成 | ゆきみのWeb開発帳

ゆきみのWeb開発帳

IT系のSEもどきが、個人の勉強の為に、CakePHP3やPython3などでの開発記録を綴ります。
勉強不足な面もありますが、日々成長中です。

Web家計簿を、で構築した環境にアップすることを目標に、複数回に分けてWeb家計簿を作って行きます。

 

============================

CakePHP3でWeb家計簿 記事一覧

①基本設計

②usersテーブルの作成~bakeコマンド

③Security.saltの変更~DebugKitの非表示

④routes.phpの設定~default.ctpの編集

⑤User.phpの編集

⑥ログイン・ログアウト機能の作成

⑦ユーザー登録機能の作成 ←現在の記事

⑧トップページ表示機能の作成

⑨マイページ(ユーザー情報閲覧)機能の作成

⑩ユーザー情報編集機能の作成

⑪年月日を日本的な表記へ変更

⑫ユーザー情報登録・編集時のバリデーション

⑬退会機能の作成

⑭パスワード再設定機能の作成

⑮favicon(ファビコン)の配置

⑯accountsテーブルの作成~bakeコマンド

⑰家計簿登録機能の作成

⑱家計簿一覧機能の作成

⑲家計簿編集機能の作成

⑳家計簿削除機能の作成

㉑家計簿登録・編集時のバリデーション

============================

 

 

今回は、ユーザー登録機能の作成を行います。

 

ユーザー登録機能では、性別・誕生日・ユーザーイメージ画像・ページレイアウトイメージなどを、【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']);
    }
    //他の処理・・・・・
}
    

 

次回記事では、トップページ表示機能の作成を行います。