2024年 新入社員ブログ 高田03 [jQuery UI カレンダー機能実装]

こんにちは、2024年4月に入社した高田です。
7月から社内研修で、
・フレームワークを使用しない会員登録フォーム
・フレームワーク(Laravel)を使用した会員登録フォーム
の実装を行ってきました。
どちらの会員登録フォームも会員登録時の入力項目は同じですが、
フレームワークを使用しない会員登録フォームでは、生年月日をinput要素のtype=”date”入力型で実装し、Laravelを使用した会員登録フォームでは、デザイン性・カスタマイズ性を重視しjQuery UIのカレンダーで実装しました。

2つの方法で生年月日のフォームを実装してみて、
jQuery UIを使用したカレンダーは、input要素のtype=”date”入力型のカレンダーと比べ、
・高度なカスタマイズ性
・ローカライズ対応
といった点で優れていると感じました。

特にカレンダーの表示に関するオプションは豊富で、細かな設定ができると知っておくだけでも設計・実装の幅が広がると感じました。
そこで今回は、jQuery UIを使用したカレンダーの導入方法と実装方法について紹介したいと思います。
私が実際に作成したものがこちらになります。

画像1 生年月日選択中カレンダー表示

画像2 生年月日選択後

年月日のテキストボックスを選択するとカレンダーが表示されます(画像1)。
カレンダー上の日付を押下するとテキストボックスに年月日が入ります(画像2)。
カレンダーは記事作成日時である今日(2024/12/06)までの日付が選択できるようになっています。

[実装方法]

1. jQuery UIをダウンロード

jQuery UIを使用するためには、jQuery UIとそれに依存するjQuery自体を利用可能な状態にする必要があります。jQueryとjQuery UIには、CDN形式とダウンロード形式の2種類の利用方法があります。
CDN形式は、提供元のサーバーからライブラリを直接読み込む方法で、設定が簡単というメリットがあります。ただし、提供元のサービスが停止した場合に影響を受けるリスクがあります。
ダウンロード形式は、ライブラリをローカル環境に保存して利用する方法で、外部サービスに依存せず安定して利用できるという安心感があります。
今回は安定性を重視し、ダウンロード形式を選びました。

実際に公式サイトよりjQueryjQuery UIそれぞれダウンロードしました。

必要なファイルをフォルダに配置し、それらを読み込む設定を行います。LaravelのBladeテンプレートでは、ファイルのパスを指定する際にasset関数を使用します。Laravelのasset関数は、アプリケーションのpublicディレクトリを基準としたパスを生成するため、プロジェクト内でのファイル管理が簡単になります。以下のように配置しました。

これで、jQuery 、jQuery UIを使用する準備が完了しました。

参考: 【初心者向け】jQueryはじめの一歩 #JavaScript – Qiita

2. inputタグへの設定

ダウンロードが完了後、jQuery UIの日本語リファレンス(Datepicker | jQuery UI 1.10 日本語リファレンス | js STUDIO)を参考にしながら、「年・月メニュー表示」のカレンダーを実装していきます。リファレンスの「年・月メニュー表示」のソースコードは以下のようになっています。

HTMLでは、<input>タグにid=”datepicker”が指定されており、このidを基にjQuery UIのdatepicker機能を適用してカレンダーを表示します。jQueryでは、指定したidを用いて要素を選択し、その要素に対してdatepickerメソッドを適用することで、簡単にカレンダー機能を追加できます。また、オプションを設定することで、月や年を選択できるプルダウンメニューを表示し、カレンダーの挙動を柔軟にカスタマイズすることが可能です。なお、idは任意の値に変更でき、<script>タグ部分はそのまま利用することで簡単にカレンダーを作成することができます。以下に実際のコード例を示します。

この状態で画面を見ると、以下の画像のように年と月をドロップダウンで選択できるカレンダーが表示されます。

