会員グループ管理プラグインの配送方法管理アドオンです。配送方法ごとに「このグループの会員なら選べる」を割り当てて、法人向けの一括配送や卸売会員専用の便を用意できます。

EC-CUBE 4.4 対応ブランチができたので、機能の説明とあわせて 4.4 で何を直したのかも書いておきます。

判定のルール

配送方法の割り当て会員非会員(ゲスト購入)
割り当てていない選べる選べる
いずれかのグループに所属選べる-
どのグループにも所属していない選べない-
会員グループを割り当てている-選べない

割り当てが無い配送方法は制限なしです。導入しただけでは既存の配送方法に影響しないので、限定の配送方法だけを後から足せます。複数のグループを割り当てた場合は OR 判定で、いずれかに所属していれば選べます。

注意したいのは最後の行です。会員グループを割り当てた配送方法は、自動的に会員限定になります。 非会員はどのグループにも所属できないためで、「この配送方法だけは非会員にも許可する」といった指定はできません。本体の会員グループにある「未ログインユーザーは商品を表示」は商品の表示可否を決める設定で、配送方法の利用可否には関係ありません。

例を出します。会員グループが「一般」「卸売」で、配送方法をこう設定した場合。

配送方法割り当てたグループ
宅配便(なし)
卸売便卸売
  • 一般の会員 … 宅配便のみ
  • 卸売の会員 … 宅配便と卸売便
  • 非会員 … 宅配便のみ

設定方法

管理画面の 設定 > 店舗設定 > 配送方法 で配送方法を開くと「利用可能な会員グループ」のチェックボックスが増えます。ここで選んだグループだけがその配送方法を選べます。

何も選ばなければ制限なしです。選択肢の並び順は会員グループの表示順に従います。テンプレートの編集は要りません。

隠すだけでは守れない

絞り込みは画面と購入フローの2段階でやっています。表示を絞るだけだと、細工したリクエストで受注データに残ってしまうためです。

画面側は本体の ShippingType を拡張して、PRE_SET_DATA で配送方法の選択肢を組み立て直します。販売種別で絞った本体の一覧から、判定ルールに合うものだけを残す形です。選べるものが1つも無ければ「選択できる配送方法がありません。」を出します。

購入フロー側DeliverySettingValidator が受注の各お届け先を検証します。選べない配送方法がセットされていたら選択可能な最初のものへ差し替え、選べるものが1つも無ければエラーにします。画面に出ていない配送方法を直接 POST しても、ここで差し替えられるので受注には残りません。この経路は Tests/Web/DeliveryRestrictionBypassTest で検証しています。

データの持ち方

配送方法と会員グループの多対多を、中間テーブル plg_customer_group_deliveries_groups で持っています。

配送方法と会員グループのどちらを削除しても、対応する行は自動で消えます(両方向の外部キーに ON DELETE CASCADE)。受注済みのデータには影響しません。受注は配送方法を直接参照していて、この中間テーブルを経由しないためです。

EC-CUBE 4.4 対応で直したところ

4.4 は 4.2 / 4.3 と互換性が無いので専用ブランチに分けました。依存が丸ごと入れ替わっています(PHP ^8.2、Symfony ^7.4、doctrine/orm ^3.0、doctrine/dbal ^4.4)。アノテーションの属性記法への変換や Symfony 7 で消えた Security の差し替えは本体プラグインの記事に書いたとおりです。

このアドオン固有の話は3つでした。

外部キーの張り替えを専用接続にしたのが1つめです。有効化のたびに外部キーの CASCADE を張り直す処理を持っているのですが、本体はプラグインの有効化をトランザクションで包みます。MySQL は DDL で暗黙コミットするので、同じ接続で ALTER TABLE を投げるとトランザクションがその場で終わり、DBAL 4 がそれを検知して「There is no active transaction.」で落ちます。専用の接続を開いて DDL を流すように変えました。

2つめはテストの取り違えです。本体の DeliveryControllerTest が final 化されて継承できなくなったとき、借りていた createFormData会員登録フォームのものと取り違えていました。名前が同じで中身が違うヘルパーで、こういうのがいちばん気づきにくい。配送方法用を自前に持たせて直しています。

3つめは環境依存のテストです。会員の絞り込み検索が既存の会員を拾って使っていて、会員が1件も無い環境では null になって落ちていました。あとは createProduct() の第3引数が 4.4 には無くなっていた件と、在庫が faker 任せで 0 になりうる件も潰しています。

動作要件といまの状況

項目内容
EC-CUBE4.4 系
PHP8.2 / 8.3
データベースMySQL 8、PostgreSQL 13 以上
依存プラグイン会員グループ管理(CustomerGroup44)^4.4

パッケージ名は ec-cube/customergroupdelivery44、プラグインコードは CustomerGroupDelivery44 です。依存プラグインが有効になっていないと有効化できません。

2026年7月27日時点で CI は通っていますが、EC-CUBE 4.4 本体がまだリリースされていないので配布は本体のリリース後です。4.2 / 4.3 版は引き続き更新しています。

同じ会員グループ管理の系列では、価格管理アドオンの 4.4 対応も書いています。