Magentoでの理解できないエラーのデバッグ

Magentoのモジュールのすべての開発者は、すべてが正しく行われているように見えても、動作しない状況に陥りました。 これは典型的な状況に特に当てはまります。ルーターを作成し、404ページを提供し、レイアウトを作成しますが、コンテンツは表示されず、テンプレートを作成し、ページは空のままです。 このような状況の特徴は、原則として、Magentoがそれらに反応しないことです(エラーは生成されず、ログは空のままです)。 この記事で説明するこのようなエラーのデバッグについてです。



同様の状況で多くの苦しみを受けた私は、開発のヒントとモジュールのデバッグ方法の小さなコレクションをまとめて、そのようなトラブルに迅速に対処できるようにしました。 特に初心者には便利ですが、経験豊富な開発者は自分で新しいものを見つけることができます。



さあ、行こう!



ルーターとコントローラーを作成しましたが、Magentoは404ページを表示します



なぜこれが起こっているのですか:


ほとんどの場合、コントローラークラスを含むファイルの名前が間違っており、パスがクラス名と一致していない、クラス名が正しくない、および同様のエラーが発生しています。 不注意による単なるタイプミスかもしれませんが、MagentoがリクエストをfrontName、controllerName、actionNameに変換する方法を完全に理解していない場合があります。 この場合、コントローラーの名前の決定に関するAlan'a Strom'aの記事を読むことをお勧めします。



初心者向けに行うべき唯一の明確化は、コントローラのフォルダではなくそのサブディレクトリにあるページアドレスにコントローラの名前を入力する方法です。 とても簡単ですが、時には問題になることもあります。



そのため、「Namespace_ModuleName_」と末尾の「Controller」という語の間にあるコントローラーの名前の一部を取り、小文字にする必要があります。 たとえば、Namespace_ModuleName_Subfolder1_Subfolder2_IndexControllerという名前の場合、アドレス行のコントローラーの名前は次のsubfolder1_subfolder2_indexになります。



デバッグ方法:


そのため、コントローラーの名前がどのように決定されるかについては熟知していますが、それでも404ページが表示されます。 これが発生した場合は、おそらくコントローラーのあるファイルを間違ったフォルダーに配置したか、ファイル自体に間違った名前を付けました。 これを確認する最も簡単な方法は、Magentoが探しているコントローラーへのパスを取得することです。 これを行うには、Mage_Core_Controller_Varien_Router_Standardクラスに移動し、そこで_validateControllerClassName()メソッドを探します。 このメソッドでは、コントローラーへの完全なパスを取得します。それを引き出して確認するだけです。



関連するコードは次のとおりです。