この状態でもカレンダーは十分に機能し、日付を選択することができます。しかし、さらに使いやすくするためにいくつかのカスタマイズを行います。

3. 使いやすいようにカスタマイズ

ステップ2で実装したカレンダーには、以下の2つの課題があります。
・月や曜日が日本語表記ではない
・生年月日用のカレンダーにも関わらず、今日以降の日付が選択できる
これらの課題を解決していきます。

・月や曜日が日本語表記ではない

datepickerの日本語化データはGitHubで利用できます。
下記のページを開いて(datepicker-ja.js)ダウンロードします。

GitHub:  jquery-ui/ui/i18n at main · jquery/jquery-ui · GitHub

ダウンロード後、必要なファイルをフォルダに配置し、ファイルで読み込みを行います。

これだけで日本語化することができます。

・生年月日用のカレンダーにも関わらず、今日以降の日付が選択できる

この問題はオプションを設定することで解決することができます。JavaScriptで日付と年を取得し、それを基に maxDate オプションで選択可能な最大日付を今日に設定を行います。また、年の範囲も1900年から現在の年までに制限します。

続いてyearRange オプションを使って1900年から2024年(今年)まで選択可能状態に、maxDate オプションで選択可能な最大日付を今日に設定を行います。
以下が実際のコードになります。

JavaScriptのテンプレートリテラルを使用し${}を使って変数や式を埋め込むことで、取得したcurrentYearを範囲指定に利用しています。この方法により、yearRangeオプションが常に動的に現在の年に対応し、毎年手動で更新する必要がなくなります。

さらに、maxDate オプションでtoday を設定することで、カレンダー上で今日以降の日付が選択できなくなります。以下の画像は2024/12/06に実装・確認したもので、2024/12/07以降の日付は選択不可になっていることが分かります。

[まとめ]

jQuery UIを使うことで、手間をかけずに高機能なカレンダーを実装できたのは非常に良かったです。使い方がシンプルで、公式ドキュメントや日本語リファレンスも分かりやすく、初めて触れる初心者でも短時間で機能を実装できる点が優れていると感じました。また、柔軟なカスタマイズが可能であり、要件に応じた細かい調整がしやすいのも魅力です。例えば、カレンダーの日本語対応や選択可能な日付の範囲指定など、よくあるカレンダーの仕様にも簡単に対応できました。今後、実装する要件に応じて適切なライブラリやフレームワークを選択し、それを効率的に活用できるスキルを身につけていきたいです。

2024年 新入社員ブログ 高田02 [ログイン/ログアウト機能実装]

こんにちは、2024年4月入社の高田です。
第1回目の記事で会員登録機能を紹介しました。
今回の記事では前回の記事の延長としてログイン/ログアウト機能について紹介します。

ログイン機能

ログイン機能の実装は今回始めて行いました。普段は意識せずに使っていますが、実装者の立場で改めて考えてみると、どのようにしてログイン機能が実現されているか不明でしたので今回一から調べました。色々なwebサイトを参考に実装し最終的に以下のようなステップで実装を行いました。

1. メールアドレス、パスワード入力必須チェック
2. メールアドレスでのデータベース照会
3. パスワード認証
4. 認証成功時の処理

簡単にではありますが、ここからは上記の各ステップについて順に説明していきます。

1. メールアドレス、パスワード入力必須チェック

ログイン画面でメールアドレス、パスワードを入力し、「ログイン」ボタンを押下すると認証処理が始まります。この際、すべての項目が入力されているか確認し、未入力の場合は以下の画像のようなエラーメッセージが表示されます。

このように必要な情報が揃わない場合、次のステップには進めません。

2. メールアドレスでのデータベース照会

メールアドレスとパスワードの入力必須チェックが完了すると、入力されたメールアドレスを基にデータベースを参照し、該当するユーザーを探します。データベースには登録済みのユーザー情報が保存されており、入力されたメールアドレスと一致するユーザーが見つかった場合、そのユーザーのハッシュ化(※1)されたパスワードを取得します。このパスワードを用いて、次のステップであるパスワード照合に進みます。

