# 画面設計書 28-テキストメールレイアウト

## 概要

本ドキュメントは、Laravelフレームワークのテキストメールテンプレートにおけるレイアウトコンポーネント（text/layout.blade.php）の設計仕様を定義するものである。

### 本画面の処理概要

本コンポーネントは、プレーンテキストメールの全体構造を定義する基盤テンプレートである。HTMLメールをサポートしないメールクライアントやテキスト形式を好むユーザーのために、同等の情報をプレーンテキスト形式で提供する。

**業務上の目的・背景**：メール送信においては、HTMLメールとテキストメールの両方を提供することがベストプラクティスである。テキストメールは、HTMLレンダリングが無効なメールクライアント、スクリーンリーダーを使用するユーザー、帯域幅が限られた環境など、様々な状況で重要な役割を果たす。また、スパムフィルターはHTMLのみのメールを疑わしいと判断することがあるため、テキスト版を含めることでメール配信率も向上する。

**画面へのアクセス方法**：本コンポーネントは直接アクセスするものではなく、MailableクラスでMarkdownメールを送信する際、HTMLビューと共にテキストビューとして自動的にレンダリングされる。Markdown::renderText()メソッドがテキスト版のレンダリングを担当する。

**主要な操作・処理内容**：
1. $header、$slot、$subcopy、$footerのスロットを受け取る
2. strip_tags()でHTMLタグを除去してプレーンテキスト化
3. 各スロットを空行で区切って順番に出力
4. $subcopyは@issetで条件付き表示

**画面遷移**：テキストメールのため画面遷移の概念は適用されない。URLはテキストとして表示され、ユーザーがコピー＆ペーストで利用する。

**権限による表示制御**：レイアウトコンポーネント自体には権限制御はない。コンテンツはスロットとして渡される情報によって決定される。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 28 | メール管理 | 主機能 | テキストメールの共通レイアウト構造定義 |

## 画面種別

コンポーネント（メールテンプレート・レイアウト）

## URL/ルーティング

該当なし（Bladeコンポーネントとして使用）

コンポーネント名: `mail::layout`（テキスト版）

## 入出力項目

| 項目名 | 型 | 必須 | 説明 |
|--------|------|------|------|
| $header | string | No | ヘッダーコンテンツ |
| $slot | string | Yes | メール本文コンテンツ |
| $subcopy | string | No | 補足情報（任意） |
| $footer | string | No | フッターコンテンツ |

## 表示項目

| セクション | 表示内容 | 備考 |
|-----------|---------|------|
| ヘッダー | $headerの内容（HTMLタグ除去） | 空行で区切り |
| 本文 | $slotの内容（HTMLタグ除去） | メイン領域 |
| サブコピー | $subcopyの内容（HTMLタグ除去） | 条件付き表示 |
| フッター | $footerの内容（HTMLタグ除去） | 空行で区切り |

## イベント仕様

該当なし（テキストメールのため）

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

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

該当なし（表示専用コンポーネント）

## メッセージ仕様

該当なし

## 例外処理

| 状態 | 処理内容 |
|------|---------|
| $header未指定 | 空文字として処理（?? ''） |
| $footer未指定 | 空文字として処理（?? ''） |
| $subcopy未指定 | セクション自体を出力しない |

## 備考

- strip_tags()でHTMLタグを除去してプレーンテキスト化
- 各セクション間は空行で区切られる
- Null合体演算子（??）でデフォルト値を設定
- @issetディレクティブで$subcopyの条件付き表示を実装

---

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

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

### 推奨読解順序

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

まず、レイアウトで使用されるスロット構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | layout.blade.php | `src/Illuminate/Mail/resources/views/text/layout.blade.php` | 4つのスロット変数（行1-9） |

**読解のコツ**: テキスト版レイアウトは非常にシンプルで、HTML版と同じスロット構造を持つが、strip_tags()でHTMLを除去する点が異なる。

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

処理の起点となる呼び出し元を特定する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Markdown.php | `src/Illuminate/Mail/Markdown.php` | renderText()メソッド（行122-133） |
| 2-2 | Mailable.php | `src/Illuminate/Mail/Mailable.php` | buildMarkdownText()メソッド（行402-416） |

**主要処理フロー**:
1. **Mailable.php 行402-416**: buildMarkdownText()でテキストビューを構築
2. **Markdown.php 行122-133**: renderText()でテキストコンポーネントパスを使用

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | layout.blade.php | `src/Illuminate/Mail/resources/views/text/layout.blade.php` | テキストレイアウト構造（行1-9） |

**主要処理フロー**:
- **行1**: `{!! strip_tags($header ?? '') !!}`でヘッダー出力（HTMLタグ除去）
- **行3**: `{!! strip_tags($slot) !!}`で本文出力
- **行4-7**: `@isset($subcopy)`で条件付きサブコピー出力
- **行9**: `{!! strip_tags($footer ?? '') !!}`でフッター出力

#### Step 4: HTML版との比較

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | html/layout.blade.php | `src/Illuminate/Mail/resources/views/html/layout.blade.php` | HTML版レイアウト（行1-58） |

**読解のコツ**: HTML版は複雑なテーブル構造とCSSを使用するが、テキスト版は単純なテキスト出力のみ。

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

```
Mailable::send()
    │
    ├─ Mailable::buildMarkdownView()
    │      │
    │      └─ Mailable::buildMarkdownText()
    │             │
    │             └─ Markdown::renderText()
    │                    │
    │                    └─ View::replaceNamespace('mail', textComponentPaths())
    │                           │
    │                           └─ View::make('mail::message')
    │                                  │
    │                                  └─ text/message.blade.php
    │                                         │
    │                                         └─ x-mail::layout
    │                                                │
    │                                                └─ text/layout.blade.php
    │
    └─ Mailer::send()
```

### データフロー図

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

$header ──────────▶ strip_tags($header ?? '') ──▶ プレーンテキスト
                                                      │
$slot ────────────▶ strip_tags($slot) ─────────────▶ プレーンテキスト
                                                      │
$subcopy ─────────▶ @isset → strip_tags() ─────────▶ プレーンテキスト（条件付き）
                                                      │
$footer ──────────▶ strip_tags($footer ?? '') ─────▶ プレーンテキスト
                           │
                           ▼
                   連結されたテキストメール本文
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| layout.blade.php | `src/Illuminate/Mail/resources/views/text/layout.blade.php` | テンプレート | テキストメールレイアウト |
| message.blade.php | `src/Illuminate/Mail/resources/views/text/message.blade.php` | テンプレート | レイアウトの呼び出し元 |
| html/layout.blade.php | `src/Illuminate/Mail/resources/views/html/layout.blade.php` | テンプレート | HTML版レイアウト（比較用） |
| Markdown.php | `src/Illuminate/Mail/Markdown.php` | ソース | renderText()メソッド |
| Mailable.php | `src/Illuminate/Mail/Mailable.php` | ソース | buildMarkdownText()メソッド |
