コンテンツにスキップ

ブランド管理機能仕様書

機能概要

ブランド管理機能は、ECサイトで扱う商品ブランドを管理するための管理画面機能です。ブランドの作成、編集、削除、一覧表示、並び替えなどの操作が可能です。

URL: /admin/brands ナビゲーション: 商品管理グループ(ソート順: 1) 技術スタック: Filament v4, Livewire v3

画面構成

一覧画面(List Brands)

ブランドの一覧を表示し、検索、ソート、並び替え、削除などの操作が可能です。

画面レイアウト

  • ヘッダーアクション: 新規作成ボタン(スライドオーバー表示)
  • テーブル: ブランド一覧
  • ツールバー: 一括削除、フィルター、ページネーション

テーブルカラム

カラム名 表示内容 検索 ソート 表示/非表示
ブランド名 name - 常時表示
ロゴ logo_image - - 常時表示
スラッグ slug - 常時表示
有効/無効 is_active - - 常時表示(アイコン)
表示順序 sort_order - デフォルト非表示
作成日時 created_at - デフォルト非表示
更新日時 updated_at - デフォルト非表示

機能詳細

検索機能 - ブランド名(name)とスラッグ(slug)で検索可能 - リアルタイム検索(入力と同時にフィルタリング)

ソート機能 - デフォルトソート: sort_order 昇順 - 表示順序、作成日時、更新日時でソート可能

並び替え機能 - ドラッグ&ドロップで表示順序を変更可能 - sort_order カラムの値を自動更新 - 並び替え後は自動的にテーブルをリフレッシュ

ページネーション - デフォルト表示件数: 50件 - 表示件数オプション: 10, 20, 30, 40, 50, 100, 150, 200件

フィルター - モーダル表示(スライドオーバー) - モーダル幅: 4XL(FourExtraLarge)

一括削除 - 複数レコードを選択して一括削除可能 - 削除確認ダイアログ表示

レコードアクション - 編集(スライドオーバー表示) - 削除(モーダル表示)

作成画面(Create Brand)

新しいブランドを作成するためのフォーム画面です。

フォーム項目

項目名 フィールド名 必須 最大文字数 説明
ブランド名 name 255 ブランドの表示名
スラッグ slug 255 URL用スラッグ(ユニーク)
ロゴ画像 logo_image - - ブランドロゴ画像(単一)
有効 is_active - 有効/無効トグル(デフォルト: true)
表示順序 sort_order - 表示順序(数値、デフォルト: 0)
ブランド画像(複数) images - - ブランド画像(最大10枚)
ブランド説明 description - - リッチエディタ対応の説明文

レイアウト構成

┌─────────────────────────────────────────┐
│ 1行目: ブランド名 | スラッグ            │
├─────────────────────────────────────────┤
│ 2行目: ロゴ画像 | 有効/表示順序(2列)  │
├─────────────────────────────────────────┤
│ 3行目: ブランド画像(複数、全幅)       │
├─────────────────────────────────────────┤
│ 4行目: ブランド説明(全幅)             │
└─────────────────────────────────────────┘

画像アップロード機能

ロゴ画像 - 保存先: public/brands/ - ディスク: public - プレビュー高さ: 100px - 単一画像のみ

ブランド画像(複数) - 保存先: public/brands/ - ディスク: public - 最大ファイル数: 10枚 - 並び替え可能(ドラッグ&ドロップ) - プレビュー高さ: 100px - レイアウト: グリッド表示

リッチエディタ機能

ブランド説明欄では、以下の機能を持つリッチエディタを使用します。

ツールバーボタン - テキスト装飾: 太字、斜体、下線、取り消し線、上付き、下付き、リンク、コード - 見出し: H1, H2, H3 - 配置: 左揃え、中央揃え、右揃え、両端揃え - リスト: 箇条書き、番号付きリスト、引用、コードブロック - 書式: クリア、ハイライト、文字色、リード、スモール - 詳細: 折りたたみ、水平線、グリッド、グリッド削除 - テーブル: テーブル作成、列追加、行追加、セル結合、セル分割、ヘッダー行切り替え、テーブル削除 - ファイル: ファイル添付、HTML編集 - 操作: 元に戻す、やり直し

ファイル添付 - 保存先: public/brands/ - ディスク: public

最小高さ: 300px

バリデーション

項目 ルール
ブランド名 必須、最大255文字
スラッグ 必須、最大255文字、ユニーク(brandsテーブル内)
有効 必須
表示順序 必須、数値

作成後の動作

  • 作成成功後、一覧画面にリダイレクト
  • 成功通知を表示