protected function _validateControllerClassName($realModule, $controller) { $controllerFileName = $this->getControllerFileName($realModule, $controller); var_dump($controllerFileName); die(); // added line if (!$this->validateControllerFileName($controllerFileName)) { return false; } // … }
      
      





現在、Magentoは404ページではなく、コントローラーへのパスを提供します。 私たちは修正し、喜んでいます。



パスにNamespace / ModuleNameの代わりにMage / Core / ...が含まれている場合、config.xmlでルーターを定義していないか、間違っています。 これを正しく行う方法については、 Alan'a Strom'a による同じ記事のすべてを読んでください。



さらに表示されるエラーには、コントローラーファイルは読み込まれましたがクラスが存在しないことが予想されます。つまり、ファイルにコントローラーの名前を誤って入力したか、致命的なエラーが発生しました。フロントエンドのベースコントローラーMage_Core_Controller_Front_ActionとバックエンドのMage_Adminhtml_Controller_Actionを継承することを忘れていたことに注意してください。



ルーター、コントローラー、およびメソッドを作成しましたが、フープページが表示されます。



なぜこれが起こっているのですか:


非常にまれで修正が容易なバグ。 これは、リクエストするメソッドがコントローラーに含まれていないことを意味します。



デバッグ方法:


メソッドの名前を確認してください。名前が正しくない可能性が高いため、メソッド名の後にActionを追加するのを忘れた可能性があります。



一部のxmlファイルがロードされていないか、どのファイルがロードされているかを確認したい



なぜこれが起こっているのですか:


xmlファイルがロードされない理由はたくさんありますが、このトピックでそれらを検討しても意味がありません。 すべての場合の解決策はまったく同じであるため、そのまま進みます。



デバッグ方法:


特定のxmlファイルがロードされているかどうかを確認する最も簡単な方法は、それを無効にすることです。 ファイルに追加のユニットを追加しましょう。



 <1?xml version="1.0"?>
      
      





これで、ページに移動すると、xmlファイルの読み込みエラーに関するメッセージが表示されます。 このメッセージが存在しない場合、ファイルは実際にはロードされていません。 どのxmlファイルがロードされないのかは、別の記事のトピックであり、ここでは考慮しません。



質問の2番目の部分は、どのxmlファイルがまだロードされているかを調べることです。 これを行う1つの方法は、lib / Varien / Simplexml / Config.phpファイルに数行を追加することです。 loadFileメソッドを探しています。このメソッドは、すべてのxmlファイルをロードし、それにいくつかの行を追加します。



 public function loadFile($filePath) { if (!is_readable($filePath)) { //throw new Exception('Can not read xml file '.$filePath); return false; } // added lines $log = fopen("***      magento***/var/log/xml.log", "a"); fwrite($log, "Loading XML file: $filePath\n"); fclose($log); // ... }
      
      





サーバールートからMagentoがインストールされているディレクトリへのパスを入力することを忘れないでください。 また、指定したパスにxml.logファイルを作成します。 これで、ページが要求されたときにロードされたすべてのxmlファイルのリストが、指定されたログファイルに書き込まれます。



ログはすぐに印象的なサイズに達するため、これらの行を常にオンにしないでください。 再び必要になるまで、コメントアウトするだけです。



レイアウトファイルを接続し、ブロックにハンドルを追加しましたが、ページは空のままです



最初に、いくつかのコードを示します。



 app/code/local/TestCompany/TestModule/etc/config.xml <?xml version="1.0"?> <config> <frontend> <layout> <updates> <testmodule> <file>testmodule.xml</file> </testmodule> </updates> </layout> </frontend> </config>
      
      





ここに、レイアウト付きのファイルを含めます。 ファイル自体は次のとおりです。



 app/design/base/default/layouts/testmodule.xml <?xml version="1.0"?> <layout version="0.1.0"> <testmodale_index_index> <reference name="root"> <action method="setTemplate"><template>page/2columns-right.phtml</template></action> </reference> <reference name="content"> <block type="core/template" name="testmodule.mainpage" template="testmodule/page" /> </reference> </testmodale_index_index> </layout>
      
      





このファイルにはいくつかの一般的なエラーが含まれていますが、少し後で説明します。 それまでの間、すべてがこのファイルに正しく書き込まれているとします。 テンプレートファイルも作成します。



 app/design/base/default/templates/testmodule/page.phtml <p>Test content.</p>
      
      





したがって、このクリーンなページの理由とその解決策は次のとおりです。



  1. レイアウトをロードする必要があることをコントローラーメソッドで示すのを忘れていました。

    コントローラーには、次のコード行が含まれている必要があります。



      $this->loadLayout(); $this->renderLayout();
          
          





  2. レイアウト付きのファイルがロードされていません。

    前の段落ですでに知っているこのバージョンの確認方法。



  3. レイアウトのあるファイルのハンドル名が無効です。

    これは、この例で犯した間違いの1つです。 例では、これは単なるタイプミスであり、testmoduleでtestmodaleを修正する必要がありますが、場合によっては、あるページのハンドルを誤って定義したことが起こります。 最も簡単な解決策は、Magentoが現在のページにロードするコンテンツを持つすべてのハンドルを表示することです。 これを行うには、コントローラーメソッドに次のコード行を追加します。



      $this->loadLayout(); var_dump($this->getLayout()->getUpdate()->getHandles()); die(); $this->renderLayout();
          
          





    この例では、ハンドルの1つは、指定したtestmodule_index_indexです。



  4. テンプレートの名前またはパスが正しくありません。

    これは、この例での2番目の間違いです。 コードの作成者は、テンプレートファイルの.phtml拡張子を指定するのを忘れていました。 このような問題をデバッグするには、いわゆるテンプレートパスヒントを含めます。 これは、Magentoのバックエンドで実行できます。 [システム]-> [構成]-> [開発者]に移動します。 メインWebサイトの左上隅で選択します。 これで、[デバッグ]タブに2つの追加フィールドが表示されます。 テンプレートパスヒントを有効にする必要があります。 ページに入ると、Magentoがページに接続するテンプレートが配置されているパスが表示されます。


もちろん、これらはMagento用のモジュールを開発するときに発生する可能性のあるすべての問題ではありませんが、少なくとも初心者にとって最も頻繁で理解できない問題は、あまり理解できなくなることを願っています。 コメントであなたのヒントを共有することを忘れないでください。



All Articles