# 画面設計書 13-ゲストログインページ

## 概要

本ドキュメントは、Shopware 6のStorefrontにおける「ゲストログインページ」の画面設計書です。ゲストとして注文した顧客が、注文状況を確認するためにログインする画面の仕様を記載しています。

### 本画面の処理概要

ゲストログインページは、アカウントを作成せずにゲストとして注文した顧客が、後から注文状況を確認するためのログイン画面です。メールアドレスと郵便番号の組み合わせで本人確認を行い、該当する注文の詳細や支払い方法の変更などを可能にします。この画面は通常のログインページとは異なり、簡略化されたフォームで構成されています。

**業務上の目的・背景**：ECサイトでは、アカウント作成を望まないが購入はしたいという顧客層が存在します。ゲスト注文機能はこのような顧客に対応しますが、注文後に配送状況の確認や支払い方法の変更が必要になる場合があります。ゲストログイン機能により、アカウントを持たない顧客でも注文情報へのアクセスを可能にし、顧客満足度とサポート効率の向上を図ります。

**画面へのアクセス方法**：
- 注文確認メールに記載されたリンクからアクセス
- 注文ステータス確認ページへのリダイレクトパラメータ付きでアクセス
- 直接URL（/account/guest/login）にはリダイレクト先パラメータが必要

**主要な操作・処理内容**：
1. メールアドレスの入力
2. 郵便番号の入力（本人確認用）
3. ゲスト認証の実行
4. 注文関連ページへのリダイレクト

**画面遷移**：
- 遷移元：注文確認メール内リンク、注文ステータス確認要求
- 遷移先（認証成功時）：注文履歴ページ、注文編集ページなど（redirectToパラメータで指定）
- 遷移先（パラメータなし）：ログインページへリダイレクト
- 遷移先（認証失敗）：同画面にエラーメッセージ表示

**権限による表示制御**：
- 既にログイン済みの場合は指定されたリダイレクト先へリダイレクト
- redirectToパラメータが未指定の場合はログインページへリダイレクト

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 3 | ゲストログイン | 主機能 | ゲスト顧客の注文確認用ログイン（AuthController::guestLoginPage） |

## 画面種別

ログイン

## URL/ルーティング

| 項目 | 値 |
|------|-----|
| URL | /account/guest/login |
| ルート名 | frontend.account.guest.login.page |
| HTTPメソッド | GET |
| 必須パラメータ | redirectTo（クエリパラメータ、リダイレクト先ルート） |

## 入出力項目

| 項目名 | 型 | 必須 | 説明 |
|--------|-----|------|------|
| email | string | Yes | 注文時に使用したメールアドレス |
| zipcode | string | Yes | 注文時の住所の郵便番号 |
| redirectTo | string | Yes | 認証成功後のリダイレクト先ルート |
| redirectParameters | string | No | リダイレクト先パラメータ（JSON） |

## 表示項目

| セクション | 表示項目 | データソース |
|------------|----------|--------------|
| タイトル | ページタイトル | 固定テキスト（account.orderGuestLoginTitle） |
| 説明文 | ログイン説明 | 固定テキスト（account.orderGuestLoginDescription） |
| フォーム | メールアドレス入力欄 | フォーム |
| フォーム | 郵便番号入力欄 | フォーム |
| フォーム | 送信ボタン | 固定 |
| エラー | 認証エラーメッセージ | account.orderGuestLoginWrongCredentials |
| エラー | 認証スロットルメッセージ | account.loginThrottled |

## イベント仕様

### 1-ページ読み込み時（GET）

1. redirectToパラメータの存在チェック
2. redirectToが未指定の場合、エラーメッセージを表示しログインページへリダイレクト
3. 顧客のログイン状態を確認
4. 既にログイン済みの場合、redirectTo先へリダイレクト
5. waitTimeパラメータがある場合、認証スロットルメッセージを表示
6. loginErrorパラメータがある場合、認証エラーメッセージを表示
7. AccountLoginPageLoaderでページデータを取得
8. AccountGuestLoginPageLoadedHookを発火
9. テンプレートをレンダリング

### 2-ゲストログイン処理（POST）

ゲストログイン処理は、フォームのaction属性に設定されたredirectTo先のルートで処理されます。
典型的にはAccountOrderController等でゲスト認証が行われ、メールアドレスと郵便番号の組み合わせで顧客を特定します。

## データベース更新仕様

### 操作別データベース影響一覧

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| ページ表示 | - | - | 参照のみ（認証処理は別ルート） |
| ゲスト認証 | customer | SELECT | メールアドレスと郵便番号で顧客を検索 |
| ゲスト認証 | order | SELECT | 該当顧客の注文情報を取得 |

### テーブル別更新項目詳細

ゲストログインページ自体はデータベース更新を行いません。認証処理は別のルートで実行されます。

## メッセージ仕様

