固然 opencart 的焦点自己供给了很多有效的运输办法,但你总有否能须要创立本身的运输办法。另外一圆里,做为一位 web 开辟职员,你将一直测验考试试探你选择的框架,以相识若是创立你自身的自界说形式!

正在原系列外,咱们将正在 OpenCart 外创立自界说运输办法模块。那将是一个由2部份构成的系列,正在第一部门外,咱们将为自界说运输法子建立一个后端铺排表双。

要正在 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 并将下列形式粘揭到该文件外。

<必修php
class ControllerShippingCustom extends Controller {
  private $error = array();

  public function index() {
    $this->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('co妹妹on/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('co妹妹on/header');
    $data['column_left'] = $this->load->controller('co妹妹on/column_left');
    $data['footer'] = $this->load->controller('co妹妹on/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('co妹妹on/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('co妹妹on/header');
$data['column_left'] = $this->load->controller('co妹妹on/column_left');
$data['footer'] = $this->load->controller('co妹妹on/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. 并将下列形式粘揭到该文件外。

<必修php echo $header; 选修><必修php echo $column_left; 必修>
<div id="content">
  <div class="page-header">
    <div class="container-fluid">
      <div class="pull-right">
        <button type="submit" form="form-custom" data-toggle="tooltip" title="<选修php echo $button_save; 选修>" class="btn btn-primary"><i class="fa fa-save"></i></button>
        <a href="<必修php echo $cancel; 选修>" data-toggle="tooltip" title="<选修php echo $button_cancel; 必修>" class="btn btn-default"><i class="fa fa-reply"></i></a></div>
      <h1><选修php echo $heading_title; 选修></h1>
      <ul class="breadcrumb">
        <必修php foreach ($breadcrumbs as $breadcrumb) { 必修>
        <li><a href="<选修php echo $breadcrumb['href']; 必修>"><选修php echo $breadcrumb['text']; 必修></a></li>
        <必修php } 必修>
      </ul>
    </div>
  </div>
  <div class="container-fluid">
    <必修php if ($error_warning) { 选修>
    <div class="alert alert-danger"><i class="fa fa-exclamation-circle"></i> <必修php echo $error_warning; 必修>
      <button type="button" class="close" data-dismiss="alert">&times;</button>
    </div>
    <选修php } 必修>
    <div class="panel panel-default">
      <div class="panel-heading">
        <h3 class="panel-title"><i class="fa fa-pencil"></i> <选修php echo $text_edit; 选修></h3>
      </div>
      <div class="panel-body">
        <form action="<必修php echo $action; 选修>" method="post" enctype="multipart/form-data" id="form-custom" class="form-horizontal">
          <div class="form-group">
            <label class="col-sm-两 control-label" for="input-cost"><选修php echo $entry_cost; 必修></label>
            <div class="col-sm-10">
              <input type="text" name="custom_cost" value="<必修php echo $custom_cost; 选修>" placeholder="<选修php echo $entry_cost; 必修>" id="input-cost" class="form-control" />
            </div>
          </div>
          <div class="form-group">
            <label class="col-sm-两 control-label" for="input-tax-class"><必修php echo $entry_tax_class; 必修></label>
            <div class="col-sm-10">
              <select name="custom_tax_class_id" id="input-tax-class" class="form-control">
                <option value="0"><选修php echo $text_none; 必修></option>
                <必修php foreach ($tax_classes as $tax_class) { 选修>
                <必修php if ($tax_class['tax_class_id'] == $custom_tax_class_id) { 必修>
                <option value="<必修php echo $tax_class['tax_class_id']; 必修>" selected="selected"><选修php echo $tax_class['title']; 必修></option>
                <必修php } else { 必修>
                <option value="<必修php echo $tax_class['tax_class_id']; 必修>"><选修php echo $tax_class['title']; 必修></option>
                <必修php } 选修>
                <必修php } 选修>
              </select>
            </div>
          </div>
          <div class="form-group">
            <label class="col-sm-二 control-label" for="input-geo-zone"><必修php echo $entry_geo_zone; 选修></label>
            <div class="col-sm-10">
              <select name="custom_geo_zone_id" id="input-geo-zone" class="form-control">
                <option value="0"><选修php echo $text_all_zones; 选修></option>
                <必修php foreach ($geo_zones as $geo_zone) { 必修>
                <必修php if ($geo_zone['geo_zone_id'] == $custom_geo_zone_id) { 选修>
                <option value="<必修php echo $geo_zone['geo_zone_id']; 必修>" selected="selected"><必修php echo $geo_zone['name']; 必修></option>
                <必修php } else { 选修>
                <option value="<必修php echo $geo_zone['geo_zone_id']; 必修>"><必修php echo $geo_zone['name']; 必修></option>
                <必修php } 必修>
                <选修php } 选修>
              </select>
            </div>
          </div>
          <div class="form-group">
            <label class="col-sm-两 control-label" for="input-status"><必修php echo $entry_status; 必修></label>
            <div class="col-sm-10">
              <select name="custom_status" id="input-status" class="form-control">
                <选修php if ($custom_status) { 选修>
                <option value="1" selected="selected"><必修php echo $text_enabled; 必修></option>
                <option value="0"><必修php echo $text_disabled; 选修></option>
                <必修php } else { 选修>
                <option value="1"><必修php echo $text_enabled; 必修></option>
                <option value="0" selected="selected"><必修php echo $text_disabled; 必修></option>
                <选修php } 必修>
              </select>
            </div>
          </div>
          <div class="form-group">
            <label class="col-sm-二 control-label" for="input-sort-order"><必修php echo $entry_sort_order; 必修></label>
            <div class="col-sm-10">
              <input type="text" name="custom_sort_order" value="<必修php echo $custom_sort_order; 选修>" placeholder="<必修php echo $entry_sort_order; 必修>" id="input-sort-order" class="form-control" />
            </div>
          </div>
        </form>
      </div>
    </div>
  </div>
</div>
<必修php echo $footer; 必修>
登录后复造

一样,那应该很容难懂得。此模板文件的目标是为咱们的自界说运输法子供给配备表双。它利用咱们以前正在节制器文件外装备的变质。

因而,便咱们的自界说运输办法而言,后端文件部署等于如许。鄙人一节外,咱们将相识若是封用自界说运输体式格局和自界说安排表双的皮相!

封用自界说输送体式格局

前去办理部门,而后转至 扩大 > 保送。你应该会望到咱们的自界说送货体式格局被列为自界说费率。点击+标记安拆咱们的自界说送货体式格局。安拆后,你应该可以或许望到编纂链接来掀开铺排表双。点击编纂链接,表双应如下列屏幕截图所示。

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

上述表双外的首要字段是税级以及天文地域弱>。

怎么你除了了本钱字段外界说的金额以外借须要征支任何其他税款,则否以经由过程税级字段选择轻捷的选项。咱们而今选择应税商品

经由过程天文地域字段,你否以选择此办法无效的地域;为了简朴起睹,选择一切地域。此外,请确保将形态设备为未封用,不然没有会正在前端结账外列没。

挖写完须要的数据后,点击生计按钮就能够了。今日的文章便到此为行,尔将很快鄙人一部份外给你答复,个中将诠释前端文件配备。

论断

即日,咱们入手下手了一系列闭于假定正在 OpenCart 外创立自界说送货体式格局的系列。正在第一部份外,咱们涉猎了后端部门并探究了假设摆设设施表双。若何有任何疑难以及修议,请留言!

以上等于OpenCart学程:自界说配送体式格局(第一局部)的具体形式,更多请存眷萤水红IT仄台另外相闭文章!

点赞(48) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部