魔扣论坛

魔扣源码论坛业务
查看: 1522|回复: 5

[经验交流] 修改magento的代码实现特定的功能

[复制链接]
  • TA的每日心情
    慵懒
    1 小时前
  • 签到天数: 2957 天

    [LV.Master]开坛老将

    7万

    主题

    227

    回帖

    27万

    积分

    管理员

    Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30

    魔扣币
    745759
    贡献
    157915
    威望
    32799

    最佳新人活跃会员热心会员推广达人宣传达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2015-12-15 22:21:17 | 显示全部楼层 |阅读模式
    魔扣币兑换比例:【 50以下 : ¥1 = 10 魔扣币 】丨【 50 - 100 :¥1 = 20 魔扣币】丨【 100以上:¥1 = 30 魔扣币 】

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    magento的功能已经很强大,但是不同的客户还是有不同的需要,magento不可能都能满足,要改变magento的某些功能行为方式,就不可避免的要修改magento的一些代码,如果只是直接在magento的代码上修改也就没有什么可以说的,但是这样做不好的理由在于,这样会造成下次版本更新时的不便,而且有可能你一不小心更新了magento版本而直接造成了你的修改的全部丢失。

    那么有没有一种更好的方式来处理呢?一方面我们即可以实现修改了magento的代码,一方面又不是直接在它的代码上修改而却又让magento能够使用我们的代码。当然是可以的。magento是在zend php framework上开发的,它承袭了zend的许多特性,采用了MVC的架构,也沿袭了zend的类名和目录嵌套相对应的特点。如:

    1. class Mage_Catalog_Model_Category extends Mage_Catalog_Model_Abstract {
    2. /**      * Category display modes      */
    3. const DM_PRODUCT            = 'PRODUCTS';
    4. const DM_PAGE               = 'PAGE';
    5. const DM_MIXED              = 'PRODUCTS_AND_PAGE';
    6. const TREE_ROOT_ID          = 1;
    复制代码

    这个类是保存在app/code/core/Mage/Catalog/Model/Category.php文件中,其中,core是代码池名,magento默认自带了community,core,local三个代码池,其中core中保存了magento自身的几乎所有的核心模块代码,Mage则是名字空间名。

    我们将要说明的第一种最简单的改写magento代码的方式便是利用了这种类名和目录相对应的特点,先分析一段magento代码:

    1. define('DS', DIRECTORY_SEPARATOR);
    2. define('PS', PATH_SEPARATOR);
    3. define('BP', dirname(dirname(__FILE__)));
    4. Mage::register('original_include_path', get_include_path());
    5. if (defined('COMPILER_INCLUDE_PATH')) {
    6. $app_path = COMPILER_INCLUDE_PATH;
    7. set_include_path($app_path . PS . Mage::registry('original_include_path'));
    8. include_once "Mage_Core_functions.php";
    9. include_once "Varien_Autoload.php";
    10. } else {
    11. /**
    12. * Set include path
    13. */
    14. $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'local';
    15. $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'community';
    16. $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'core';
    17. $paths[] = BP . DS . 'lib';
    18. $app_path = implode(PS, $paths);
    19. set_include_path($app_path . PS . Mage::registry('original_include_path'));
    复制代码

    其中,magento在原有的包含路径上重新添加了它自己的几个包含路径(include path),分别是local,community,core代码池目录,然后是varien库目录,这样的顺序确定了PHP查询PHP类的顺序,分别是local,community,core,因为magento并没有显式加载任何的库,而是利用了php的__autoload特性,分析一下下列的代码:

    1. Varien_Autoload::register();
    2. ...
    3. ...
    4. ...
    5. /**
    6. * Register SPL autoload function
    7. */
    8. static public function register()
    9. {
    10. spl_autoload_register(array(self::instance(), 'autoload'));
    11. }
    12. ...
    13. ...
    14. ...
    15. /**
    16. * Load class source code
    17. *
    18. * @param string $class
    19. */
    20. public function autoload($class)
    21. {
    22. if ($this->_collectClasses) {
    23. $this->_arrLoadedClasses[self::$_scope][] = $class;
    24. }

    25. if ($this->_isIncludePathDefined) {
    26. $classFile = $class;
    27. } else {
    28. $classFile = str_replace(' ', DIRECTORY_SEPARATOR, ucwords(str_replace('_', ' ', $class)));
    29. }
    30. $classFile.= '.php';
    31. //echo $classFile;die();
    32. return include $classFile;
    复制代码

    其中,下面的这行代码的作用是将当前所需要的类名转换成对应的文件:

    第一个str_replace(‘_’, ‘ ‘, $class);是将类名中的各个下划线替换成空格,并将每个单词第一个字母大写。

    第二个str_replace则是将上一次调用返回的字符串中的空格替换成路径分隔符,也就是/,这样就确定了类所对应的文件位置。

    1. $classFile = str_replace(' ', DIRECTORY_SEPARATOR, ucwords(str_replace('_', ' ', $class)));
    复制代码

    我们前面知道了,magento中的所有代码的类名都是以名字空间(namespace)为前缀,沿袭目录结构的嵌套层次。而各个代码池即可以有不一样的名字空间,也可以有不一样的名字空间。那么如果你在local代码池(目录)下面创建一个Mage名字空间(目录),那么你几乎可以重写 magento的任意一个类了。比如,我们要重写Mage_Catalog_Model_Category这个类,那么你可以创建下列的文件目录结构:

    [BP]app/code/local/Mage/Catalog/Model/Category.php

    这样你可以直接将原来的文件复制过来,然后你可以做任意修改了,而不用担心版本更新的问题。

    上面的这种方法我已经测对model的重写了。block和controller还末测试,不过controller的加载方式似乎有所不同,有待测试。

    这只是偷懒的一种方法,事实上magento推荐的方法是通过新建模块,然后在xml中配置重写相应的model,block,controller来实现的。


    会员购买:>> 点击购买 << | 魔扣币购买:>> 点击购买 <<
    承接业务:服务器代维丨网站托管丨SEO
    联系客服:微信:morko-net | QQ:1367681973

    该用户从未签到

    1

    主题

    256

    回帖

    513

    积分

    高级魔扣

    Rank: 4

    魔扣币
    256
    贡献
    256
    威望
    0
    发表于 2017-1-4 22:42:36 | 显示全部楼层
    啊啊啊啊啊啊啊啊啊啊啊

    该用户从未签到

    0

    主题

    275

    回帖

    551

    积分

    高级魔扣

    Rank: 4

    魔扣币
    276
    贡献
    276
    威望
    0
    发表于 2017-4-7 11:29:31 | 显示全部楼层
    最高的不是山峰,是脚步;最深的不是海水,是情感;最清的不是溪流,是心灵;最热的不是火把,是激情;最宝贵的不是金钱,是朋友;最开心的事,不是博客,魔扣源码论坛是在这里看望朋友愿我的朋友每一天都健康平安!幸福快乐!

    该用户从未签到

    1

    主题

    252

    回帖

    505

    积分

    高级魔扣

    Rank: 4

    魔扣币
    252
    贡献
    252
    威望
    0
    发表于 2017-9-3 11:25:13 | 显示全部楼层
    为毛老子总也抢不到沙发?!!

    该用户从未签到

    3

    主题

    246

    回帖

    495

    积分

    中级魔扣

    Rank: 3Rank: 3

    魔扣币
    246
    贡献
    246
    威望
    0
    发表于 2018-3-1 05:07:41 来自手机 | 显示全部楼层
    好,很好,非常好!

    该用户从未签到

    4

    主题

    242

    回帖

    489

    积分

    中级魔扣

    Rank: 3Rank: 3

    魔扣币
    243
    贡献
    243
    威望
    0
    发表于 2018-9-17 15:37:33 来自手机 | 显示全部楼层
    呵呵,低调,低调!
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    • 联系我们
    • 新浪微博 :
    • 在线客服 :魔扣科技 
    • 源码QQ群 :魔扣源码论坛官方总群
    • 联系邮箱 :charlin#morko.net
    • 微信扫一扫
    快速回复 返回顶部 返回列表