| メッセージID | 種別 | 表示条件 | メッセージ内容 |
|-------------|------|----------|---------------|
| account.orderGuestLoginTitle | 情報 | 常時 | ページタイトル |
| account.orderGuestLoginDescription | 情報 | 常時 | ログイン説明文 |
| account.profileCurrentMail | 情報 | 常時 | メールアドレスラベル |
| address.zipcodeLabel | 情報 | 常時 | 郵便番号ラベル |
| account.registerSubmit | 情報 | 常時 | 送信ボタンラベル |
| account.orderGuestLoginWrongCredentials | エラー | 認証失敗時 | 認証情報不正エラー |
| account.loginThrottled | 警告 | 認証スロットル時 | 待機時間案内 |

## 例外処理

| 例外 | 発生条件 | 処理内容 |
|------|----------|----------|
| redirectTo未指定 | クエリパラメータにredirectToがない | エラーメッセージを表示しログインページへリダイレクト |
| 認証エラー | メールアドレスと郵便番号の組み合わせが不正 | エラーメッセージを表示して同画面へリダイレクト |
| 認証スロットル | 認証試行回数超過 | 待機時間を表示して同画面へリダイレクト |

## 備考

- SEO設定：robots="noindex,follow"（推測、明示的な設定なし）
- キャッシュ：無効化（PlatformRequest::ATTRIBUTE_NO_STORE = true）
- フォームのaction属性はredirectToパラメータの値が設定される
- 認証スロットル情報（waitTime）はattributeまたはqueryパラメータで渡される
- 認証エラー情報（loginError）はattributeまたはqueryパラメータで渡される

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

ゲストログインページはAccountLoginPageを再利用しています。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | AccountLoginPage.php | `src/Storefront/Page/Account/Login/AccountLoginPage.php` | ページオブジェクトの構造 |

**読解のコツ**: ゲストログインページは専用のPageクラスを持たず、AccountLoginPageを流用しています。

#### Step 2: エントリーポイントを理解する

処理の起点となるコントローラーメソッドを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | AuthController.php | `src/Storefront/Controller/AuthController.php` | guestLoginPage（104-151行目） |

**主要処理フロー**:
1. **113-118行目**: redirectToパラメータチェック、未指定ならログインページへリダイレクト
2. **121-127行目**: ログイン状態チェック、既存ログインならリダイレクト
3. **131-134行目**: waitTimeパラメータ処理（認証スロットル）
4. **138-140行目**: loginErrorパラメータ処理（認証エラー）
5. **142行目**: AccountLoginPageLoaderでページデータ取得
6. **144行目**: AccountGuestLoginPageLoadedHookを発火
7. **146-150行目**: テンプレートをレンダリング

#### Step 3: テンプレートを理解する

表示ロジックを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | guest-auth.html.twig | `src/Storefront/Resources/views/storefront/page/account/guest-auth.html.twig` | メインテンプレート |

**主要構造**:
- **4行目**: actionUrlをredirectToから生成
- **11-14行目**: フォームタグ、actionにactionUrlを設定
- **30-40行目**: メールアドレス入力フィールド
- **43-54行目**: 郵便番号入力フィールド
- **59-64行目**: 送信ボタン

### プログラム呼び出し階層図

```
AuthController::guestLoginPage()
    |
    +-- redirectToパラメータチェック
    |       |
    |       +-- 未指定: redirectToRoute('frontend.account.login.page')
    |
    +-- ログイン状態チェック
    |       |
    |       +-- ログイン済み: createActionResponse(request)
    |
    +-- AccountLoginPageLoader::load()
    |       |
    |       +-- GenericPageLoader::load()
    |
    +-- AccountGuestLoginPageLoadedHook
    |
    +-- renderStorefront()
```

### データフロー図

```
[入力]                    [処理]                         [出力]

Request
  redirectTo
  waitTime(opt)
  loginError(opt) ────> AuthController::guestLoginPage()
                              |
                              v
                        パラメータ検証
                              |
                              v
                        AccountLoginPageLoader
                              |
                              v
                        AccountLoginPage ─────────> Twig Template
                                                        |
                                                        v
                                                   HTML Response
                                                   (form action = redirectTo)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| AuthController.php | `src/Storefront/Controller/AuthController.php` | コントローラー | ルーティングとリクエスト処理 |
| AccountLoginPageLoader.php | `src/Storefront/Page/Account/Login/AccountLoginPageLoader.php` | PageLoader | ページデータの組み立て |
| AccountLoginPage.php | `src/Storefront/Page/Account/Login/AccountLoginPage.php` | DTO | ページデータを保持 |
| AccountGuestLoginPageLoadedHook.php | `src/Storefront/Page/Account/Login/AccountGuestLoginPageLoadedHook.php` | フック | 拡張ポイント |
| guest-auth.html.twig | `src/Storefront/Resources/views/storefront/page/account/guest-auth.html.twig` | テンプレート | メイン画面 |
| form-input.html.twig | `src/Storefront/Resources/views/storefront/component/form/form-input.html.twig` | テンプレート | 入力フィールドコンポーネント |
