0

やっと 2 番目の Magento モジュールの「レンダリング」フェーズに到達しましたが、また行き詰まりました。モジュールはこれでほぼ完成です。Controller と 2 つのブロックがあり、そのうちの 1 つは最初のブロックによって呼び出されます (1 つはダッシュボード ブロックで、2 番目のブロックを使用してサブセクションにデータを入力します)。

次に、この新しいダッシュボードを顧客アカウント ダッシュボードに追加する必要があります。レイアウト ファイルを使用するように言われ、Magento Design Guide でそれらについて読みました。次に、レイアウト ファイルを作成し、その中にブロックの宣言を追加しました。ただし、ダッシュボードは変更されず、私のデータは表示されません。拡張メソッド (つまり、myserver/customerstats/index) を手動で呼び出すと、顧客アカウント ページに表示したい HTML のスニペットが返されます。

最初はレイアウト ファイルが読み込まれていないと思っていましたが、正しく処理されていることを確認できました (少なくともその一部)。レイアウトファイルは次のとおりです。

<layout version="0.1.0">
    <customer_account_index translate="label">
        <label>My Custom Dashboard</label>
        <reference name="customer_account_dashboard">
            <!-- The action is processed correctly, the template is overridden -->
            <action method="setTemplate"><template>customerstats/customer/account/dashboard.phtml</template></action>
            <block type="customerstats/index" name="customerstats_dashboard" as="customerstats.dashboard" template="customerstats/customerstatsdashboard.phtml" />
        </reference>
    </customer_account_index>
</layout>

要件の 1 つは、新しいダッシュボードが垂直方向に 2 つの部分に分割されることであるため、setTemplate アクションをレイアウト ファイルに追加しました。つまり、元のcustomer/account/dashboard.phtmlを変更し、ページの構造を変更して、必要に応じてスタイルを設定する 2 つのセクションを追加する必要がありました。これが正しい方法かどうかはわかりませんが、.phtml ファイルに触れずに、ページの特定の部分に追加を追加する方法がわかりませんでした。

新しいdashboard.phtmlを変更して、それが読み込まれたことを確認しました。アクションを有効にすると、変更内容を示す顧客アカウント ページが表示されます。ただし、拡張機能によってレンダリングされる必要があるブロックがページに表示されず、単純な「トラップ」(コードが実行されたことを証明するための単純な「die()」) に基づいて、拡張メソッドは表示されません。呼ばれているようにも見えます。

関係のない部分を削除して、ブロックから呼び出そうとしているコントローラーを次に示します。

class MyCompany_CustomerStats_IndexController extends Mage_Core_Controller_Front_Action {
    // The loaded block is setting its own template in the _construct() phase
    $Block = &$this->getLayout()->createBlock('customerstats/customerstatsdashboard');

    // Some data is loaded elsewhere and passed to the Block

    $this->getResponse()->setBody(
        $Block->toHtml()
    );
}

コントローラーを手動で呼び出すと (myserver /customerstats/index)、コントローラーは適切に起動され、完全にレンダリングされた HTML が返されますが、最初に述べたように、レイアウト ファイルが有効になると実行されないようです。

