OpenCart教程:自定义配送方式(第一部分)

虽然 opencart 的核心本身提供了许多有用的运输方法,但您总有可能需要创建自己的运输方法。另一方面,作为一名 web 开发人员,您将始终尝试探索您选择的框架,以了解如何创建您自己的自定义内容!

在本系列中,我们将在 OpenCart 中创建自定义运输方法模块。这将是一个由两部分组成的系列,在第一部分中,我们将为自定义运输方法创建一个后端配置表单。

要在 OpenCart 中创建新的自定义运输方法,需要按照 OpenCart 的约定实施文件。在后端,您需要提供一个配置表单,允许管理员配置价格、地理区域以及与运输方式相关的其他参数。在前端,您将实现所需的文件,以便在结账时选择您的自定义送货方式!

今天,我们将完成后端设置。我假设您使用的是最新版本的 OpenCart。在第二部分中,我们将探索前端对应部分,其中我们将看到前端文件设置和前端演示。

后端文件设置概览

让我们从后端所需的文件列表开始。我们将使用“custom”作为自定义送货方式的名称。

admin/controller/shipping/custom.php:这是一个控制器文件,我们将在其中设置配置表单所需的所有内容。admin/language/english/shipping/custom.php:这是一个语言文件,我们将在其中定义表单的标签。admin/view/template/shipping/custom.tpl:这是一个视图模板文件,其中包含我们的配置表单的 HTML 代码。

这就是后端设置的情况。

文件设置

让我们从控制器设置开始。

创建控制器文件

创建文件 admin/controller/shipping/custom.php 并将以下内容粘贴到该文件中。

load->language('shipping/custom');    $this->document->setTitle($this->language->get('heading_title'));    $this->load->model('setting/setting');    if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {      $this->model_setting_setting->editSetting('custom', $this->request->post);      $this->session->data['success'] = $this->language->get('text_success');      $this->response->redirect($this->url->link('extension/shipping', 'token=' . $this->session->data['token'], 'SSL'));    }    $data['heading_title'] = $this->language->get('heading_title');        $data['text_edit'] = $this->language->get('text_edit');    $data['text_enabled'] = $this->language->get('text_enabled');    $data['text_disabled'] = $this->language->get('text_disabled');    $data['text_all_zones'] = $this->language->get('text_all_zones');    $data['text_none'] = $this->language->get('text_none');    $data['entry_cost'] = $this->language->get('entry_cost');    $data['entry_tax_class'] = $this->language->get('entry_tax_class');    $data['entry_geo_zone'] = $this->language->get('entry_geo_zone');    $data['entry_status'] = $this->language->get('entry_status');    $data['entry_sort_order'] = $this->language->get('entry_sort_order');    $data['button_save'] = $this->language->get('button_save');    $data['button_cancel'] = $this->language->get('button_cancel');    if (isset($this->error['warning'])) {      $data['error_warning'] = $this->error['warning'];    } else {      $data['error_warning'] = '';    }    $data['breadcrumbs'] = array();    $data['breadcrumbs'][] = array(      'text' => $this->language->get('text_home'),      'href' => $this->url->link('common/dashboard', 'token=' . $this->session->data['token'], 'SSL')    );    $data['breadcrumbs'][] = array(      'text' => $this->language->get('text_shipping'),      'href' => $this->url->link('extension/shipping', 'token=' . $this->session->data['token'], 'SSL')    );    $data['breadcrumbs'][] = array(      'text' => $this->language->get('heading_title'),      'href' => $this->url->link('shipping/custom', 'token=' . $this->session->data['token'], 'SSL')    );    $data['action'] = $this->url->link('shipping/custom', 'token=' . $this->session->data['token'], 'SSL');    $data['cancel'] = $this->url->link('extension/shipping', 'token=' . $this->session->data['token'], 'SSL');    if (isset($this->request->post['custom_cost'])) {      $data['custom_cost'] = $this->request->post['custom_cost'];    } else {      $data['custom_cost'] = $this->config->get('custom_cost');    }    if (isset($this->request->post['custom_tax_class_id'])) {      $data['custom_tax_class_id'] = $this->request->post['custom_tax_class_id'];    } else {      $data['custom_tax_class_id'] = $this->config->get('custom_tax_class_id');    }    if (isset($this->request->post['custom_geo_zone_id'])) {      $data['custom_geo_zone_id'] = $this->request->post['custom_geo_zone_id'];    } else {      $data['custom_geo_zone_id'] = $this->config->get('custom_geo_zone_id');    }    if (isset($this->request->post['custom_status'])) {      $data['custom_status'] = $this->request->post['custom_status'];    } else {      $data['custom_status'] = $this->config->get('custom_status');    }    if (isset($this->request->post['custom_sort_order'])) {      $data['custom_sort_order'] = $this->request->post['custom_sort_order'];    } else {      $data['custom_sort_order'] = $this->config->get('custom_sort_order');    }    $this->load->model('localisation/tax_class');    $data['tax_classes'] = $this->model_localisation_tax_class->getTaxClasses();    $this->load->model('localisation/geo_zone');    $data['geo_zones'] = $this->model_localisation_geo_zone->getGeoZones();    $data['header'] = $this->load->controller('common/header');    $data['column_left'] = $this->load->controller('common/column_left');    $data['footer'] = $this->load->controller('common/footer');    $this->response->setOutput($this->load->view('shipping/custom.tpl', $data));  }  protected function validate() {    if (!$this->user->hasPermission('modify', 'shipping/custom')) {      $this->error['warning'] = $this->language->get('error_permission');    }    return !$this->error;  }}