(※1)ハッシュ化とは?
ハッシュ化とは、ハッシュ関数によって文字列を置換して、元の文字を推測できなくすることです。ハッシュ関数を用いてsaltと呼ばれるランダムな値をハッシュする値に追加することで、同じパスワードでも異なるハッシュ値が生成されます。データベースに保存されているパスワードはハッシュ化して保存されています。

ハッシュ化の例:
・パスワード:
!X9v#4hT8@pQ7wZ&2024

・ハッシュ値:f3f32592e1483974c378f46b4ab91500199b83b168ec87ed76ebdd66efe83452

※ 上記のようにハッシュ化されたパスワードをデータベースに保存します。

ハッシュ化の特性と利点:
ハッシュ化は一方向の変換であり、一度ハッシュ化されたデータを元に戻すことは極めて困難です。この特性を利用し、データベースに保存するパスワードをハッシュ化しておくことで、万が一データベースが攻撃されても、パスワードを直接利用されるリスクを大幅に減らすことができます。

参考: PHP: パスワードのハッシュ – Manual

以上より、ハッシュ化はパスワードを管理するための重要なセキュリティ対策となります。

3. パスワード認証

パスワード認証では、データベースに保存されているハッシュ化されたパスワードと、ユーザーが入力したパスワードが一致するかを確認します。データベースに保存されているユーザーのハッシュ値からsalt値を抽出します。ユーザーが入力したパスワードと抽出したsalt値を使用して、新たなハッシュ値を生成し、新たに生成したハッシュ値と、データベースから取得したハッシュ値を比較します。一致すればパスワード認証が成功します。認証に失敗した場合、パスワードを空にして「メールアドレスまたはパスワードが一致しません」というエラーメッセージをログイン画面上に表示します。セキュリティの観点から、メールアドレスが正しいかどうかを利用者に知らせないようにするため、「メールアドレスまたはパスワードが一致しません」というメッセージにしています。以下の画像のように「メールアドレスまたはパスワードが一致しません」というメッセージを表示させます。

4. 認証成功時の処理

認証成功後、サーバー側とブラウザ側でそれぞれ以下の処理を行います。

[サーバー側の処理]

1. セッション情報の保存
サーバーは、ログインしたユーザーのID、名前、メールアドレスなどの必要な情報をセッションに保存します。これにより、ユーザーのログイン状態をサーバー上で管理します。セッション情報はサーバー側に安全に保存され、外部から直接アクセスすることはできません。

2. セッションIDの発行
サーバーは、ログイン状態を識別するための一意のセッションIDを発行します。このセッションIDは、サーバー内でセッション情報に紐付けられています。

3. ログイン後画面へのリダイレクト
認証成功後、ユーザーは検索画面などのログイン後画面にリダイレクトされます。


[ブラウザ側の処理]

1. セッションIDの保存
サーバーが発行したセッションIDは、ブラウザがCookieとして保存します。このCookieは、ブラウザ内に自動的に管理され、サーバーとクライアントのやり取りに利用されます。

2. セッションIDの送信
ブラウザは、保存したセッションIDをサーバーへのリクエストに自動的に添付します。この仕組みによって、サーバーはセッションIDを基にユーザーを識別し、ログイン状態を維持します。

参考: PHPでセッションを使ったログインページを作ってみる|やまでぃーのブログ

以上がログイン機能についての説明でした。

ログアウト機能

続けてログアウト機能について説明します。
ログアウトは、ログイン状態でのみ行うことができます。
ログアウト処理は、以下のステップで進められます。

1. サーバー側のセッション変数の初期化
2. ブラウザ側のセッションIDの削除
3. サーバー側のセッションIDの無効化

各ステップの詳細は以下をご覧ください。

