Magento在CMS Page中增加用户信息变量

Magento在CMS Page中增加用户信息变量 

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

在Mage_Cms_Block_Page类的_toHtml方法中可以找到下面的代码: 

view plain copy to clipboard print ?
  1. $helper  = Mage::helper( 'cms' );  
  2.       $processor  =  $helper ->getPageTemplateProcessor();  
  3.       $html  =  $processor ->filter( $this ->getPage()->getContent());  
  4.       ...  
$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类中定义了负责解析相应指示符的一些方法:

view plain copy to clipboard print ?
  1. public   function  blockDirective( $construction )  
  2. public   function  layoutDirective( $construction )  
  3. public   function  varDirective( $construction )  
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变量的值为当前用户即可。

view plain copy to clipboard print ?
  1. public   function  __construct(){  
  2.           $variables  =  array ( 'customer' =>Mage::getSingleton( 'customer/session' )->getCustomer());  
  3.           $this ->setVariables( $variables );  
  4.       }  
public function __construct(){ $variables = array('customer'=>Mage::getSingleton('customer/session')->getCustomer()); $this->setVariables($variables); }  

同时需要新建自定义的helper类,并重写getPageTemplateProcessor方法,返回我们自己的Filter类: 

view plain copy to clipboard print ?
  1. public   function  getPageTemplateProcessor()  
  2.     {  
  3.         return  Mage::getModel( 'glscms/template_filter' );  
  4.     }  
public function getPageTemplateProcessor() { return Mage::getModel('glscms/template_filter'); }  

最后,我们重写Mage_Cms_Block_Page类的_toHtml方法: 

在config.xml中加入:

view plain copy to clipboard print ?
  1. < cms >   
  2.   < rewrite >   
  3.      < page > Glamour_GlsCms_Block_Cms_Page </ page >   
  4.   </ rewrite >   
  5. </ cms >   
<cms> <rewrite> <page>Glamour_GlsCms_Block_Cms_Page</page> </rewrite> </cms>  

view plain copy to clipboard print ?
  1. class  Glamour_GlsCms_Block_Cms_Page  extends  Mage_Cms_Block_Page  
  2. {  
  3.     protected   function  _toHtml()  
  4.     {  
  5.         $helper  = Mage::helper( 'glscms' );  
  6.         $html  = parent::_toHtml();  
  7.         if ( $helper ->isEnabled()){  
  8.             $processor  =  $helper ->getPageTemplateProcessor();  
  9.             $html  =  $processor ->filter(parent::_toHtml());  
  10.         }  
  11.         return   $html ;  
  12.     }  
  13. }  
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页面时,会把上面的指示符替换为当前用户的相应属性。

原文链接地址:http://cgzhang.javaeye.com/blog/825197

你可能感兴趣的:(Magento在CMS Page中增加用户信息变量)