要約すると、ここに私の質問があります:
- 顧客アカウント ダッシュボードのオーバーライドに関して、正しい方向に進んでいますか?
-拡張機能のレイアウトでテンプレート属性を指定する必要がありますか? 私が実装したすべてのブロックは、コードを介してテンプレートをロードします (使用するブロックを選択するためのロジックがあります)。また、xml ファイルにテンプレートを指定することの使用も見当たりません。
- ブロックを XML ファイルに追加したら、dashboard.phtml ファイルを変更してどこかにレンダリングする必要がありますか? 元のダッシュボード テンプレートを見たので質問しています。そこにはさまざまな呼び出しが含まれています。getChildHtml('alias name of a block'). これにより、ブロックをレイアウト ファイルで「公開」するだけでなく、.phtml ファイルで手動で呼び出す必要があると考えるようになりました。ただし、メカニズムがよくわかっていないので、これは憶測です。getChildHtml('customerstats.dashboard):新しいdashboard.phtml内でも呼び出してみましたが、何も変わりませんでした。

すべての回答に感謝します。

更新 1 - 2012/07/28
これはレンダリングされないブロックのコードです。

class MyCompany_CustomerStats_Block_UserStatsDashboard extends Mage_Core_Block_Template {
    const _TEMPLATE = 'customerStats/userstatsdashboard.phtml';

    public function _construct() {
        $this->setTemplate(self::_TEMPLATE);
    }
}

また、コントローラー自体で実験を行いました。次のように変更しました。

class MyCompany_CustomerStats_IndexController extends Mage_Core_Controller_Front_Action {
    die('Controller called successfully.');
}

結果は次のとおりです: - ブラウザから "myserver/customerstats/index" を呼び出すと、"Controller called successfully." というメッセージが表示されます。- 変更したダッシュボード ページを読み込むと、新しいレイアウト (ダッシュボードが読み込まれていることを意味します) は表示されますが、メッセージは表示されません。私にとって、これはコントローラーが呼び出されなかったことを意味します。

Config.xmlの内容

<?xml version="1.0"?>
<config>
    <modules>
        <MyCompany_CustomerStats>
            <version>0.1.0</version>
        </MyCompany_CustomerStats>
    </modules>
  <global>
    <helpers>
      <CustomerStats>
        <class>MyCompany_CustomerStats_Helper</class>
      </CustomerStats>
    </helpers>
    <models>
      <CustomerStats>
        <class>MyCompany_CustomerStats_Model</class>
      </CustomerStats>
    </models>
    <blocks>
      <CustomerStats>
        <class>MyCompany_CustomerStats_Block</class>
      </CustomerStats>
    </blocks>
  </global>

  <frontend>
    <routers>
      <CustomerStats>
        <use>standard</use>
        <args>
          <module>MyCompany_CustomerStats</module>
          <frontName>userstats</frontName>
        </args>
      </CustomerStats>
    </routers>
        <layout>
        <updates>
          <CustomerStats>
                  <file>customerstats.xml</file>
                </CustomerStats>
          </updates>
        </layout>
  </frontend>
</config>

更新 2 - 2012/07/28
MVC の観点からはまったく意味のない実験を行いました。レイアウトを変更し、ブロックタイプをcustomerstats/userstatsdashboardに指定しました。次に、Block クラスMyCompany_CustomerStats_Block_UserStatsDashboardを次のように変更しました。

public function _construct() {
    echo "Block rendered.";
}

驚いたことに、新しいレイアウトに何かが表示されるようになりました。ただし、これは Controller がまったく呼び出されていないことを意味し、ブロックで使用できるデータがないことを意味します。
これは本当に私を困惑させます.ビューが自分自身を管理するMVCモデルを見たことがありません...では、拡張機能のコントローラーの目的は何ですか?

4

2 に答える 2

3

あなたのブロック クラス グループはCustomerStatsですが、レイアウトでこれを使用していません。ブロック クラス グループは単純にその下の一意のテキスト ノードでglobal/blocksあり、フォルダー構造を「一致させる」必要はまったくありません(参考までに)。この文字列は、 への呼び出しの最初の部分 (スラッシュの前) に一致するという点でのみ重要ですcreateBlock()。つまり、レイアウト XML で指定する必要があります。type="CustomerStats/whatever"

上記の例では、生成されるクラス名MyCompany_CustomerStats_Block_Whateverはクラス プレフィックスのMyCompany_CustomerStats_Block.

于 2012-07-28T16:04:46.447 に答える
1

例外を考慮しないと、2 種類のブロックがあります。Acore/text_listおよびその他すべてのタイプ。core/text_listたとえばブロックを参照すると、content追加されたすべてのブロックが自動的にレンダリングされます。

とは異なるものを参照するcore/text_list場合、あなたの場合customer/account_dashboard、テンプレート内から自分でコンテンツを取得する必要があります。これは、あなたがすでに提案したように、getChildHtml()電話で行うことができます。

これまでに提供されたコードでこれを確認することはできませんが、間違っている可能性があるのは、独自のcustomerstats/indexブロック タイプがモジュール内に見つからないか、拡張されていないことMage_Core_Block_Templateです。または、存在しないクラスグループを createBlock ファクトリ メソッドに渡しています。

したがって、モジュール内には次のようなものがあるはずです。

    <blocks>
        <customerstats>
            <class><your_namespace>_Customerstats_Block</class>
        </customerstats>
    </blocks>

customerdataしかし、代わりにと呼ばれるハンドルがあると思いますcustomerstats。コントローラーから呼び出すブロックはタイプcustomerdata/customerstatsdashboardであり、そのブロックが機能するためです。を使用する XML のものですがcustomerstats。この場合、XML を次のように調整してみてください。

<block type="customerdata/index" name="customerstats_dashboard" as="customerstats.dashboard" template="customerdata/customerstatsdashboard.phtml" />

さらに、テンプレートを使用する場合、ブロックは次のようになります。したがって、常に Mage_Core_Block_Template を拡張します。それ以外の場合getChildHtmlは利用できません。<your_namespace>_Customerstats_Block_Index extends Mage_Core_Block_Template

これがあなたの仕事に役立つことを願っています。それ以外の場合は、これを試した後にフィードバックを提供してください。

于 2012-07-28T09:38:58.590 に答える