2011-01-16 6 views
1

Magentoで独自のカスタムモジュールを作成していて、Litespeedサーバー(PHP v5.2.14)でテスト中にテスト中に表示されないFatal Error: Call to a member function batch() on a non-object in ../../../BatchController.php on line 25が表示されています別のLinuxサーバとWampサーバ(PHP v5.2.11)。1つのサーバー上のカスタムMagentoモジュールで致命的なエラーが発生しました

この1つは私を困らせました。私はそれがコード自体ではなく、サーバーの設定と関係があると推測しています。しかし、私はちょうど推測です。誰かが私に教えてくれることを願っていました。

phpのバージョンと環境を除いて、唯一の大きな違いは、エラーが発生しているサーバーがSuhosinパッチを使用していることです。しかし、これが原因かもしれませんか?

問題の行はIF文に囲まれたMage::getModel('mymodule/mymodel')->batch();です。 batch()は、私のモデルファイルにあるパブリック関数です。

もっとコードが必要な場合は教えてください。

ありがとうございます!

+0

あなたはそれが問題になっているラインである100%よろしいですか?決定'remove()'がそこにあるはずですから。正しいファイルを探していることを100%確信していますか? –

+0

私は100%確実です。同じ方法で呼び出された別の関数が発生したかどうかを確認していたので、 'remove()'がそこにありました。 – Jack

答えて

1

モデルを呼び出すときに「非オブジェクト」エラーが発生した場合、Magentoがモデルクラスを取得しようとすると問題が発生し、nullが返されます。この理由は必ずしも明らかではありません。これが通常のLAMPスタック上で同じように機能する場合、問題はあなたのコードではない可能性が高いです。

私の最初の推測は、ファイルに適切な権限がないことです。それ以外の場合は、クラス名を解決する必要があります。あなたはこのように直接プラグインを呼び出すことによって、一時的にこれをテストできます。

$obj = new Mynamespace_Mymodule_Model_Mymodel(); 
$obj->batch(); 

これが動作する場合、そのファイルは読み取り可能である、とあなたはそのクラス名の解像度で洞窟探検に行くことになるでしょう。うまくいかない場合は、オートロードまたはクラスの宣言に問題があります。

希望に役立ちます!

おかげで、 ジョー

+0

@Joe:上記の方法をすべて使用すると動作します。あなたは "そのクラスネームの解決のために精一杯"を精緻化することができますか?上記のコード生成を使用するだけで何が問題になるでしょうか?本当にありがとう! – Jack

+0

コードがあなたに役立つことをうれしく思っています。それを使用することに対する議論は、あなたが今Magentoを完全に避けてしまったことです。あなたの問題がどこにあるクラス名を取得するかに関するAlanのコードを見てください。あなたの設定は読まれていません(少なくともあなたが思っている方法ではありません)。開発中に修正する必要があります。 –

1

ブレイクそれを下に。

あなたは

Mage::getModel('mymodule/mymodel')->batch(); 

を呼び出すようにしようとしたとPHPはそれが非オブジェクト方法バッチを呼び出そうとしましたことを言いました。つまり、Modelオブジェクトは想定されたとおりに返されません。

Mage::getModel('mymodule/mymodel') 

まず、問題が発生しているサーバーのMagentoキャッシュをクリアしてください。モジュールの設定がグローバル設定ツリーにロードされていない場合MagentoはMage_Core_Model_Mymodelをインスタンス化しようとし、失敗します。

2番目の手順は、モジュールのapp/etc/moduleファイルが適切に配置されていることを確認することです。

第3ステップは、デバッグを追加することです(1と仮定します)。あなたのオブジェクトをインスタンス化する方法に4分岐)と Magentoのは、あなたのオブジェクトを作成することができない理由

File: app/code/core/Mage/Core/Model/Config.php 
... 
public function getModelInstance($modelClass='', $constructArguments=array()) 
{ 
    $className = $this->getModelClassName($modelClass); 
    if (class_exists($className)) { 
     Varien_Profiler::start('CORE::create_object_of::'.$className); 
     $obj = new $className($constructArguments); 
     Varien_Profiler::stop('CORE::create_object_of::'.$className); 
     return $obj; 
    } else { 
     #throw Mage::exception('Mage_Core', Mage::helper('core')->__('Model class does not exist: %s.', $modelClass)); 
     return false; 
    } 
} 
...  
+0

ヒントをありがとう。私は運がないとキャッシュをクリアしました。すべてのファイルが正しい場所にあります。 getModelInstanceを使用すると、falseを返します。 – Jack

+0

@Jack:そこにデバッグコードを追加して、それがなぜfalseを返すのかを理解します。変数 "$ className"にある文字列を確認してください。メソッドがfalseを返す場合は、そのクラスが存在しないためです。 –