さて、最終回。今回で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つの方法がある。
- app/code配下の特殊なオートロード設定(psr-0形式)にそったディレクトリ名に書き換える。
- MAGENTO_ROOT/composer.jsonに、ネームスペースとその配置を設定してやる。
- 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.の方式でファイルを配置したものとして記述をするので、別の方法を採用された方はそれにあわせて読み替えてほしい。