第五天:
一、重写magento核心类示例
第一步:创建目录结构;
第二步:创建config.xml和YEMA_CoreClassRewriteTest.xml;
第三步:清缓存,在System->Configuration->Advanced中确认模块加载;
第四步:注册blocks、helpers和models;
1 <blocks> 2 <core_class_rewrite_test> 3 <class>YEMA_CoreClassRewriteTest_Block</class> 4 </core_class_rewrite_test> 5 </blocks> 6 <helpers> 7 <core_class_rewrite_test> 8 <class>YEMA_CoreClassRewriteTest_Helper</class> 9 </core_class_rewrite_test> 10 </helpers> 11 <models> 12 <core_class_rewrite_test> 13 <class>YEMA_CoreClassRewriteTest_Model</class> 14 </core_class_rewrite_test> 15 </models>
第五步:创建一个页面及相关控制器;
config.xml:
1 <frontend> 2 <routers> 3 <core_class_rewrite_test> 4 <use>standard</use> 5 <args> 6 <module>YEMA_CoreClassRewriteTest</module> 7 <frontname>coreclassrewritetest</frontname> 8 </args> 9 </core_class_rewrite_test> 10 </routers> 11 </frontend>
controllers/IndexController.php:
1 <?php 2 class YEMA_CoreClassRewriteTest_IndexController extends Mage_Core_Controller_Front_Action { 3 public function indexAction() { 4 echo "Index Page"; 5 } 6 public function showAction() { 7 echo "Show Page"; 8 } 9 }
第六步:增加一个布局(Layout),配置config.xml、创建app/design/frontend/base/default/layout/coreclassrewritetest.xml文件:
config.xml:
1 <layout> 2 <updates> 3 <core_class_rewrite_test> 4 <file>coreclassrewritetest.xml</file> 5 </core_class_rewrite_test> 6 </updates> 7 </layout>
coreclassrewritetest.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <layout> 3 <core_class_rewrite_test_index_show> 4 <reference name="root"> 5 <action method="setTemplate"> 6 <template>page/2colums-right.phtml</template> 7 </action> 8 </reference> 9 </core_class_rewrite_test_index_show> 10 </layout>
第七步:在showAction方法增加加载layout和渲染layout
$this->loadLayout();
$this->renderLayout();
最终结果如下图显示:
第八步:增加翻译文件(多语言)
a、 编辑config.xml文件;
1 <translate> 2 <modules> 3 <Translation_Test> 4 <files> 5 <default>Translation_Test.xml</default> 6 </files> 7 </Translation_Test> 8 </modules> 9 </translate>
b、 在app/locale/en_US中新建文件Translation_Test.xml;
c、 在控制器中使用多语言翻译;
echo $this->__('pisTol');
此时,前端页面显示效果如下:
d、 在Translation_Test.xml文件中增加多语言内容
"pisTol","HeZiAng"
此时,清除缓存并刷新页面后,显示效果如下:
第九步:增加新商品内容块
a、 新建/Block/Newproducts.php文件并编辑;
b、 新建/template/coreclassrewritetest/newproduct.phtml文件并编辑;
c、 编辑coreclassrewritetest.xml布局文件;
1 <reference name="content"> 2 <block type="core_class_rewrite_test/newproducts" name="block_newproducts" template="coreclassrewritetest/newproducts.phtml" /> 3 </reference>
d、 在Newproducts类中添加getProducts()方法
1 public function getProducts() { 2 $products = Mage::getModel('catalog/product')->getCollection() 3 ->addAttributeToSelect('*') 4 ->setOrder('created_at') 5 ->setPageSize(5); 6 7 return $products; 8 }
e、 前端页面显示数据
1 <ul> 2 <?php foreach($this->getProducts() as $_product): ?> 3 <li><?php echo $_product->getName() ?></li> 4 <?php endforeach; ?> 5 </ul>
最终结果如下图显示:
第十步:重写核心类
a、 创建YEMA/CoreClassRewriteTest/Model/Catalog/Product.php文件
1 class YEMA_CoreClassRewriteTest_Model_Catalog_Product extends Mage_Catalog_Model_Product { 2 function function_name() { 3 ; 4 } 5 }
注意:在重写一个类的时候,最好是遵循原有类的目录结构。
b、编辑/YEMA/ CoreClassRewriteTest /etc/config.xml文件,在models节点下增加:
1 <catalog> 2 <rewrite> 3 <product>YEMA_CoreClassRewriteTest_Model_Catalog_Product</product> 4 </rewrite> 5 </catalog>
c、 保存对config.xml文件的编辑后,这时使用的类从Mage_Catalog_Model_Product变为YEMA_CoreClassRewriteTest_Model_Catalog_Product,如下图所示:
d、 重写getName()方法,在商品名称前加一个“pisTol”前缀
1 public function getName() { 2 3 return "pisTol-" . $this->_getData ( 'name' ); 4 }
备注:重写核心类并不是最好的定制化代码的方式,因为,该行为有可能对原有应用程序造成一定破坏。更加稳健的方式是使用“事件处理器”。
不过,不幸的是,采用该方式并不能覆盖系统在定制化过程中的所有修改点,这时候就必须重写核心类。重写核心类可以依照如下步骤进行:
- 创建空类集成需要重写的类;
- 黏贴希望重写的类的方法;
- 在config.xml注册重写的类;
二、开启Magento开发者模式
第一步:修改index.php文件(MAGENTO_ROOT/index.php)
1 //Modified by pisTol 20160129(Remove Annotation) 2 Varien_Profiler::enable(); 3 4 //Modified by pisTol 20160129(Remove Annotation) 5 ini_set('display_errors', 1);
第二步:设置服务器变量$_SERVER['MAGE_IS_DEVELOPER_MODE'](Apache的httd.conf)
#Modified by pisTol 20160129(Add Content) SetEnv MAGE_IS_DEVELOPER_MODE DEV;
niginx环境变量配置:
1 fastcgi_param RUNTIME_ENVIROMENT 'DEV'