作为开发人员,您经常必须面对一个迫使您更改框架核心行为的场景。 如果这是管理用户界面已经提供的或类似的东西,那就太好了! 但是,在复杂的自定义情况下,您将需要的比这更多—您将不得不更改框架代码。
这样做时,您不想直接修改框架文件,因为这被认为是一种坏习惯,而且如果您在不同文件中进行了大量更改,这也会使框架升级成为噩梦。 因此,您必须寻找其他可能的方法来实现它而不修改内核本身。 如今,大多数框架都提供了某种系统,使您可以将其作为可扩展性的一部分。
今天,我们将在OpenCart中讨论类似的情况。 如果您积极参与OpenCart的开发,您可能知道您可以根据最小购物车结帐金额过滤付款方式。 例如,如果结帐总额少于一定数量,您可以选择不列出COD方法。 它是内置的,您可以在从后端配置付款方式时进行设置。
在本教程中,我们将对其进行扩展,并尝试根据购物车的总重量限制付款方式。 如果购物车重量小于某个预定值,我们将讨论如何在结帐时过滤COD方法。 要实现此功能,它需要对代码进行更改,因为它不能从后端本身进行配置。
如前所述,您不得更改框架的任何核心文件,这使我们可以选择OCMOD。 如果您不熟悉它,请不要担心,因为我将在下一部分中介绍它。
我假设您使用的是最新版本的OpenCart,在撰写本文时,它是OpenCart 2.2.0.0。 另外,OCMOD系统仅适用于OpenCart 2.xxx以后的版本,因此,您可以使用另一个原因来安装最新版本。
这样就为我们前进奠定了良好的基础。 我们走吧!
什么是OCMOD?
OCMOD是基于XML的搜索和替换系统,使您可以更改OpenCart框架的核心文件。 您按照OCMOD的约定定义XML文件,其余的工作将由XML文件完成。 如果您听说过OpenCart 1.5.x中的vQmod系统,则它是该系统的后继产品。
让我们列出一些示例以了解其功能:
- 在文件中的任何特定行之前插入一段代码。
- 用您的自定义代码块替换代码块。
- 使用正则表达式在文件中找到一个字符串,然后将其替换为另一个字符串。
- 更改OpenCart数据库的架构。
- 还有很多...
尽管接下来的两节将帮助您了解其工作原理,但是您也可以查看OCMOD的深入说明 。
如果您不熟悉vQmod或OCMOD,我建议您阅读上述文章,因为本教程将介绍OCMOD的用法。
熟悉OCMOD之后,我们将进入下一部分,该部分将构建OCMOD模块以实现上述自定义。
没有OCMOD的外观如何?
让我们快速浏览一下本例中需要更改的文件。 继续并在您喜欢的文本编辑器中打开catalog/controller/checkout/payment_method.php
文件,然后在index
方法中查找以下代码片段。
$results = $this->model_extension_extension->getExtensions('payment');
它正在从数据库中获取所有有效的付款方式。 在这一行之后,我们可以插入代码,以便在购物车的总重量小于某个特定值时过滤COD方法。 如果我们要直接修改此文件,它应该看起来像这样。
$results = $this->model_extension_extension->getExtensions('payment');
/*** our custom code ***/
$totalCartWeight = $this->cart->getWeight();
$minCodWeight = 100;
if ($totalCartWeight < $minCodWeight) {
$updated_results = array();
foreach ($results as $result) {
if ($result['code'] != 'cod') {
$updated_results[] = $result;
}
}
$results = $updated_results;
}
/*** our custom code ***/
如您所见,我们的自定义代码包含在注释中。
首先,我们使用Cart
对象的getWeight
方法获取购物车的总重量。 为简单起见,我们已将COD方法的最低要求权重硬编码为100。当然,您可以制作一个后端配置模块,以便可以从管理端本身对其进行配置。
接下来,有一个if
条件,它以最小的COD重量检查购物车的总重量,并基于此条件从$results
数组中过滤出COD方法。
因此,就代码修改而言,仅此而已。 在下一节中,我们将通过使用OCMOD来实现它,这就是我在本文开头向您保证的内容!
生成并安装OCMOD模块
构建模块
创建具有以下内容的filter_payment_method.ocmod.xml
文件。
<?xml version="1.0" encoding="utf-8"?>
<modification>
<name>Filtering payment methods based on cart weight</name>
<code>Code_Tutsplus_Filter_Payment_Methods</code>
<version>1.0</version>
<author>Code Tutsplus</author>
<link>http://code.tutsplus.com</link>
<file path="catalog/controller/checkout/payment_method.php">
<operation>
<search><![CDATA[
$results = $this->model_extension_extension->getExtensions('payment');
]]></search>
<add position="replace"><![CDATA[
$results = $this->model_extension_extension->getExtensions('payment');
/*** our custom code ***/
$totalCartWeight = $this->cart->getWeight();
$minCodWeight = 100;
if ($totalCartWeight < $minCodWeight) {
$updated_results = array();
foreach ($results as $result) {
if ($result['code'] != 'cod') {
$updated_results[] = $result;
}
}
$results = $updated_results;
}
/*** our custom code ***/
]]></add>
</operation>
</file>
</modification>
如您所见,大多数标签是不言自明的。 最重要的标记是<file>
,它定义将在其上执行操作的文件名。 <search>
标记用于搜索我们要查找的代码,最后我们使用<add>
标记注入代码。
安装模块
转至后端,然后导航至Extensions> Extension Installer 。 单击上载按钮,然后选择我们在上一节中创建的文件。 如果一切顺利,您应该会看到一条成功消息。
导航到Extensions> Modifications ,您应该会在该页面上看到OCMOD扩展名。
您已经成功安装了扩展程序!
转至前端,然后在购物车中添加几个产品,以使购物车的总重量保持在100以下。现在,开始结帐流程,在“ 付款方式”标签中,您应该注意到没有可用的COD 。 当然,您还应该至少启用一种付款方式,否则OpenCart将抱怨没有可用的付款选项 。
所以,今天就这样! 这样,您可以继续使用OCMOD系统进行需要更改核心文件的任何自定义。
结论
在本文中,我们学习了如何使用OCMOD系统根据购物车的总重量过滤结帐时的付款方式。 我希望您喜欢它并在OpenCart中学到一些新东西。
不要忘记使用下面的评论提要来分享您的想法和疑问。