0

私は2番目のMagentoモジュールを開発しています。このモジュールは、いくつかのデータを取得し、それを含むブロックをレンダリングする必要があります。そのようなブロックは、他のページで使用されます。

現時点では、モジュールのほぼ全体が配置されていますが、何らかの理由で、コントローラーメソッドを呼び出してもブロックがレンダリングされません。デバッグ情報を入力すると、ブロックのメソッドが正しく呼び出されていることがわかり__construct()ましたが、テンプレートが読み込まれていないようで、返されたページが空白になっています。

別のモジュールからコピーして変更したブロックのコードは次のとおりです。

class Company_CustomerData_Block_CustomerSummary extends Mage_Core_Block_Template {
    const _TEMPLATE = 'customerdata/customersummary.phtml';

    public function __construct() {
    // This method is called correctly
        parent::_construct();
        $this->setTemplate(self::_TEMPLATE);
    }
}

ファイルcustomersummary.phtmlapp/design / frontend / base / default / template / customerdataにあり、これは正しい場所である必要があります(または、少なくともそうだと思います)。その内容は次のとおりです。

It works!

プレーンテキストです。タグもコードも何もありません。静的なテキストであってもかまいません。完了するとデータが入力されます。

必要に応じて、コントローラーのコードを次に示します(データが取得される部分は、違いがないため、削除しました)。

public function dashboardAction() {
    // Customer Data to render in the block
    $CustomerData = array(); // Data is retrieved elsewhere

    $this->getResponse()->setBody(
        $this->getLayout()->createBlock('customerdata/customersummary')
        ->toHtml()
    );
}

何が間違っているのでしょうか?もう一度バカなミスをしたのではないかと思いますが、本当に見えません。

最後にさらに2つの質問:

  • コントローラで取得したデータをテンプレートに渡すにはどうすればよいですか?具体的には、変数$CustomerData
  • ブロックがレンダリングされたら、ページ内からコンテンツをレンダリングするにはどうすればよいですか?ブロックは、いくつかのものが含まれているを返す必要があります。カスタマーダッシュボード内の、すでに存在する情報のすぐ下にレンダリングしたいと思います。

助けてくれてありがとう。

4

2 に答える 2

3

Magneto のほとんどのクラスは から派生しVarien_Objectます。 Varien_Object(そしてその子孫) は、PHP のコンストラクター ( __construct) を自分自身で要求し、_construct好きなように使用できるコールバックを提供します。これが意味することは、ネイティブ PHP コンストラクター ( __construct) をオーバーライドする場合、いくつかのことを覚えておく必要があるということです。

  1. 基本クラスと同じ数のパラメーターを受け入れ、そして...
  2. parent::__constructコンストラクターに指定されたパラメーターを使用して、親コンストラクター ( ) を呼び出します。

または、代わりに、Varien_Object によって提供される _construct コールバックを使用すれば完了です。parent::_constructMagento コールバックを使用している場合は、忘れずに呼び出す必要はありません。

したがって、上記のコード スニペットを修正するには、次のいずれかを変更できます...

public function __construct() {

... に ...

public function _construct() {

これにより、Magento コールバックの使用が切り替わります。それとも変えられる...

parent::_construct();

.. に ...

parent::__construct();

... 親クラスのコンストラクターを呼び出します。親クラスが提供するパラメーターを追加することを忘れないでください。

Alan Stormは最近、Magento のブロック ライフサイクルとコールバック メソッドに関する素晴らしい記事を書いています。

あなたの他の質問に:

  • コントローラーからブロックへの情報の受け渡しは、通常、Magento のレジストリを介して行われます。
  • テンプレートをページの一部としてレンダリングするには、ブロックをロードして親ブロック内に配置するレイアウト命令 (XML で記述) を作成する必要があります。
于 2012-07-25T05:10:25.587 に答える
2

ジムの回答は正しいですが、他に何が間違っているかがわかったので、2 番目の部分を追加します:シンボリック リンク。フレームワーク用のプラグインを開発するときに通常行うように、シンボリックリンクを使用して、ファイルを何度もコピーしないようにしています。ただし、Magento は functionRealPath()を使用し、シンボリック リンクをフル パスに解決します。その結果、ロードされるテンプレート ファイルは Magento のインストール ディレクトリ外のパスに存在し、セキュリティ上の理由からロードできません。これは完全に理にかなっていますが、あまり目立たないのが残念です。

この問題を解決するために、開発用 PC の構成で [シンボリック リンクを許可する] を有効にしたところ、テンプレートが読み込まれ、正しくレンダリングされるようになりました。

Magento は、管理者インターフェースでログ ビューアーを使用できると思います。それを行うモジュールがまだない場合は、おそらく自分で作成する必要があります。

助けてくれてありがとう。

于 2012-07-25T14:35:47.787 に答える