閱讀392 返回首頁    go 技術社區[雲棲]


Magento在CMS Page中增加用戶信息變量

Magento的cms頁麵和static block頁麵中可以用一些指示符來得到相應的信息,如{{skin url=".."}} {{media url="..."}}等。 

在Mage_Cms_Block_Page類的_toHtml方法中可以找到下麵的代碼: 

$helper = Mage::helper('cms'); $processor = $helper->getPageTemplateProcessor(); $html = $processor->filter($this->getPage()->getContent()); ...  

 

先獲得負責頁麵解析的processor對象,然後由processor對象負責對頁麵中的指示符進行解析和替換工作。 


查找cms helper類的getPageTemplateProcessor方法,我們得知processor對象是Mage_Cms_Model_Template_Filter類的實例。Mage_Cms_Model_Template_Filter繼承自Mage_Core_Model_Email_Template_Filter類,在Mage_Core_Model_Email_Template_Filter類中定義了負責解析相應指示符的一些方法:

 

public function blockDirective($construction) public function layoutDirective($construction) public function varDirective($construction)  

 

等,可以看到其實cms filter裏麵已經定義了var指示符,但是我們在cms頁麵的content裏麵插入{{var customer.name}}並不能正確被解析,原因是customer變量的值沒有設置。 



我們隻要新建一個模塊,繼承Mage_Core_Model_Email_Template_Filter類,並設置customer變量的值為當前用戶即可。

 

public function __construct(){ $variables = array('customer'=>Mage::getSingleton('customer/session')->getCustomer()); $this->setVariables($variables); }  

 

同時需要新建自定義的helper類,並重寫getPageTemplateProcessor方法,返回我們自己的Filter類: 

 

public function getPageTemplateProcessor() { return Mage::getModel('glscms/template_filter'); }  

 

最後,我們重寫Mage_Cms_Block_Page類的_toHtml方法: 

在config.xml中加入:

 

<cms> <rewrite> <page>Glamour_GlsCms_Block_Cms_Page</page> </rewrite> </cms>  

 

class Glamour_GlsCms_Block_Cms_Page extends Mage_Cms_Block_Page { protected function _toHtml() { $helper = Mage::helper('glscms'); $html = parent::_toHtml(); if($helper->isEnabled()){ $processor = $helper->getPageTemplateProcessor(); $html = $processor->filter(parent::_toHtml()); } return $html; } }  

 

我們就可以直接在cms內容裏加入customer的一些信息了。 

如: 
{{var customer.email}} 
{{var customer.firstname}} 

Magento在解析cms頁麵時,會把上麵的指示符替換為當前用戶的相應屬性。

 

原文鏈接地址:https://cgzhang.javaeye.com/blog/825197

 

最後更新:2017-04-02 06:51:30

  上一篇:go magento -- 給Magento提速之緩存上的探索
  下一篇:go 常用Web文件上傳方式 JspSmartUpload上傳文件