1. サーバー側のセッション変数の初期化
セッション変数の全データを空にし、セッション情報をリセットします。これにより、セッション変数が初期化され、ユーザー情報などのセッションデータが破棄されます。

2. ブラウザ側のセッションID削除
クライアントのブラウザ側にCookieとして記録されているセッションIDの破棄を行います。セッション管理にCookieを使用している場合はブラウザ側のCookieを削除しておかないとセッションIDが残ってしまいセキュリティ上よくありません。(実装段階では、調べが行き届いておらずブラウザ側でのセッションID削除は行いませんでした。)

3. サーバー側のセッションIDの無効化
セッション自体を破棄し、セッションIDも無効化して完全なログアウト状態にします。セッションの破棄が完了後、ログイン前の画面にリダイレクトします。今回の場合、以下の画像のようにトップ画面にリダイレクトします。

以上がログアウト機能についての説明でした。

参考:
PHP: session_destroy – Manual
PHPでセッションを完全に破棄する方法 – プログラマはサイコロを振らない

まとめ

ログイン/ログアウト機能を実装する際に、セッションやCookieの仕組みについて深く学ぶことができました。例えば、ChromeでAmazonにログインした後、EdgeでAmazonのURL(https://www.amazon.co.jp/)にアクセスした場合にログイン状態が維持されるのか、また、Chromeの別タブで同じURLを開いた場合にログイン状態が共有されるのかを検証しました。この検証を通じて、セッションやCookieがブラウザごと、またはタブごとにどのように扱われるかを具体的に確認しました。その結果、ログイン状態がどのように管理されているのかについて理解が深まりました。
今回学んだ知識を活かし、次はPHPフレームワークであるLaravelを使った実装に取り組んでいきたいと思います。Laravelでは、認証機能やセッション管理に便利な仕組みが既に用意されており、活用することでより効率的かつ安全なログイン/ログアウト機能を実装できるようなので、実装方法をしっかり学習したいと思います。将来的に、ユーザーに安心して使ってもらえるシステム構築ができるよう引き続き学習していきます。

2024年 新入社員ブログ 高田01 [PHP版会員登録機能実装] 

こんにちは、2024年4月入社の高田です。
入社から半年が経過しました。この半年間は外部研修、内部研修を受けていました。

外部研修では、泉岳寺のオフィスを離れ新宿のビルで他社の受講生の方々と一緒にITの基礎知識やHTML、CSS、JavaScript、PHP、Laravelを学びました。最終的にチームで旅館予約システムを作成し発表を行いました。私はITに関しては未経験でしたが、分かりやすく丁寧に教えていただきとても有意義な時間を過ごすことができました。

内部研修では、泉岳寺のオフィスに戻りSQLやPHP、Laravelを使用した会員登録フォームを作成しています。外部研修で学んだ知識はもちろんのこと、実務で欠かせない技術を少し盛り込みより実務に近い研修です。

今回は内部研修の一環としてPHPを使用し作成した会員登録フォームの会員登録機能について紹介します。会員登録フォームは以下の5つの機能で構成されています。

会員登録機能
ログイン/ログアウト機能
会員一覧表示機能
会員情報更新機能
会員削除機能

今回は会員登録機能について説明していきます。
会員登録機能を実装するために以下の3つの画面を作成しました。

入力画面
確認画面
完了画面

これら3つの画面を通して、ユーザーが情報を入力し、確認・登録まで行います。
各画面について詳細を説明します。

入力画面

ユーザーが名前、メールアドレス、パスワードなどを入力するための入力画面です。 ユーザーがフォームに必要な情報をすべて入力し、POSTで確認画面に送信するための「確認」ボタンが用意されています。都道府県、性別についてはDBのテーブルから参照し、表示しています。また、確認ボタンを押下した際、入力値の保持を行いますが、パスワードに関してはセキュリティの関係上入力値を保持しないようにしています。バリデーションチェックを実施し、入力欄に適切な値が入力されなかった場合はエラーメッセージを入力画面上に表示します。

例えば、郵便番号入力欄に数字以外の文字を入力し「確認」ボタンを押下するとエラーメッセージが表示し、確認画面に遷移しないようになっています。

全項目のバリデーションチェックを突破したときに初めて確認画面に入力値をPOST送信し、確認画面に遷移することができます。

確認画面

入力した情報を確認する確認画面です。入力画面で「確認」ボタンを押下すると、確認画面に遷移し、POST送信されたデータが画面上に表示されます。ただし、パスワードに関しては、セキュリティを考慮して画面に表示されないようにしています。また、パスワードは確認画面に遷移した時点でハッシュ化を行っているため開発者ツールを使用してもハッシュ化前のパスワード値は確認できないようにしています。

この画面では、誤った情報が入力されていないかをユーザー自身が確認できるようにし、修正が必要な場合は「入力画面へ戻る」ボタンを押下し、入力画面に戻ることも可能です。入力画面に戻ってきた際に、パスワード以外の入力値が保持されています。また、1から入力する必要がなく、修正個所とパスワードの入力で確認画面に遷移可能です。開発者ツールを使用し、確認画面に送信された値をバリデーションエラーになるような値に書き換えて、「登録」ボタンを押下すると入力画面に遷移してエラー項目にエラー文が表示します。修正が必要ない場合は、「登録」ボタンを押下し、登録処理を確認画面で行い登録が終えたら完了画面に遷移します。

完了画面

ユーザー登録が完了したことを通知する完了画面です。完了画面は、DBにユーザー情報を保存した後に表示されます。DBにユーザー情報登録が成功した場合は、完了メッセージとともにトップページに移動するためのリンクが表示されます。また、完了画面に遷移した段階で、未ログイン状態からログイン状態となりヘッダーにログインユーザー名が追加されます。

学んだこと

開発者ツールの使い方

サーバーに送信するデータを直前に書き換えることが可能です。
ブレークポイントを入れることで、JavaScriptの変数の中身を確認しながらデバック作業を行うことができます。

変数名の命名規則

誰が見てもわかるような変数名を命名する必要があります。
キャメルケースやスネークケースといった命名規則が存在します。
コードの読みやすさを向上させるため、まず『リーダブルコード』という書籍を読んでみようと思います。この本は、読み手にとって理解しやすいコードを書くためのガイドで、わかりやすい変数名の付け方など詳しく解説されています。

絵文字の保存方法

今回の会員登録機能は絵文字を保存できるようにします。
絵文字はUTF-8の通常のバージョン(utf8)ではサポートされないため、UTF-8の4バイト対応(utf8mb4)に設定する必要があります
MySQLの設定ファイルの一部修正や、DBとテーブル生成時にutf8mb4に対応するようにしておきます。

デバッグ方法

会員登録機能を実装していくとよくエラーが発生します。
エラーを解決するためにデバッグ作業を行います。
error_log() を使ったデバッグ方法は、コードの進行がどこで止まっているかPOSTの値が渡っているかなどを調べます。このデバッグ方法のおかげで調べても解決できないエラーを解決することができました。

セキュリティを考慮することの重要性

SQLインジェクション対策とクロスサイトスクリプティング(XSS)対策を行いました。
入力欄に悪意あるコードを埋め込み、それが実行されてしまうとテーブルにあるユーザー情報が削除されてしまいます。
入力欄に入力された悪意あるコードを無効化し、ただの文字列として認識させれば悪意あるコードは実行されません。

以上が会員登録機能についてでした。
現在、Laravel版の会員登録フォームの作成に取り掛かっております。
PHP版の会員登録フォームでは実装できなかったページネーション機能や郵便番号から住所自動入力機能などを追加し、内部研修の集大成としてスケジュールに気を付けつつPHP版で学んだことを生かしながら作成していきたいと思います。