2012-10-10 16 views
2

我在尝试设置会话变量,因此每个会话仅出现一次弹出框。在打开缓存的情况下在Magento中设置会话变量

为此,我创建了一个模块,当有人关闭弹出窗口时,通过AJAX调用该模块。模块的控制器设置会话变量。控制器看起来像这样:

class Company_Popup_IndexController extends Mage_Core_Controller_Front_Action { 
    public function indexAction() { 
     Mage::getSingleton('core/session')->setNewsletterPopup('yes'); 
    } 
} 

超级简单。

然后,在块I检查会话变量被设置(或者如果用户已登录):

class Company_Popup_Block_Popup extends Mage_Core_Block_Template 
{ 
    public function displayPopup(){ 
     if(!$this->helper('customer')->isLoggedIn() && Mage::getSingleton('core/session')->getNewsletterPopup() == null){ 
      return true; 
     } 
     else{ 
      return false; 
     } 
    } 
    public function getSessionData(){ 
     return Mage::getSingleton('core/session'); 
    } 
} 

模板文件然后调用displayPopup方法,要么显示通讯弹出或不。

这一切都很完美......直到我打开缓存时,会话变量没有被设置,或者至少在块/模板文件中无法访问。

我在这里错过了什么?

+0

你在哪里渲染你的区块,例如它是在footer.phtml? – Theodores

+0

您正在运行CE还是EE版? –

+0

它可能会更简单,如果你只是使用javascript和饼干女巫没有缓存。你只能为当前会话设置一个cookie ... –

回答

1

我想块被缓存,这意味着更新的会话变量不被访问,而是返回已被缓存的原始调用。

您应该尝试并禁用块内的缓存。

尝试添加该到你的块:

public function getCacheLifetime() { return null; } 

这将禁用块上的高速缓存,并应允许它被正确调用。

+1

+1以获得更好的信息,但我不认为这是事实。整个块代码都在那里,并且没有显式的缓存集,这意味着该块不会被缓存为HTML输出。更可能的是整个页面缓存跳过正在执行的控制器操作。 (但很难说没有更多的信息从原来的海报) –

+0

嗨@Andrew,我刚刚试过你的建议,它不工作,我害怕。正如Alan所说,我没有在任何地方设置任何显式缓存。 – hammygoonan

相关问题