在本系列中,我们将讨论OpenCart中自定义运送方法模块的实现。 在第一部分中,我们使用后端中的配置表单启用并配置了自定义送货方式。 今天,我们将实现OpenCart所需的文件,以便它可以检测自定义送货方式,并在结帐时将其与其他启用的送货方式一起列出。
我希望您已经创建了本系列第一部分的所有文件。 如果您还没有完成第一部分,我鼓励您先进行那部分操作,然后再继续进行。 另外,我假设您使用的是最新版本的OpenCart。
前端文件设置一览
让我们从前端所需的文件列表开始。
-
catalog/language/english/shipping/custom.php
:这是一个我们将在其中定义标签的语言文件。 -
catalog/model/shipping/custom.php
:这是一个模型文件,这很重要,因为大多数运输计算逻辑都在这里。
就前端设置而言就是这样。
档案设定
让我们从语言文件设置开始。
创建语言文件
创建文件catalog/language/english/shipping/custom.php
,并将以下内容粘贴到该文件中。
<?php
// Text
$_['text_title'] = 'Custom Rate';
$_['text_description'] = 'Custom Shipping Rate';
我认为这不需要任何解释,所以让我们继续吧!
创建模型文件
创建文件catalog/model/shipping/custom.php
并将以下内容粘贴到该文件中。
<?php
class ModelShippingCustom extends Model {
function getQuote($address) {
$this->load->language('shipping/custom');
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "zone_to_geo_zone WHERE geo_zone_id = '" . (int)$this->config->get('custom_geo_zone_id') . "' AND country_id = '" . (int)$address['country_id'] . "' AND (zone_id = '" . (int)$address['zone_id'] . "' OR zone_id = '0')");
if (!$this->config->get('custom_geo_zone_id')) {
$status = true;
} elseif ($query->num_rows) {
$status = true;
} else {
$status = false;
}
$method_data = array();
if ($status) {
$quote_data = array();
$quote_data['custom'] = array(
'code' => 'custom.custom',
'title' => $this->language->get('text_description'),
'cost' => $this->config->get('custom_cost'),
'tax_class_id' => $this->config->get('custom_tax_class_id'),
'text' => $this->currency->format($this->tax->calculate($this->config->get('custom_cost'), $this->config->get('custom_tax_class_id'), $this->config->get('config_tax')))
);
$method_data = array(
'code' => 'custom',
'title' => $this->language->get('text_title'),
'quote' => $quote_data,
'sort_order' => $this->config->get('custom_sort_order'),
'error' => false
);
}
return $method_data;
}
}
根据OpenCart约定,类名称应为ModelShippingCustom
并且有一个getQuote
方法,这是OpenCart提取我们的运输方法所必需的。
您应该注意, $address
参数在getQuote
方法中传递,该方法是结帐时客户的送货地址,它使我们能够确定当前的送货方法是否适用于属于该地址的地理区域。 由以下代码决定。
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "zone_to_geo_zone WHERE geo_zone_id = '" . (int)$this->config->get('custom_geo_zone_id') . "' AND country_id = '" . (int)$address['country_id'] . "' AND (zone_id = '" . (int)$address['zone_id'] . "' OR zone_id = '0')");
if (!$this->config->get('custom_geo_zone_id')) {
$status = true;
} elseif ($query->num_rows) {
$status = true;
} else {
$status = false;
}
接下来,如果可以使用该传送方法,则按照约定准备所需的数组变量。
if ($status) {
$quote_data = array();
$quote_data['custom'] = array(
'code' => 'custom.custom',
'title' => $this->language->get('text_description'),
'cost' => $this->config->get('custom_cost'),
'tax_class_id' => $this->config->get('custom_tax_class_id'),
'text' => $this->currency->format($this->tax->calculate($this->config->get('custom_cost'), $this->config->get('custom_tax_class_id'), $this->config->get('config_tax')))
);
$method_data = array(
'code' => 'custom',
'title' => $this->language->get('text_title'),
'quote' => $quote_data,
'sort_order' => $this->config->get('custom_sort_order'),
'error' => false
);
}
如您所见,我们正在使用$this->config->get
方法来加载“ custom_cost”,“ custom_tax_class_id”和“ custom_sort_order”等配置变量的值。 回顾第一部分,我们在其中使用定制配置表单配置了这些值!
另外,需要注意的一个重要片段是$quote_data
数组中text
键的值。 它计算并格式化将为我们的自定义运输方式收取的总金额。 具体来说,它检查是否应在运输方法的“成本”中添加任何额外的税金。 回顾我们在配置表中提供的“ 税种”设置,在该设置中我们选择了“ 应税商品” 。 因此,它将在运输方式的总金额中增加一笔额外的税费!
我们试图使模型部分保持简单,但是您可以根据运输方法API(如果有)在此文件中进行所有计算。 就模型部分而言就是这样。
前端演示
在前端,在购物车中添加一些产品,然后开始结帐过程。 在“ 步骤4:交付方式”中 ,您应该能够看到我们的自定义运输方式,如以下屏幕截图所示。
它的标题为“自定义运费-$ 14.00” 。 您可能会感到惊讶,尽管我们将Cost参数配置为10 ,但在列表中却显示了14 。 如前所述,我们在后端的“配置”表单中的“ 税种”字段中配置了“ 应税商品” 。
导航到本地化>税收>税收类别 ,然后编辑应税货物 。 您会看到为此税种配置了20%的增值税和统一的2 $ 生态税 。 因此,这将使运输方法的成本再增加4美元! 当然,如果将“ 税收类别”设置为“ 无”,则根本不会应用税收!
所以,今天就这样。 现在,我们已经在OpenCart中成功创建了完整的自定义送货方式模块!
结论
我希望您喜欢这个分为两部分的系列,并且学到了一些有用的东西。 如果您正在寻找更多的OpenCart应用程序,请不要忘记查看我们在市场上可以出售的产品 。 不要忘记使用提要分享您的评论和查询!
翻译自: https://code.tutsplus.com/tutorials/create-a-custom-shipping-method-in-opencart-part-two--cms-25102