这是一个重要的文件,定义了后端配置表单的大部分逻辑。我们将浏览控制器的 index 方法中的重要片段。根据约定,您需要定义类名 ControllerShippingCustom。

在 index 方法中,我们首先加载语言文件并设置页面标题。

接下来,我们加载 setting 模型并将设置保存到数据库中,作为配置表单的 POST 数据。在保存数据之前,我们使用该文件中定义的 validate 方法验证表单。

$this->load->model('setting/setting');if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {  $this->model_setting_setting->editSetting('custom', $this->request->post);  $this->session->data['success'] = $this->language->get('text_success');  $this->response->redirect($this->url->link('extension/shipping', 'token=' . $this->session->data['token'], 'SSL'));}

之后,我们将语言标签分配到 $data 数组中,以便我们可以在视图模板文件中访问这些标签。

接下来,有一个标准片段可以设置正确的面包屑链接。

$data['breadcrumbs'] = array();$data['breadcrumbs'][] = array(  'text' => $this->language->get('text_home'),  'href' => $this->url->link('common/dashboard', 'token=' . $this->session->data['token'], 'SSL'));$data['breadcrumbs'][] = array(  'text' => $this->language->get('text_shipping'),  'href' => $this->url->link('extension/shipping', 'token=' . $this->session->data['token'], 'SSL'));$data['breadcrumbs'][] = array(  'text' => $this->language->get('heading_title'),  'href' => $this->url->link('shipping/custom', 'token=' . $this->session->data['token'], 'SSL'));

接下来,我们设置 action 变量,以确保表单提交到我们的 index 方法。同样,如果用户点击 取消 按钮,就会返回送货方式列表。

$data['action'] = $this->url->link('shipping/custom', 'token=' . $this->session->data['token'], 'SSL');$data['cancel'] = $this->url->link('extension/shipping', 'token=' . $this->session->data['token'], 'SSL');

此外,还有代码可以在添加或编辑模式下填充配置表单字段的默认值。

if (isset($this->request->post['custom_cost'])) {  $data['custom_cost'] = $this->request->post['custom_cost'];} else {  $data['custom_cost'] = $this->config->get('custom_cost');}if (isset($this->request->post['custom_tax_class_id'])) {  $data['custom_tax_class_id'] = $this->request->post['custom_tax_class_id'];} else {  $data['custom_tax_class_id'] = $this->config->get('custom_tax_class_id');}if (isset($this->request->post['custom_geo_zone_id'])) {  $data['custom_geo_zone_id'] = $this->request->post['custom_geo_zone_id'];} else {  $data['custom_geo_zone_id'] = $this->config->get('custom_geo_zone_id');}if (isset($this->request->post['custom_status'])) {  $data['custom_status'] = $this->request->post['custom_status'];} else {  $data['custom_status'] = $this->config->get('custom_status');}if (isset($this->request->post['custom_sort_order'])) {  $data['custom_sort_order'] = $this->request->post['custom_sort_order'];} else {  $data['custom_sort_order'] = $this->config->get('custom_sort_order');}

