簡単解決!Magento でエクステンションのコンフリクトがおきたときの対処法

Magentoに複数のエクステンションが入っていると、かなりの高確率でコンフリクト、いわゆる”ぶつかり”が起きてしまいます。

Magentoにおけるコンフリクトについてわかりやすく説明しているページがありますので、英語が読める方はこちらをどうぞ。

Magento Certification: Basics – Resolving Module Conflicts

上のページを超絶簡単にいうと、上記のコンフリクトには大きく3種類あり、これを解消してあげれば、万事解決!ということです。

1.Configのコンフリクト

二つの異なるModuleが同じClassの従属関係にある場合。

2.Classのリライトコンフリクト

Magentoは二つの異なるExtentionで同じClassを継承していると、片方が上書きされてしまう という特性があります。

3.テンプレートのコンフリクト

二つのエクステンション間で.phtmlがコンフリクトを起こす場合。

今回は私が直面した2のClassのリライトコンフリクトについてどうやって対処したかを記します。なぜ2かと思ったかというと、エラーにそれっぽく書いてあったからです。

エラーの出し方は管理画面でシステム-設定-開発者向けとすすみ、”ログ設定”というタブを開き、”有効”をYesにします。

すると、エラー時には、MagentoRootDirectory/var/log/exception.log かsystem.log に何かかかれます。

それを見れば上記3つのうちどれっぽいかわかると思います。

話は戻り、今回コンフリクトがおきてしまったエクステンションは下記の二つ。
1.Multi warehouse
2.principle-worksさんが無料で提供されている rack-jp-core

商品詳細ページを表示しようとすると、404エラーが起きてしまいました。

exception.logに書かれていたのは下記。

exception 'Varien_Exception' with message 'Invalid method Rack_Jp_Core_Model_Sales_Quote_Address::isShippingAddressType(Array
(
)
)' in /var/www/html/saneico.com/lib/Varien/Object.php:653

こんなときは2つのステップを踏みます。

ステップ1:コンフリクトが起きている場所を確定
ステップ2:コンフリクトをなくす

当たり前だろっていう感じですが、当たり前です。

じゃあこれをどうするかを順を追って説明します。

かなり簡単なので、拍子抜けしてください。僕は何も知らずにソースとにらめっこして2日くらい使ってしまいましたが、この記事を見つけた人はラッキーです。

コンフリクト発見用エクステンションを入れる

Magentoにはコンフリクトを発見してくれる便利なエクステンションあります。

こちらからダウンロードできます。
Modules Conflict Detector

2015年5月16日時点で最新のMagento1.9.1にも対応しています。

まず、Magento Connectでこのエクステンションをインストールします。インストール後は念のためCacheのクリアと管理画面のログアウト、ログインをします。

すると、管理画面に システム-Alekseon Tool というリンクが現れます。

クリックするとこのように、どこでコンフリクトが起きているかがわかります。赤文字が入っている行が該当クラスです。
conflict1

コンフリクトを解消する

片方のクラスがCoreのクラスを継承(extend)したのに、もう一方がまた同じCoreクラスを継承し手上書きしてしまったことがコンフリクトの原因です。

それならば、どちらかのクラスでもう一方を継承すればいいんじゃないか ということです。

例えば、
Mage_Sales_Model_Mysql4_Order_ShipmenクラスがInnoexts_Warehouse_Model_Mysql4_Sales_Order_ShipmentとRack_Jp_Core_Model_Mysql4_Sales_Order_Shipmentの両方から継承されて、コンフリクトが起きている場合、

[crayon]
class Rack_Jp_Core_Model_Mysql4_Sales_Order_Shipment extends Mage_Sales_Model_Mysql4_Order_Shipment
[/crayon]

と書かれているのを、

[crayon]
class Rack_Jp_Core_Model_Mysql4_Sales_Order_Shipment extends Innoexts_Warehouse_Model_Mysql4_Sales_Order_Shipment
[/crayon]

と変えてあげます。

すると、どちらのクラスに入ったMethodも上書きされず使えるので、エラーが解消されるというわけです。

これをコンフリクトが起きているクラスすべてにやると、こんな感じで全部緑になってくれます。
conflict2

例によって、キャッシュをクリアして、念のため、ブラウザのキャッシュもクリアして確認したら、素敵なことが起きています。

IDEにはPHPStormが便利!

かたくななくらいメモ帳開発が好きな私ですが、とうとう開発ツールに手を出しました。

というか、構成ファイルが3万ともいわれるMagentoを初心者がメモ帳だけで立ち向かおうなんて、裸で鬼が島に行くようなものです。。

ということで、IDEを探していたのですが、どうやらPHPStormというのがアツイ! ヤバイ!というレビューが多い。

日本ではあまり聞かないのは文献がほとんど英語だからだと思います。

eclipseよりも動きが軽く、さくさく動きます。Magentoはもとより、WordPress,Drupalといったメジャーなオープンソースパッケージ用のエクステンションがあるのがすばらしいです。

商用利用の場合は有料ですが、199ドル/年 くらいだし、開発効率がグッとあがるなら得な買い物だと思います。(個人開発者なら$99、学生は無料などいろんなプランあり)

2015-05-16 15_51_17-PhpStorm __ Licensing and Renew

お試し版もあるので、気になる方はどうぞ。

PHPStorm本体

https://www.jetbrains.com/phpstorm//

Magicento(Magento用エクステンション)

http://magicento.com/

画面は、VisualStudioとかeclipseと似てるのでとっつきやすいと思います。
2015-05-16 15_46_55-

まとめ

解決してしまえば、どうってことないエラーでしたが、2年ぶりくらいにあせりました。でもこういう経験すると知識がグッと増えますよね。

今回はClassリライトにまつわるエラーの解消法のみ紹介しましたが、ほかの二つはまた出たときに追記します。

© 2024 みる米技術部 Powered by AFFINGER5