やっと 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モデルを見たことがありません...では、拡張機能のコントローラーの目的は何ですか?