由於某些客戶抱怨並與我們的營銷人員進行討論,最後幾天我收到了更改可配置產品選項默認行爲的請求。他們要求我從選項下拉菜單中刪除+ $ xx.xx,因爲它會讓客戶/訪客感到困惑,並且只保留可用選項而不顯示價格變化。從他們的觀點來看,這很公平,但從開發人員的角度來看,我認爲這有點棘手。該網站正在運行Magento CE 1.6.2,我們需要覆蓋/更改的文件是/public_html/js/varien/configurable.js。我們需要更改其中的getOptionLabel函數,以便它不顯示價格變化。 所以我的問題是:什麼是正確的Magento方式來改變這個文件,而不是觸摸核心JavaScript文件? 在此先感謝。覆蓋/擴展Magento核心JavaScript文件
回答
從原型手動http://prototypejs.org/doc/latest/language/Function/prototype/wrap/看到這個如果需要的話你可以用任何物體的方法,甚至叫「家長」,這裏是一個僞樣本:
//where Product.Config is the object/class you need to "override"
Product.Config.prototype.getOptionLabel = Product.Config.prototype.getOptionLabel.wrap(function(parentMethod){
//replace the original method here with your own stuff
//or call parentMethod(); if conditions don't match
});
非常感謝你的提示安東。我會在早上玩它,看看它是如何執行的。 – 2012-08-13 20:53:49
對於Magento的1.7這個工程:Product.Config.prototype.getOptionLabel = Product.Config.prototype.getOptionLabel.wrap – 2012-10-04 14:47:58
想這取決於方法的命名 – 2012-10-05 07:16:57
只需添加到@安東-S是絕對正確的答案,你也可以做「全」類重寫:
// Create the original class
var ClassA = Class.create();
ClassA.prototype = {
initialize: function(config) {
this.config = config;
},
test: function(msg) {
console.log('Hi from class A with message ' + msg);
}
};
// Create new class extending the original class
var ClassB = Class.create(ClassA, {
// $super is a reference to the original method
test: function($super, msg) {
console.log('Hi from class B');
console.log('this.config is accessible in class B: ' + this.config);
$super(msg + ' ...')
}
});
// To make the extend an override, you can do this:
ClassA = ClassB;
// ClassA now is ClassB overriding the original ClassA
var a = new ClassA('some config data');
a.test('Call A 1');
由於原型類,而不是對已經實例化對象的所有這隻作品,我也會扔在這個技巧,這是相當多的東西包裹()不,也是:
// Overriding a method of an already instantiated object
// There are many ways to do this more elegantly thanks to the amazing JS scoping magic
a.origTest = a.test;
a.test = function(msg) {
console.log('Hi from the patched method');
this.origTest(msg);
}
a.test('Call A 2');
但請記住,該wrap()
方法是更好的,也可以在類定義或對具體事例上使用。
// Wrap method of concrete instance
spConfig.getOptionLabel = spConfig.getOptionLabel.wrap(function(parentMethod, option, price) {
return parentMethod(option, price);
});
// Wrap method of class declaration
Product.Config.prototype.getOptionLabel = Product.Config.prototype.getOptionLabel.wrap(function(parentMethod, option, price) {
return parentMethod(option, price);
});
非常感謝Vinai和Anton S提供的寶貴提示。我們已經改變了我們的臨時js黑客攻擊,現在它已經以正確的Magento方式完成了。你是石頭! – 2012-08-14 11:51:48
@MilenPetrov接受幫助你改善SO體驗的答案,爲其他人搜索類似 – 2012-08-14 12:31:29
@Anton S - 真的很抱歉,我忘了這麼做 – 2012-08-22 10:00:23
- 1. Magento。覆蓋核心文件
- 2. Magento中的核心覆蓋
- 3. Yii - 如何覆蓋/擴展核心文件
- 4. Firefox擴展覆蓋注入JavaScript文件?
- 5. 覆蓋擴展文件(Android)
- 6. magento無法覆蓋核心模型
- 7. 覆蓋magento核心管理模板
- 8. 覆蓋Magento中的核心控制器
- 9. 如何覆蓋Magento核心塊?
- 10. 如何覆蓋Magento核心塊模板?
- 11. (覆蓋||擴展)JavaScript方法
- 12. 覆蓋核心Symfony2組件
- 13. Magento覆蓋來自模塊的核心文件
- 14. 擴展核心模式在Magento
- 15. Magento擴展核心管理控制器
- 16. jQuery的JavaScript覆蓋/擴展事件
- 17. prestashop 1.5核心文件覆蓋
- 18. 覆蓋drupal的核心包含文件
- 19. Moodle擴展/覆蓋核心小鬍子模板
- 20. 如何擴展/覆蓋預定義的核心sencha類?
- 21. 如何覆蓋Magento 2擴展助手文件?
- 22. Chrome擴展程序 - 覆蓋.js文件
- 23. 覆蓋核心數據值
- 24. Joomla 2.5核心覆蓋
- 25. 在ASP.NET核心覆蓋User.IsInRole
- 26. 覆蓋鉻擴展中的JavaScript警報
- 27. 在Firefox擴展覆蓋中更改javascript
- 28. Typo3 8.7擴展核心表單擴展
- 29. 文本覆蓋文本並可擴展。
- 30. 覆蓋Magento中沒有自定義模塊的塊核心文件
javascript不支持覆蓋。 但看到 http://stackoverflow.com/questions/5409428/how-to-override-a-javascript-function – Guerra 2012-08-13 20:14:57
@Guerra你肯定有原型的方式來包裝()的東西很好 – 2012-08-13 20:30:24
IMO這是一個黑客來模擬面向對象覆蓋,但工作很好 – Guerra 2012-08-13 20:39:43