Class Mage_Sales_Model_Entity is deprecated

今天终于搞清楚了一件困扰我已久的问题:在 Magento Sales Module 下有两个分支 Mage_Sales_Model_Entity 和 class Mage_Sales_Model_Mysql4,看上去文件结构比较相似,Sales 和其他模块一时用 Mage_Sales_Model_Entity,一时又用 Mage_Sales_Model_Mysql4。它们有什么区别?为什么要同时存在?有必要同时存在吗?如要删除一个,该删哪个保留哪个?

以前有个任务,想要给 order 等 entity 添加一些自定义属性,因为搞不清楚哪个在起作用,我把两个类都 extends 了,即 class Mage_Sales_Model_Entity_Setup 和 class Mage_Sales_Model_Mysql4_Setup。而因为其他一些原因,自定义属性并不能完全按照我的意愿工作,所以我也没办法再用替换法去测试哪个类在起作用。

今天重新回顾了这个问题,摸清 Mage_Sales_Model_Entity is deprecated。When extending sales entity, only need to extend classes in Mage_Sales_Model_Mysql4.

但是简单地删除 magento/app/code/core/Mage/Sales/Model/Entity 目录则会导致程序找不到必要的文件而出错。我的建议是了解 Mage_Sales_Model_Entity is deprecated 这个事实就可以了,如果一定想割了这个阑尾目录,得做一些调整:

  • 搜索一下哪些 class extends Entity 下的类 (search for Mage_Sales_Model_Entity under magento folder),把它们改成 extends Mysql4 下对应的类。据我搜索结果,只有 Mage_Reports 一些 class extends Entity 下的类,或许 Mage_Sales 在 Mage_Reports 成形之后进行 Entity to Mysql4 的调整,而为了省事,保留 Entity 下的类,就不用去修改 Mage_Reports 了。
  • 搜索一下哪些地方用到了 getModel(‘sales_entity/entity_name’) 的方式,把它们改成 getModel(‘sales_mysql4/entity_name’)。这需要同时搜索文件和数据库(数据库里 eav_attribute 有几个 backend models 是这样被引用的)。如果嫌这么替换比较麻烦,也可以修改 magento/app/code/core/Mage/Sales/etc/config.xml,把 <sales_entity><class>Mage_Sales_Model_Entity</class></sales_entity> 修改成 <sales_entity><class>Mage_Sales_Model_Mysql4</class></sales_entity>,这样就把 sales_entity model 与 sales_mysql4 model 等价起来了。

Leave a Reply

Your email address will not be published. Required fields are marked *