在下一部分中,我们从数据库加载税级和地理区域,这些数据将用作配置表单中的下拉选项。

$this->load->model('localisation/tax_class');$data['tax_classes'] = $this->model_localisation_tax_class->getTaxClasses();$this->load->model('localisation/geo_zone');$data['geo_zones'] = $this->model_localisation_geo_zone->getGeoZones();

最后,我们分配视图的子模板和主模板。

$data['header'] = $this->load->controller('common/header');$data['column_left'] = $this->load->controller('common/column_left');$data['footer'] = $this->load->controller('common/footer');$this->response->setOutput($this->load->view('shipping/custom.tpl', $data));

创建语言文件

创建文件 admin/language/english/shipping/custom.php 并将以下内容粘贴到该文件中。

<?php// Heading$_['heading_title']    = 'Custom Rate';// Text$_['text_shipping']    = 'Shipping';$_['text_success']     = 'Success: You have modified custom rate shipping!';$_['text_edit']        = 'Edit Custom Rate Shipping';// Entry$_['entry_cost']       = 'Cost';$_['entry_tax_class']  = 'Tax Class';$_['entry_geo_zone']   = 'Geo Zone';$_['entry_status']     = 'Status';$_['entry_sort_order'] = 'Sort Order';// Error$_['error_permission'] = 'Warning: You do not have permission to modify custom rate shipping!';

文件的内容应该是不言自明的!

创建视图文件

创建文件 admin/view/template/shipping/custom. 并将以下内容粘贴到该文件中。

<form action="" method="post" enctype="multipart/form-data" id="form-custom" class="form-horizontal">
<input type="text" name="custom_cost" value="" placeholder="" id="input-cost" class="form-control" />
<option value="" selected="selected"> <option value="">
<option value="" selected="selected"> <option value="">
<input type="text" name="custom_sort_order" value="" placeholder="" id="input-sort-order" class="form-control" />

同样,这应该很容易理解。此模板文件的目的是为我们的自定义运输方法提供配置表单。它使用我们之前在控制器文件中设置的变量。

因此,就我们的自定义运输方法而言,后端文件设置就是这样。在下一节中,我们将了解如何启用自定义运输方式以及自定义配置表单的外观!

启用自定义运送方式

前往管理部分,然后转至 扩展 > 运送。您应该会看到我们的自定义送货方式被列为自定义费率。点击+符号安装我们的自定义送货方式。安装后,您应该能够看到编辑链接来打开配置表单。点击编辑链接,表单应如以下屏幕截图所示。

OpenCart教程:自定义配送方式(第一部分)

上述表单中的重要字段是税级和地理区域强>。

如果您除了成本字段中定义的金额之外还需要征收任何其他税款,则可以通过税级字段选择适当的选项。我们现在选择应税商品。

通过地理区域字段,您可以选择此方法适用的区域;为了简单起见,选择所有区域。另外,请确保将状态设置为已启用,否则不会在前端结账中列出。

填写完必要的数据后,点击保存按钮就可以了。今天的文章就到此为止,我将很快在下一部分中给您回复,其中将解释前端文件设置。

结论

今天,我们开始了一系列关于如何在 OpenCart 中创建自定义送货方式的系列。在第一部分中,我们浏览了后端部分并探讨了如何设置配置表单。如果有任何疑问和建议,请留言!

以上就是OpenCart教程:自定义配送方式(第一部分)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1551513.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何使用HTML5 Canvas绘制贝塞尔曲线?
上一篇 2025年12月21日 21:48:16
如何使用HTML和CSS创建投资组合画廊
下一篇 2025年12月21日 21:48:25

