SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

ECzine Day(イーシージン・デイ)とは、ECzineが主催するカンファレンス型のイベントです。変化の激しいEC業界、この日にリアルな場にお越しいただくことで、トレンドやトピックスを効率的に短時間で網羅する機会としていただければ幸いです。

最新イベントはこちら!

ECzine Day 2024 June

2024年6月6日(木)10:00~17:40(予定)

Magento開発・初歩の初歩

Magento2モジュール「あとxx円で送料無料」完成 カート内の合計金額を自動で計算するには

2015年に新バージョンが出たことなどを理由に、注目が集まるMagentoの開発について、6年の経験を持つ筆者が初歩の初歩から伝授します。今回はついに最終回!モジュール「あとxx円で送料無料」を完成させるため、カート内の合計金額を自動で計算するクラスを書きます。

 さて、最終回。今回でMagento開発の基礎の基礎を終えることにしよう。

モジュール「あとxx円で送料無料」を完成させよう

 まずは、前回作成したMagento 2向けの「あとxx円で送料無料!!」モジュールを見てみよう。

 画面を見てもわかる通り、「xx円」などと表示されていて、この段階ではなんら意味のある情報を提示していない状況だ。

 実際にカートの中に入っている情報と送料が無料になる金額の両方を取得してきて、その差額を表示してやる必要があるわけだ。

 このような差額の情報に加えて、その差額に相当するような商品をカートページに表示できたら、お客様へのサービス向上にもなるし、売上も増えるしで良いことづくしになるかもしれない。

 今回の記事でそこまではやらないが、最低限必要な「xx円」を実際の数字に置き換える作業を行っていくことにしよう。

