[EC-CUBE4] 通貨を「円」から「ゴールド」に変える

EC-CUBE4では米ドルや人民元など、日本円以外の通貨単位を使うことは簡単にできる。.envファイルを編集すればよいのだ。

しかしこれを世間一般で使われるような通貨ではなく、そもそも実在していない架空の通貨単位にしようとした場合はどうすればよいのか?

ここでは通貨単位を「ゴールド」にするカスタマイズ例を紹介する。

新しく通貨の設定を作る → わからん

.env ファイルで通貨の種類がデフォルトでは「JPY」に指定されている。これを「USD」に変更すれば米ドルでの表示に切り替わるのだ。ということはその設定がどこかで定義されているわけで、「ゴールド」用の設定を追加してやればよいのではないか?

……と思ったのだが、これは私の力ではどうしようもなかった。

通貨関係の情報は、/vendor/symfony/intl/ というディレクトリ(モジュール)に含まれており、これが(たぶん)使われている。

しかし、この中に入っているphpファイル
( /vendor/symfony/intl/Resource/data/currencies/meta.php など )を変更してもダメだ。特に何かが起きる気配がない。というか、記述を全部消しても平気で動作する。

intlモジュールの中を探してみると、他の箇所にはcompileという単語の入ったファイルもある。

世界の通貨などそうそう増減するものではないので、データの塊を生成してどこかに置いているような気がする。ただ肝心のそのデータが見つけられず、迷宮入りとなった。

余談だが、通貨の「JPY」とか「USD」などの3文字のアルファベットにはちゃんとISO 4217という枠組みが存在している。これを読むと1~2文字目は国の略称を入れるものらしく、特定の国に縛られない通貨は1文字目にXを指定するようだ。ビットコインはISO 4217に含まれないが、「XBT」という表記はこれを意識したものらしい(「BTC」という表記もあるが)。
ついでに書いておくと通貨には3桁の数字も割り当てられている。こちらはこの3桁のアルファベット(Alpha3という)のアルファベット順に0から999までを割り振っているようだ。へえ。

内部設定は日本円のまま表示をゴールドに変える

Twigのpriceフィルタの動作を書き換える

各ページの通貨の表記はTwigファイル内だとpriceというフィルタで制御される。

  • 通貨の記号(「¥」とか「$」とか)が付いたり
  • 3桁ごとにカンマで区切られたり
  • 例えば米ドルやユーロであれば小数点以下が現れたり

というのは全部フィルタがやってくれているのだ。

なので、「○○ゴールド」と表示させるためには、このフィルタ動作部分を書き換えてしまえばいい。
内部設定は日本円のままなので、少々悔しいがまあ仕方がない。

priceフィルタの挙動は/src/Eccube/Twig/Extension/EccubeExtensionに記述されている。

しかしこれを直接書き換えるのは止して、Customizeディレクトリにファイルを作ってpriceフィルタの動作を別途作ってやる。

/app/Customize/Twig/Extension/EccubeExtension.php

というファイルを作ってやって以下のようにコードを書いた。

PHP
<?php
namespace Customize\Twig\Extension;

use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;

class EccubeExtension extends AbstractExtension
{
  //このクラスで使えるようにするフィルターを登録する関数
  public function getFilters()
  {
    return [ new TwigFilter('price', [$this, 'getPriceFilter']) ];
  }

  //priceフィルターのオーバーライド
  public function getPriceFilter($number, $decimals = 0, $decPoint = '.', $thousandsSep = ',')
  {
    return number_format($number, $decimals, $decPoint, $thousandsSep) . 'ゴールド';
  }
}

あとはキャッシュクリアしてやれば反映される。

.envファイルに書いた通貨設定が何であっても「ゴールド」表記になる(上記の例では小数点以下の表示だったり区切り桁数は通貨設定に依存して変わる)。

正直な話、サイト運用中に通貨の種類が変わるということは考えづらいのでこれで良いだろう。

ちなみに受注メールの金額表記もバッチリ変更される。

この度はご注文いただき誠にありがとうございます。

テスト ユーザー 様

下記ご注文内容にお間違えがないかご確認下さい。

 ご請求金額
ご注文日時:2023/05/21 17:53:58
ご注文番号:3
お支払い合計:1,792ゴールド
お支払い方法:郵便振替
ご利用ポイント:0 pt
加算ポイント:0 pt
お問い合わせ:

 ご注文商品明細
商品コード:
商品名:薬草
単価:8ゴールド
数量:99

小 計:792ゴールド
手数料:0ゴールド
送 料:1,000ゴールド
合 計:1,792ゴールド
送料1000ゴールドは高くない?

惜しいところ

priceフィルタの挙動をカスタマイズすると大体所望の動作になるが、管理画面の入力欄だけは日本円仕様のままである。

価格の入力欄には円マークが表示される。「G」って表示されてほしい

これはPriceTypeというフォームなのだが、EC-CUBE完全オリジナルのクラスではなく、Symfonyが用意しているMoneyTypeの派生のようである。

こちらも、「どうせ他の通貨に変えるはずがないから」という理由でMoneyType自体を無理やり書き換えてしまって問題ないとは思うのだが、どこから変更するのかあまり判然としなかったのでやめてしまった。

/src/Eccube/Resource/template/default/Form/form_div_layout.twig や /src/Eccube/Resource/template/admin/Form/ の下に転がっているファイルをいじると良いのかもしれない。ただし一見して「ここを変えれば良い」という箇所は見つからなかった。

まあ初期状態では管理画面でしか使われていないので良しとしよう。

コメント

タイトルとURLをコピーしました