如果你试图让它在模板/phtml 文件中工作,和/或在 Block 的类中工作,你将很难。主要是因为 magento(积极地)出于性能目的缓存您的 PHTML 块,从而撤消您拥有的任何程序流控制语句,特别是与 cookie 检查相关的内容。我没有直接/冗长/深入的解释为什么,但这就是我一遍又一遍地遇到它的方式。
但是,您的解决方案应该是正确的,但是您需要在控制器的 preDispatch 方法中进行检查,以避免上述激进的缓存,因为控制器永远不会被缓存。(显示在您链接的问题中尼克的解决方案中。):
// Ensure we're in the admin session namespace for checking the admin user..
Mage::getSingleton('core/session', array('name' => 'adminhtml'))->start();
$admin_logged_in = Mage::getSingleton('admin/session', array('name' => 'adminhtml'))->isLoggedIn();
// ..get back to the original.
Mage::getSingleton('core/session', array('name' => $this->_sessionNamespace))->start();
如果您确实需要在 PHTML 文件或命名块中执行上述检查,请查看以下代码,了解如何关闭块级缓存并使其工作。我之前所做的是禁用页脚块的缓存(其中子块,而不是 phtml,包含检查
特定 cookie 的代码)
首先,块调用(在您的 local.xml 或模块布局更新 xml 中找到,或者您可以进行布局更新的任何地方,真的。我更喜欢将我的自定义分解为模块,所以绝对模块布局更新 xml 是要走的路) :
<reference name="footer">
<action method="unsetData"><key>cache_lifetime</key></action>
<action method="unsetData"><key>cache_tags</key></action>
<block type="newsletterpopup/popup" name="newsletterpopup_footer" template="newsletterpopup/popup.phtml"/>
</reference>
这是 newsletterpopup 的 block 类:
<?php
class Launchpad_Newsletterpopup_Block_Popup extends Mage_Core_Block_Template {
public function canRender() {
// Check if cookie exists here
}
public function afterRender() { // if block has rendered, this is called.
// Set cookie, if it doesn't exist here.
}
}
phtml 将类似于:
<?php if($this->canRender()): ?>
// stuff
<?php endif; ?>
祝你好运!