編集画面(Edit Brand)

既存のブランドを編集するためのフォーム画面です。

フォーム項目

作成画面と同じフォーム項目を使用します。

バリデーション

作成画面と同じバリデーションを適用します。ただし、スラッグのユニークチェックでは現在編集中のレコードを除外します。

特別な確認ダイアログ

有効から無効への変更時 - 条件: 現在の状態が「有効」で、新しい状態が「無効」、かつ商品で使用されている場合 - 表示内容: 「このブランドは{N}件の商品で使用されています。無効にして良いですか。」 - 確認ボタン: 「保存」

保存後の動作

  • 保存成功後、一覧画面にリフレッシュ(リダイレクトなし)
  • 成功通知を表示

削除機能(Delete Brand)

ブランドを削除する機能です。

削除確認ダイアログ

商品で使用されている場合 - 表示内容: - 「このブランドは{N}件の商品で使用されています。削除後、これらの商品のブランド情報は空になります。」 - 「よろしいですか?」

商品で使用されていない場合 - 表示内容: 「このブランドを削除してもよろしいですか?」

削除時の処理

  1. 関連商品のbrand_idNULLに設定
  2. ブランドレコードを削除
  3. 一覧画面にリフレッシュ
  4. 成功通知を表示

注意: 商品本体は削除されません。ブランド情報のみが空になります。

バリデーション

フォームバリデーション

フィールド ルール エラーメッセージ
name required, max:255 ブランド名は必須です / ブランド名は255文字以内で入力してください
slug required, max:255, unique:brands,slug,{id} スラッグは必須です / スラッグは255文字以内で入力してください / このスラッグは既に使用されています
is_active required 有効フラグは必須です
sort_order required, numeric 表示順序は必須です / 表示順序は数値で入力してください

ビジネスロジックバリデーション

有効から無効への変更 - 商品で使用されているブランドを無効化する場合、確認ダイアログを表示 - ユーザーが確認した場合のみ無効化を実行

エラーハンドリング

一般的なエラー

  • バリデーションエラー: フォーム内にエラーメッセージを表示
  • データベースエラー: エラーログに記録し、ユーザーにエラー通知を表示
  • ファイルアップロードエラー: アップロード失敗時はエラーメッセージを表示

削除時のエラー

  • 外部キー制約エラー: 関連商品がある場合でも削除可能(brand_idNULLに設定)
  • 削除失敗: エラーログに記録し、ユーザーにエラー通知を表示

技術仕様

使用技術

  • Filament v4: 管理画面フレームワーク
  • Livewire v3: リアクティブコンポーネント
  • Alpine.js: クライアント側インタラクション(Livewireに同梱)

ファイル構成

app/Admin/Resources/
├── BrandResource.php              # メインリソースクラス
└── BrandResource/Pages/
    ├── ListBrands.php              # 一覧ページ
    └── CreateBrand.php             # 作成ページ(BaseCreateRecordを継承)

app/Models/
└── Brand.php                      # モデルクラス

モデル機能

リレーション - products(): hasMany(Product::class) - このブランドに属する商品

スコープ - active(): is_active = true のブランドを取得

削除時の処理 - deletingイベントで関連商品のbrand_idNULLに設定

ファイル保存

画像保存先 - ロゴ画像: storage/app/public/brands/ - ブランド画像: storage/app/public/brands/ - リッチエディタ添付ファイル: storage/app/public/brands/

ディスク設定 - 使用ディスク: public - シンボリックリンク: php artisan storage:link で作成済み

ページネーション設定

デフォルト表示件数: 50件(config/ecspoke.pagination.default_per_page

表示件数オプション: 10, 20, 30, 40, 50, 100, 150, 200件(config/ecspoke.pagination.per_page_options

UI/UX仕様

スライドオーバー表示 - 作成画面: スライドオーバー表示 - 編集画面: スライドオーバー表示 - フィルター: スライドオーバー表示(幅: 4XL)

モーダル表示 - 削除確認: モーダル表示 - 有効→無効変更確認: モーダル表示

画像プレビュー - 高さ: 100px - グリッドレイアウト(ブランド画像複数時)

リッチエディタ - 最小高さ: 300px - 全機能付きツールバー

関連機能

商品管理機能との連携

  • 商品作成・編集画面でブランドを選択可能
  • ブランド削除時、関連商品のbrand_idが自動的にNULLに設定される
  • ブランド無効化時、確認ダイアログで商品数を表示

フロントエンド表示

  • 有効なブランド(is_active = true)のみフロントエンドで表示
  • 表示順序(sort_order)に基づいてソート表示

参照資料