- 浏览: 13763353 次
- 性别:
- 来自: 洛杉矶
-
文章分类
- 全部博客 (1994)
- Php / Pear / Mysql / Node.js (378)
- Javascript /Jquery / Bootstrap / Web (435)
- Phone / IOS / Objective-C / Swift (137)
- Ubuntu / Mac / Github / Aptana / Nginx / Shell / Linux (335)
- Perl / Koha / Ruby / Markdown (8)
- Java / Jsp (12)
- Python 2 / Wxpython (25)
- Codeigniter / CakePHP (32)
- Div / Css / XML / HTML5 (179)
- WP / Joomla! / Magento / Shopify / Drupal / Moodle / Zimbra (275)
- Apache / VPN / Software (31)
- AS3.0/2.0 / Flex / Flash (45)
- Smarty (6)
- SEO (24)
- Google / Facebook / Pinterest / SNS (80)
- Tools (22)
最新评论
-
1455975567:
xuezhongyu01 写道wocan23 写道我想问下那个 ...
Mysql: LBS实现查找附近的人 (两经纬度之间的距离) -
xuezhongyu01:
wocan23 写道我想问下那个111.1是怎么得来的我也看不 ...
Mysql: LBS实现查找附近的人 (两经纬度之间的距离) -
18335864773:
试试 pageoffice 在线打开 PDF 文件吧. pag ...
jquery在线预览PDF文件,打开PDF文件 -
青春依旧:
opacity: 0.5; 个人喜欢这种方式!关于其他css特 ...
css透明度的设置 (兼容所有浏览器) -
July01:
推荐用StratoIO打印控件,浏览器和系统的兼容性都很好,而 ...
搞定网页打印自动分页问题
重写Magento模块(Module)
第一步,你需要创建属于你自己代码的命名空间,例如Wemvc,App等,为了方便与大家分享代码,我将空间命名为App 。
app/ code/ core/ community/ local/ App/
假如你现在打算修改Mage/Catalog/Block/Breadcrumbs.php 这个文件,你可以在你的命名空间,App里添加一个新的 模块“Catalog”。接下来创建块(Block)目录,并复制Breadcrumbs.php到你的新目录中。这里还需要你创建一个 config.xml配置文件。
app/ code/ core/ community/ local/ App/ Catalog/ Block/ Breadcrumbs.php etc/ config.xml
修改Breadcrumbs.php的类名为App_Catalog_Block_Breadcrumbs
,并继承原类名 Mage_Catalog_Block_Breadcrumbs
。
现在,你需要激活你的新模块,这样magento才能够知道你的新模块。
创建文件app/etc/modules/App_All.xml,添加如下代码。
< ?xml version="1.0"?> <config> <modules> <App_Catalog> <active>true</active> <codePool>local</codePool> </App_Catalog> </modules> </config>
下面我们需要一个特殊的标签来复写掉Breadcrumbs,下面我们通过模块的配置文件来实现。
重写Magento区块(Blocks)
编辑文件“app/code/local/App/Catalog/etc/config.xml ”
<?xml version="1.0" encoding="UTF-8"?> <config> <modules> <App_Catalog> <version>0.1.0</version> </App_Catalog> </modules> <global> <blocks> <catalog> <rewrite> <breadcrumbs>App_Catalog_Block_Breadcrumbs</breadcrumbs> </rewrite> </catalog> </blocks> </global> </config>
我们需要添加一个“blocks” 标签,或者在已经存在的“blocks”标签中添加内容。然后在模块名后面添加rewrite标签,在这个例子中模块名是“catalog”。然后我们看 “breadcrumbs”标签,这个标签帮助magento找到我们我们想修改的块。在我们的列子中,breadcrumbs是Magento核心代码 中的类名: app/code/core/Mage/Catalog/Block/Breadcrumbs.php 。如果你有更多的目录层级,可以用下滑线来分隔。例 如:
<blocks> <catalog> <rewrite> <category_view>App_Catalog_Block_Category_View</category_view> </rewrite> </catalog> </blocks>
在这个例子中,我们重写了app/code/core/Mage/Catalog/Block/Category/View.php 。
在breadcrumbs标签中的值是你的类名,这样Magento就可以获取你的类,因为类名与你的目录名一致。用过zend
framework的人都知道,自动加载auto
loader这个东西,它会跟你类名中的下滑线去你的目录中需要对应的类文件。记住一点,下滑线代表下一级别的文件夹,如果你的类名与你的文件目录名不一
致,那么Magento根本不会理睬你。
举例来说:
App_Catalog_Block_Breadcrumbs → /app/code/local/App/Catalog/Block/Breadcrumbs.php
App_Catalog_Block_Category_View → /app/code/local/App/Catalog/Block/Category/View.php
重写Magento控制器(Controller)-正则表达式匹配式
重写Magento控制器我们我们以重写购物车为例。
1、首先在App下创建新的模块,依次创建如下文件:
/app/code/local/App/Shopping
/app/code/local/App/Shopping/etc
/app/code/local/App/Shopping/etc/config.xml
/app/code/local/App/Shopping/controllers
/app/code/local/App/Shopping/controllers/CartController.php
2、编辑/app/code/local/App/Shopping/etc/config.xml 文件,加入如下代码:
<?xml version="1.0"?> <config> <modules> <App_Shopping> <version>0.1.0</version> </App_Shopping> </modules> <global> <!-- This rewrite rule could be added to the database instead --> <rewrite> <!-- This is an identifier for your rewrite that should be unique --> <!-- THIS IS THE CLASSNAME IN YOUR OWN CONTROLLER --> <App_Shopping_cart> <from><![CDATA[#^/checkout/cart/#]]></from> <!-- - Shopping module matches the router frontname below - checkout_cart matches the path to your controller Considering the router below, "/shopping/cart/" will be "translated" to "/App/Shopping/controllers/CartController.php" (?) --> <to>/shopping/cart/</to> </App_Shopping_cart> </rewrite> </global> <!-- If you want to overload an admin-controller this tag should be <admin> instead, or <adminhtml> if youre overloading such stuff (?) --> <frontend> <routers> <App_Shopping> <!-- should be set to "admin" when overloading admin stuff (?) --> <use>standard</use> <args> <module>App_Shopping</module> <!-- This is used when "catching" the rewrite above --> <frontName>shopping</frontName> </args> </App_Shopping> </routers> </frontend> </config>
3、改写你自己的控制器 /app/code/local/App/Shopping/controllers/CartController.php
请将下面的代码添加到你的控制器中,我们唯一修改的地方是在index动作中添加一个error_log()
;
<?php # 控制器不会自动加载,所以我们需要包含文件,这里与区块(Block)不一样 require_once 'Mage/Checkout/controllers/CartController.php'; class App_Shopping_CartController extends Mage_Checkout_CartController { #覆写indexAction方法 public function indexAction() { # Just to make sure error_log('耶~成功重写购物车!'); parent::indexAction(); } }
在这段代码中,首先是类名,跟前面讲到的区块(Block)一样,我们自己的类名是App_Shopping_CartController 继承原先Mage_Checkout_CartController. 在indexAction 中我们记录了一段信息。
4、修改App_All.xml ,激活我们新的Shopping模块
<?xml version="1.0"?> <config> <modules> <App_Catalog> <active>true</active> <codePool>local</codePool> </App_Catalog> <App_Shopping> <active>true</active> <codePool>local</codePool> </App_Shopping> </modules> </config>
到这里,清除缓存后,你已经可以看到error_log成功记录了我们的信息,打开页面http://www.wemvc.dev/checkout/cart/ ,显示的是购物车页面,一切正常,但如果你访问http://www.wemvc.dev/shopping/cart/ ,你会发现是首页。。。。我们期望的购物车视图还没有出现,如何解决呢?让我们接下来往下看。
5、修改视图文件app/design/frontend/[myinterface]/[mytheme]/layout/checkout.xml
在layout标签中,添加下面内容:
<app_shopping_cart_index> <update handle="checkout_cart_index"/> </app_shopping_cart_index>
注意,这里的大小写敏感。
到这里基本大功告成,但是,我建议你学习下正则表达式,因为刚刚的代码中,有这么一段:
<from>< ![CDATA[#^/checkout/cart/#]]></from>
这里是使用正则表达式进行匹配的。
还有一点,经过尝试,这里是可以支持同模块名覆盖的,例如Magento代码中商品详情页是Mage_Catalog_ProductController::viewAction() ,如果我们想重写这个Controller,我们可以这样做:
a.简历新的目录/app/code/local/App/Catalog/controllers/ProductController.php 代码如下:
require_once 'Mage/Catalog/controllers/ProductController.php'; /** * Product controller * * @category Mage * @package Mage_Catalog */ class App_Catalog_ProductController extends Mage_Catalog_ProductController { /** * View product action */ public function viewAction() { echo '覆盖过的....'; parent::viewAction(); } }
b.编辑/app/code/local/App/Catalog/etc/config.xml ,代码如下:
<?xml version="1.0" encoding="UTF-8"?> <config> <modules> <App_Catalog> <version>0.1.0</version> </App_Catalog> </modules> <global> <!-- This rewrite rule could be added to the database instead --> <rewrite> <!-- This is an identifier for your rewrite that should be unique --> <!-- THIS IS THE CLASSNAME IN YOUR OWN CONTROLLER --> <App_Shopping_cart> <from><![CDATA[#^/catalog/product/#]]></from> <!-- - Shopping module matches the router frontname below - checkout_cart matches the path to your controller Considering the router below, "/shopping/cart/" will be "translated" to "/App/Shopping/controllers/CartController.php" (?) --> <to>/catalog/product/</to> </App_Shopping_cart> </rewrite> <blocks> <catalog> <rewrite> <breadcrumbs>App_Catalog_Block_Breadcrumbs</breadcrumbs> </rewrite> </catalog> </blocks> </global> <frontend> <routers> <catalog> <use>standard</use> <args> <module>App_Catalog</module> <frontName>catalog</frontName> </args> </catalog> </routers> </frontend> </config>
清空缓存,刷新你的商品详情页,看是不是变了,呵呵。但是这个方法有个弊病,你需要把这个模块的所有Controller都复写掉,不然你会遇到比较大的麻烦。说到这,我再介绍一种重写方法.
仔细看配置文件的写法:
<?xml version="1.0"?> <config> <modules> <App_Mycms> <version>0.1.0</version> </App_Mycms> </modules> <frontend> <routers> <mycms> <use>standard</use> <args> <module>App_Mycms</module> <frontName>mycms</frontName> </args> </mycms> </routers> </frontend> <global> <routers> <cms> <rewrite> <index> <to>App_Mycms/index</to> <override_actions>true</override_actions> <actions> <noroute><to>App_Mycms/index/noroute</to></noroute> </actions> </index> </rewrite> </cms> </routers> </global> </config>
综上所述,三种重写方法都各有千秋,关键看你用在什么地方。另外我们在实践中发现,Magento好像不建议你自己的模块名与现有系统中的模块名一 致,例如Mage_Customer是已有的,它的模块名叫Customer,如果你想复写它,那么最好你再建一个App_Customers 之类的。
重写Magento模型和动作助手(Model&Helper)
我们在改写Magento的过程中,为了实现自己的业务逻辑,难免要改它的业务模型。你可以尝试用模块下的配置文件配置你自己的类,继承你想重写的模型或者助手,然后调用自己的类。现在我们以用户模型为例深入讲解。
a.首先创建自己的模块文件夹
app/code/local/App/Customer
app/code/local/App/Customer/etc/config.xml
app/code/local/App/Customer/Model
app/code/local/App/Customer/Model/Customer.php
b.修改app/etc/modules/App_All.xml
<App_Customer> <active>true</active> <codePool>local</codePool> </App_Customer>
c.修改自己的模块配置文件app/code/local/App/Customer/etc/config.xml
<?xml version="1.0" encoding="UTF-8"?> <config> <modules> <App_Customer> <version>0.1.0</version> </App_Customer> </modules> <global> <models> <customer> <rewrite> <customer>App_Customer_Model_Customer</customer> </rewrite> </customer> </models> </global> </config>
d.现在写你新的Model,在文件app/code/local/App/Customer/Model/Customer.php 中新建类App_Customer_Model_Cutomer
class App_Customer_Model_Customer extends Mage_Customer_Model_Customer { // 重写已存在的方法 public function validate() { // Define new validate rules. From now magento call this validate method instead of existing method //return $errors; return true; } // 你还可以创建新的方法 public function newMethod() { // function logic } }
e.我们再重写一个类,以加深理解。接下来我们重写Customer Address Model 。 跟重写Customer Model一样,我们先编辑模块的配置文件app/code/local/App/Customer/etc/config.xml 。
<?xml version="1.0" encoding="UTF-8"?> <config> <modules> <App_Customer> <version>0.1.0</version> </App_Customer> </modules> <global> <models> <customer> <rewrite> <customer>App_Customer_Model_Customer</customer> <address>App_Customer_Model_Address</address> </rewrite> </customer> </models> </global> </config>
上面看出来了么,rewrite标签内的customer和address其实就是你要覆写的magento model
。
接下来创建model class App_Customer_Model_Address
,并写你要覆盖和新增的方法
class App_Customer_Model_Address extends Mage_Customer_Model_Address { // 重写已存在的方法 public function validate() { // Define new validate rules. From now magento call this validate method instead of existing method //return $errors; return true; } // 你还可以创建新的方法 public function newMethod() { // function logic } }
f.我再讲下如何覆盖Magento的模型资源,这里以复写Address Entity Model class为例,我们先来修改模块的配置文件app/code/local/App/Customer/etc/config.xml 。
<?xml version="1.0" encoding="UTF-8"?> <config> <modules> <App_Customer> <version>0.1.0</version> </App_Customer> </modules> <global> <models> <customer> <rewrite> <customer>App_Customer_Model_Customer</customer> <address>App_Customer_Model_Address</address> </rewrite> </customer> <customer_entity> <rewrite> <address>App_Customer_Model_Entity_Address</address> </rewrite> </customer_entity> </models> </global> </config>
接下来创建类文件。
class App_Customer_Model_Entity_Address extends Mage_Customer_Model_Entity_Address { protected function _afterSave(Varien_Object $address) { // Write your code } }
总结
在本章中我们学习了如何重写模块、重写控制器、重写区块,以及如何重写模型和助手,基本重写Magento代码对你来说已经不是难事了。文章至此, 要恭喜你,你已经掌握了大部分修改Magento的技能。下面的文章我们会进行更深入的研究。最后感谢所有Sasacake Team Member,是他们对待工作的热情和责任感促使我写这些教程。
原文链接:http://www.wemvc.com/1187.html
发表评论
-
Magento: 后台显示图片不能找到 Image file was not found on product tab
2016-08-30 02:22 3004I was uploading some images f ... -
理解WordPress的PingBack和TrackBack
2016-08-26 02:21 5808pingback和trackback的功 ... -
零基础 Amazon Web Services (AWS) 入门教程图文版(四)
2016-06-07 11:40 1036自上一篇之后,5天过去了,这篇文章总算是挤出来了... 其实 ... -
零基础 Amazon Web Services (AWS) 入门教程图文版(三)
2016-06-07 11:41 2063原则上WDCP安装好了,就可以直接使用了,FTP、MySQL ... -
零基础 Amazon Web Services (AWS) 入门教程图文版(二)
2016-06-07 01:33 1021上一篇讲到,主机正常运转了。但是此时如果直接访问公网IP是 ... -
零基础 Amazon Web Services (AWS) 入门教程图文版(一)
2016-06-07 01:31 21807现在小站唯一的流量都靠AWS这个关键词了,刚好要用AWS重新 ... -
零基础 Amazon Web Services (AWS) 入门教程 (列表)
2016-06-07 01:32 2099在 Amazon Web Services 上托 ... -
Magento 1.9:新订单通知 Admin Order Notifier
2016-06-02 02:48 870Here is a little Mag ... -
Magento 1.9.X 系列教程
2016-05-14 02:44 2305Magento安装下载教学: Magento教程 1 ... -
Magento: 产品页面下jquery change函数失效 Call javascript function onchange product option
2016-05-05 06:39 1774明显的原因是change函数跟magento默认的oncha ... -
Magento: 判断是否为手机浏览 Optimise Web's Mobile Detect Class for Magento
2016-04-29 07:01 1178项目地址:Optimise Web's Mobile Det ... -
Magento: Gird 和 form 区域 Module Development Series – Magento Admin Module
2016-04-28 02:39 690In this tutorial, we are goi ... -
Magento: addAttributeToFilter 和 addFieldToFilter 的区别 Difference between addAttri
2016-04-28 02:34 1027addAttributeToFilter is use ... -
Magento: 后台获取menu链接 Getting the admin panel urls
2016-04-28 02:34 791The url for customer page in t ... -
Magento : 调用文件上传 upload file frontend
2016-04-27 01:25 1377bool mkdir ( string $pathname ... -
Magento: 自定义用户登录导向页面 Redirect Customer to Previous Page After Login
2016-04-26 02:45 1869Configuration Settings – L ... -
Magento: 代替flash上传 How to disable Flash uploader in Magento (product images and
2016-04-06 05:04 11401. 替换产品页flash上传按钮 - 使用 Du ... -
Magento: 在客户账户中添加自定义链接 My Account Add Link
2016-04-05 14:05 1420This extension add new link an ... -
Magento: 根据产品属性加载产品信息 Load A Category or Product by an Attribute
2016-03-26 01:35 961Load a Product by ID <?ph ... -
Magento模块开发之数据库SQL操作方法说明
2016-03-26 01:31 1394今天主要来看Magento中的Mysql4/Resource ...
相关推荐
深入理解Magento-第九章 – 修改、扩展、重写Magento代码 深入理解Magento-第十章 – 数据操作&数据收集器 在Magento教程中用到的模块 Configviewer Layoutviewer Helloworld with Custom System Config 其他...
本教程将深入探讨Magento的开发技术,旨在帮助初学者和经验丰富的开发者更好地理解和利用这一平台。 1. **Magento架构与组件**:Magento采用模块化架构,由多个相互独立的模块组成,每个模块负责特定的功能。了解...
11. **第三方扩展插件**:Magento Marketplace上有大量第三方插件,可以扩展平台功能,如社交媒体整合、营销工具、物流管理等。 在压缩包文件“magento”中,可能包含了Magento 1.9.1的所有源代码、数据库脚本、...
第一章:Magento介绍...................................................................................................................4 Magento 的特色.....................................................
Magento 2是一款强大的开源电子商务平台,专为构建高科技、高定制化的在线商店而设计。它提供了丰富的功能,包括产品管理、订单...通过深入理解和熟练应用上述知识点,你可以构建出符合高科技行业标准的电子商务网站。
- **Magento扩展的安装与使用**:指导如何安装和使用第三方扩展。 7. **产品和目录管理** - **产品类型**:涵盖了Magento支持的各种产品类型及其特性。 - **价格计算**:介绍了如何计算和显示产品的价格。 - **...
- Magento的Rewrite机制允许重写核心或第三方模块的类,实现功能的覆盖或扩展。 11. **EAV模型**: - EAV模型使Magento能处理各种复杂的数据结构,如商品的多属性、变种等。 12. **添加Top Link**: - Magento...
- `local` 表明这是本地自定义的代码,而不是从第三方获取的。 - `Vendor` 是指厂商名称,可以根据实际情况更改。 - `HelloWorld` 即模块名称。 在这个目录下,你还需要继续建立如下的子目录结构: ``` app/code/...
8. **修改、扩展、重写Magento代码**: - **重写机制**:Magento允许开发者覆盖其核心或第三方模块的代码,以实现自定义功能。 - **重写区块、控制器、模型和Helper**:通过不同的方法重写这些组件,实现功能增强...
#### 第九章:用户生成内容 - **评级与评论**:鼓励用户对产品进行评价和分享使用体验。 - **标签功能**:允许用户为产品添加标签,便于搜索。 - **产品推荐**:提供“将产品发送给朋友”的功能,促进口碑传播。 ##...
7. **第三方集成**:可能集成了各种支付网关(如PayPal、Stripe等)、物流服务、社交媒体分享等插件,扩展了平台的功能。 8. **高质量的文档**:为了帮助用户更好地理解和使用模板,开发者通常会提供详尽的使用文档...
Magento是一款开源的电子商务平台,由Adobe公司开发,用于构建功能丰富的在线商店。它以其灵活性、可扩展性和强大的功能而闻名。本教程将详细介绍如何安装Magento,以便你可以开始创建自己的电子商务网站。 **一、...
10. **插件兼容**:Magento有丰富的扩展插件库,一个好的模板应该能很好地与第三方插件配合,以增加更多的功能,如客户评价、社交媒体分享等。 通过下载并安装mApple_Iphone_v1.0模板,Magento用户可以提升其移动...
1. **架构与技术栈**:Magento 1.6.2 基于 Zend Framework 构建,使用 MVC(Model-View-Controller)设计模式,使得代码结构清晰,便于开发和维护。它还依赖于其他 PHP 库,如 Varien 和 Prototype JavaScript 框架...
作为开源软件,Magento的核心代码对公众开放,允许开发者进行自定义修改和扩展。这为商家提供了无尽的可能性,可以根据自己的业务需求定制功能,或者利用社区提供的各种插件和主题。 3. **模块化架构**: Magento...
9. **扩展性**: Magento社区拥有庞大的开发者群体,提供大量第三方插件和扩展,可进一步增强功能。 10. **API接口**:Magento提供了API接口,与其他系统如ERP、CRM集成,实现数据同步和自动化流程。 这个压缩包中...
在深入讨论Magento的相关知识点之前,首先理解其基本架构是至关重要的。Magento采用MVC(Model-View-Controller)设计模式,这使得代码结构清晰,易于维护。同时,它依赖于Zend Framework,提供了一套完整的组件和...
该系统在设计上采用模块化架构,允许商家根据需求轻松定制和扩展功能,同时能够与各种第三方应用系统无缝集成。以下是Magento 1.5的一些核心功能特点: 1. **网站管理**:Magento 提供了全面的后台管理系统,让商家...
通过安装第三方扩展或开发自定义模块,可以轻松地扩展平台的功能。 2. **多店铺管理**: Magento支持多个店面运营,这意味着一个后台系统可以管理多个不同的在线商店,方便品牌多元化或者跨地区经营。 3. **强大的...
6. **扩展与插件**:Magento MarketPlace提供了大量第三方扩展,涵盖营销、支付、物流等各个领域,方便商家定制功能。 7. **SEO优化**:Magento内置SEO功能,包括元标签管理、重写规则、URL结构优化等,有助于提高...