相关推荐

  • whmcs7.01 centos下完整安装教程

    系统环境centos6.x 64位 1.配置web环境 web环境选择LNMP1.4 下载LNMP安装脚本wget -c  && tar zxf lnmp1.4.tar.gz && cd lnmp1.4 && ./install.sh 运行命令安装,至…

    用户投稿 2026年9月7日
    000
  • 手把手教你用ThinkPHP6开发优秀项目

    随着互联网和移动互联网的不断发展,计算机程序开发也变得越来越有用武之地。开发优秀项目需要不仅需要深厚的编程功底,还需要选择和掌握合适的开发框架。thinkphp6是一款十分流行的php开源框架,该框架具有强大的功能和易于使用的优点,在web应用程序中广泛应用。今天我将通过一系列的手把手教程,来向大家…

    用户投稿 2026年9月7日
    000
  • Nginx配置文件实例详解

    Nginx配置文件结构  nginx配置文件由指令(directive)组成,指令分为两种形式,简单指令和区块指令。 一条简单指令由指令名、参数和结尾的分号(;)组成,例如: listen 80 backlog 4096; ,其中“listen”是指令名,“80”、“backlog”、“4096”都…

    用户投稿 2026年9月6日
    000
  • Yii框架教程:创建完整的Web应用程序

    yii框架是一款快速、安全、高效的web应用程序框架,广泛应用于各种web开发项目。本篇文章将为大家介绍如何创建一个完整的yii框架web应用程序。 步骤一:安装Yii框架 在开始创建应用程序之前,我们需要安装Yii框架。该框架提供了两种安装方式,一种是使用Composer,另一种是下载Yii的发布…

    用户投稿 2026年9月6日
    000
  • Linux中inode用法教程

    这篇文章主要给大家介绍了在linux中关于inode的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。 背景 最近在复习Linux命令,到df的时候发现了一个之前忽略的东西。也就是 -i 这个选项,列出文件系统分区的inode信息。这个inode,是个什么东…

    用户投稿 2026年9月4日
    600
  • oppok1连接wifi的操作教程

    oppok1连接wifi的操作教程oppok1连接wifi的操作教程oppok1连接wifi的操作教程oppok1连接wifi的操作教程

    php小编子墨带来oppo k1连接wifi的操作教程。无论是新手还是老手用户,连接wifi是使用手机必备技能之一。本教程将详细介绍oppo k1如何连接wifi网络,让您轻松享受快速网络连接带来的便利。跟随小编的步骤,让您的oppo k1畅快上网,畅游互联网世界! 1、首先点击手机【设置】。 2、…

    2026年9月3日 • 用户投稿
    100
  • Laravel Redis教程:快速掌握用法

    Laravel Redis教程:快速掌握用法,需要具体代码示例 在现代的Web开发中,缓存是提高网站性能的重要手段之一。而Redis作为一种高性能的内存数据库,被广泛应用于各种Web应用程序中。在本教程中,我们将介绍如何在Laravel框架中使用Redis来提升性能和扩展功能。 一、安装Redis …

    2026年8月31日
    000
  • CSS动画教程:手把手教你实现脉冲特效

    CSS动画教程:手把手教你实现脉冲特效,需要具体代码示例 引言:CSS动画是网页设计中常用的一种效果,它可以为网页增添活力和视觉吸引力。本篇文章将带您深入了解如何利用CSS实现脉冲特效,并提供具体的代码示例教您一步步完成。 一、了解脉冲特效脉冲特效是一种循环变化的动画效果,通常用在按钮、图标或其他元…

    2025年12月24日
    000
  • CSS动画教程:手把手教你实现流水流光特效

    CSS动画教程:手把手教你实现流水流光特效,需要具体代码示例 前言:CSS动画是网页设计中常用的技术,它使得网页更生动有趣,吸引用户的注意力。在这篇教程中,我们将会学习如何使用CSS实现一个流水流光的特效,并提供具体的代码示例。让我们开始吧! 第一步:HTML结构首先,我们需要创建一个基本的HTML…

    2025年12月24日
    000
  • word-wrap怎么自动换行?css强行自动换行教程

    本篇文章给大家带来的内容是关于word-wrap怎么自动换行?css强行自动换行教程,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 word-wrap介绍 word-wrap是设置对象内文字遇到对象顶边时是否采取换行排版布局。 1、语法 立即学习“前端免费学习笔记(深入)”; wo…

    2025年12月24日
    000
  • 用CSS实现网站变黑白色

    这篇文章主要介绍了关于用css实现网站变黑白色,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 以下为全站CSS代码.  html { filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); } 使用方法:这段…

    用户投稿 2025年12月24日
    200
  • 详解css加载会造成阻塞吗_CSS教程_CSS_网页制作

    详解css加载会造成阻塞吗_CSS教程_CSS_网页制作详解css加载会造成阻塞吗_CSS教程_CSS_网页制作详解css加载会造成阻塞吗_CSS教程_CSS_网页制作详解css加载会造成阻塞吗_CSS教程_CSS_网页制作

    这次给大家带来详解css加载会造成阻塞吗,css加载造成阻塞的注意事项有哪些,下面就是实战案例,一起来看一下。 终于考试完了,今天突然想起来前阵子找实习的时候,今日头条面试官问我,js执行会阻塞DOM树的解析和渲染,那么css加载会阻塞DOM树的解析和渲染吗?所以,接下来我就来对css加载对DOM树…

    2025年12月24日 • 用户投稿
    100
  • 关于CSS3中选择符的实例详解

    英文原文: www.456bereastreet.com/archive/200601/css_3_selectors_explained/中文翻译: www.dudo.org/article.asp?id=197注:本文写于2006年1月,当时IE7、IE8和Firefox3还未发行,文中所有说的…

    用户投稿 2025年12月23日
    100
  • 阐述什么是CSS3?

    网页制作Webjx文章简介:CSS3不是新事物,更不是只是围绕border-radius属性实现的圆角。它正耐心的坐在那里,已经准备好了首次登场,呷着咖啡,等着浏览器来铺上红地毯。            CSS3不是新事物,更不是只是围绕border-radius属性实现              …

    用户投稿 2025年12月23日
    100
  • CSS教程(三)伪类——动态链接

    伪类可以看做是一种特殊的类选择符,是能被支持css的浏览器自动所识别的特殊选择符。它的最大的用处就是可以对链接在不同状态下定义不同的样式效果。 1.  语法 伪类的语法是在原有的语法里加上一个伪类(pseudo-class):selector:pseudo-class {property: valu…

    2025年12月23日
    000
  • CSS教程(四)如何在网页中插入CSS

    前两章我们了解了css的语法,但要想在浏览器中显示出效果,就要让浏览器识别并调用。当浏览器读取样式表时,要依照文本格式来读,这里介绍四种在页面中插入样式表的方法:链入外部样式表、内部样式表、导入外表样式表和内嵌样式。   链入外部样式表 链入外部样式表是把样式表保存为一个样式表文件,然后在页面中?l…

    2025年12月23日
    000
  • CSS教程(五)如何使用DW4创建CSS

    1. css styles面板 通过前面几章的学习,相信大家对css有了一定的了解,这一章我们来讲解如何利用dreamweaver4来创建css。首先运行dreamweaver4,启动后,选择菜单下的windows->css styles(或按shitf+f11),系统弹出css styles…

    2025年12月23日
    000
  • CSS教程(六) DW4中CSS属性详解

    在dreamweaver4的css样式里包含了w3c规范定义的所有css1的属性,dreamweaver4把这些属性分为type(类型)、background(背景)、block(块)、box(盒子)、border(边框)、 list(列表)、positioning(定位)、extensions(扩…

    2025年12月23日
    000
  • CSS教程(七) 滤镜

    css提供了一些内置的多媒体滤镜特效,使用这种技术可以把可视化的滤镜和转换效果添加到一个标准的html元素上,例如图片、文本容器、以及其他一些对象。dreamweaver4提供了16种滤镜可供选择,如下图: 下面,我们就来看看在dreamweaver4里如何方便的使用这些css滤镜。 建立一个自定义…

    2025年12月23日
    100
  • CSS教程(八) 简单介绍CSS结合JS的运用

    八、 简单介绍css结合js的运用(针对事件动作) 利用css配合javascript的可以做很多更酷的动态页面效果,在本教程的最后给大家简单介绍一下css配合js的应用。首先,我们要搞清楚事件和动作的概念。在客户端脚本中,javascript 通过对事件进行响应来获得与用户的交互。例如,当用户单击…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信