Mage_Page_Block_Html
Cameron 本人对根块是继承的假设提出了一个很好的观点。我做了和你一样的假设,我的代码是一样的!我还发现这破坏了一些与结帐相关的逻辑(严格来说,它破坏了不用Mage_Page_Block_Html
作根块的 AJAX 逻辑)。
但是,作为对卡梅隆自己答案的改进,实际上很容易通过观察者添加身体类而不用观察core_block_abstract_to_html_before
。唯一的问题是您需要一个模块。因此,您要么需要为此目的制作一个,要么使用现有的有意义的。然后,最好是,我们想钩入一个在每次页面加载时触发一次的事件always。
嗯,有这样的事件。benmarks为另一个问题提供了一个非常好的和简洁的答案,给了我们一些提示。从中可以看出,好的事件可能是controller_action_layout_generate_blocks_after
.
因此,通过像往常一样观察事件:
<controller_action_layout_generate_blocks_after>
<observers>
<tghpcore_controller_action_layout_generate_blocks_after>
<type>singleton</type>
<class>yourmodule/observer</class>
<method>addBodyClasses</method>
</tghpcore_controller_action_layout_generate_blocks_after>
</observers>
</controller_action_layout_generate_blocks_after>
您可以在观察者类中干净安全地实现相同的目的:
public function addBodyClasses($observer)
{
/** @var $layout Mage_Core_Model_Layout */
$layout = $observer->getEvent()->getLayout();
// Retrieve the root block
$root = $layout->getBlock('root');
// Be 100% sure that there is a root block
if($root) {
// Check that the root block is a Magento page block that we can add body classes to
if(is_a($root, 'Mage_Page_Block_Html')) {
// Add logged in/out body classes
if(Mage::helper('customer')->isLoggedIn()) {
$root->addBodyClass('logged-in');
} else {
$root->addBodyClass('logged-out');
}
// You can even add more conditions and body classes for whatever you may want here
}
}
}
对我来说工作得很好。希望它也适合你!