392
技術社區[雲棲]
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