オートローディングを機能させる

 さっそく作業をはじめよう……と言いたいところだが、ここまで説明を先延ばしにしてきた部分を先に片付けてしまうことにしよう。オートローディングの話だ。

 前回までの記事では、テンプレートファイルや設定用のXMLファイルは紹介してきていたが、ごく普通にphpのクラスファイルとして記述を行うファイルは登場していなかった。

 今回の記事に登場する.phpファイルは、同じphpファイルであるテンプレート(.phtml)とは異なり、Magento自身がローディングを担当していない部分なのだ。そのため、現段階では、せっかく作ったphpファイルを読み込んでくれないという現象になる。

 Magento 2のモジュールとしては機能しており、単純に配置した.phpファイルに対してオートローディングが動作しないというだけなのだが、Magento 1ではこのローディングの部分も含めてMagentoが担当していたため、Magento 2に乗り換えた最初のころは意識が切り替わらず混乱してしまったものだ。

 Magento 2では、Magento 1の特殊なクラス記法を改め、php5.3以降で使えるようになったネームスペースを採用している。これに伴い、Magento独自のオートロードの仕組みを廃して、新しい標準であるpsr-4(含むpsr-0。http://www.php-fig.org/psr/psr-4/ を参照のこと)を採用することとなった。

 ここまで記事内で記述してきたファイル配置において、正しくクラスオートローディングを機能させるためには以下の3つの方法がある。

  1. app/code配下の特殊なオートロード設定(psr-0形式)にそったディレクトリ名に書き換える。
  2. MAGENTO_ROOT/composer.jsonに、ネームスペースとその配置を設定してやる。
  3. composer標準のvendor配下にファイルを再配置する。

 ネット上の情報では、1.を使用して説明しているものが大半をしめているようだが、すでにpsr-0がdeprecatedとマークされてしまっている以上、お勧めするのはどうかという気がしている。

 とはいえ、知っておくべき情報であることは間違いないので、ひととおり簡単に記述しておこう。

1.app/code配下に設定済みのオートロード設定(psr-0形式)にそったディレクトリ名に書き換える。

 MAGENTO_ROOTにあるcomposer.jsonの中に、以下のようにautoloadのpsr-0として記述が行われている。

"autoload": {
  "psr-4": {
    "Magento\\Framework\\": "lib/internal/Magento/Framework/",
    "Magento\\Setup\\": "setup/src/Magento/Setup/",
    "Magento\\": "app/code/Magento/"
  },
  "psr-0": {
    "": "app/code/"
  },
  "files": [
    "app/etc/NonComposerComponentRegistration.php"
  ]
},

 ネームスペースのルートから、ディレクトリ名をネームスペースとして区切っていけば、ロードするファイルが見つけられるという意味の記述になっているわけだ。

 そのため、元々app/code/ecgiken/module-freeshippingbyに配置していたものを、今回使用するネームスペース(ECGiken\FreeShippingBy)にあわせてapp/code/ECGiken/FreeShippingByにしてやればよい。

 もっとも簡単な方法で、ネット上の説明でもこの方式を使っているものがほとんどだ。

2.MAGENTO_ROOT/composer.jsonに、ネームスペースとその配置を設定してやる

 今回使用するネームスペースは、先程も書いたとおり、ECGiken\FreeShippingByとなる。

 ネームスペースのルートからECGiken\FreeShippingByとなっているクラスについては、app/code/ecgiken/module-freeshippingbyを見ろという指示を書いてやればよい。 composer.jsonの一部を修正することになる。

"autoload": {
"psr-4": {
"Magento\\Framework\\": "lib/internal/Magento/Framework/",
"Magento\\Setup\\": "setup/src/Magento/Setup/",
"Magento\\": "app/code/Magento/",
"ECGiken\\FreeShippingBy\\": "app/code/ecgiken/module-freeshippingby/"
},
"psr-0": {
"": "app/code/"
},
"files": [
"app/etc/NonComposerComponentRegistration.php"
]
},

 上記の赤字部分を追加した後、composerにて、オートロードの調整を行うコマンドを実行する。

$ composer dump-autoload

 この方法は、開発時にしか使用しないディレクトリをプロジェクト全体で共有するはずのcomposer.jsonに直接記述してしまうため、配布の際に注意が必要になるなど、ややおすすめ度が低いのではないかと感じている。

3. composer標準のvendor配下にファイルを再配置する。

 手順はめんどうだが、私のような開発者サイドから見て一番素直に感じる方法。開発段階から配布へとそのまま移行できることもおすすめとなる方法だ。

 前回までの記事で作成したファイルは、以下のgithubリポジトリに登録しておいた。これをそのまま、composerが扱えるように設定してしまうという話だ。

https://github.com/hosokawa/ecgiken2-freeshippingby

 もちろん、このリポジトリから自分のリポジトリにcloneしてもらって、そちらを設定するのでもかまわない。

 2.と同様、composer.jsonの書き換えが発生するが、こちらはプロジェクトで共有するべき情報(開発時、配布時ともに)を登録するわけなので、2.とは異なり、逆におすすめするべきポイントになるのではないだろうか。

 ここまで作成してきたファイルは、前述のgitリポジトリに登録済みなので、手元においてあるファイルはディレクトリごと削除してしまおう。

$ rm -rf app/code/ecgiken/module-freeshippingby

 MAGENTO_ROOT/composer.jsonのrequireブロックに、モジュールを追加してやろう。

"require": {
"magento/product-community-edition": "2.1.0",
"composer/composer": "@alpha",
"ecgiken/module-freeshippingby": "dev-master"
},

 赤字で示した部分が、追加するべきものとなる。 ここでは、masterブランチの先頭を取得してもらうため、バージョンをdev-masterとしている。バージョンの付けかたなどはcomposerの領域になってくるのでここでは詳述しないが、プロジェクトにあわせた運用をしてほしい。

 なお、ecgiken/module-freeshippingbyモジュールは野良モジュールなので、composerにどこにリポジトリが存在するかを教えてやらないといけない。 修正するのは、repositoriesブロックだ。

"repositories": [
{
"type": "composer",
"url": "https://repo.magento.com/"
},
{
"type": "vcs",
"url": "https://github.com/hosokawa/ecgiken2-freeshippingby.git"
}
],

 上記修正が完了したら、composerコマンドの出番だ。

$ composer update

 インストールした時期によっては、今回作成中のモジュール以外にも更新が走るかもしれないが、そこは気にせず更新してしまおう。コマンドが実行完了したら、モジュールの更新をMagentoに伝えてやろう。

$ php bin/magento setup:upgrade

 以上で、vendor配下に作成中のモジュールが配置されたことがわかるはずだ。 これ以降、3.の方式でファイルを配置したものとして記述をするので、別の方法を採用された方はそれにあわせて読み替えてほしい。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
計算するために必要な情報はどこにある?

この記事は参考になりましたか?

  • Facebook
  • Twitter
  • Pocket
  • note
Magento開発・初歩の初歩連載記事一覧

もっと読む

この記事の著者

株式会社EC技研 細川哲一(ホソカワ テツイチ)

株式会社EC技研所属。社会人になりたてのころWnnの開発者たちに仕込まれた生粋のオープン系技術者。プロジェクトBLUEなどと言うものにも参加してた頃にはUsogresなんぞという怪しいソフトを開発。好きなことばかりやってたせいで自分で起こした会社を潰してみたりとムチャぶりを発揮しつつ「ECやらんか?」と誘わ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

株式会社トライアウト 藤江信之(フジエ ノブユキ)

株式会社トライアウト所属。コードは書けるが人とうまく付き合えず仕事がまわらない細川を見かねて手助けに入る。ウェブディレクターという肩書を持っている割にはやっていることは営業中心。Magentoの面白さにとりつかれ現在Magento啓蒙活動中。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事をシェア

ECzine(イーシージン)
https://eczine.jp/article/detail/3553 2016/09/23 08:00

Special Contents

AD

おすすめ

アクセスランキング

アクセスランキング

イベント

ECzine Day(イーシージン・デイ)とは、ECzineが主催するカンファレンス型のイベントです。変化の激しいEC業界、この日にリアルな場にお越しいただくことで、トレンドやトピックスを効率的に短時間で網羅する機会としていただければ幸いです。

2024年6月6日(木)10:00~17:40(予定)

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング