Walaupun teras OpenCart sendiri menyediakan banyak kaedah penghantaran yang berguna, sentiasa ada kemungkinan anda perlu mencipta sendiri. Sebaliknya, sebagai pembangun web, anda akan sentiasa cuba meneroka rangka kerja pilihan anda untuk memahami cara mencipta kandungan tersuai anda sendiri!
Dalam siri ini, kami akan mencipta modul kaedah penghantaran tersuai dalam OpenCart. Ini akan menjadi siri dua bahagian, di bahagian pertama kami akan membuat borang konfigurasi bahagian belakang untuk kaedah penghantaran tersuai.
Untuk mencipta kaedah penghantaran tersuai baharu dalam OpenCart, anda perlu melaksanakan fail mengikut konvensyen OpenCart. Pada bahagian belakang, anda perlu menyediakan borang konfigurasi yang membolehkan pentadbir mengkonfigurasi harga, kawasan geografi dan parameter lain yang berkaitan dengan kaedah penghantaran. Di bahagian hadapan, anda akan melaksanakan fail yang diperlukan untuk memilih kaedah penghantaran tersuai anda semasa pembayaran!
Hari ini, kami akan melengkapkan persediaan bahagian belakang. Saya menganggap anda menggunakan versi terkini OpenCart. Di bahagian kedua, kami akan meneroka rakan sejawat bahagian hadapan, di mana kami akan melihat persediaan fail bahagian hadapan dan demo bahagian hadapan.
Mari mulakan dengan senarai fail yang diperlukan untuk bahagian belakang. Kami akan menggunakan "custom" sebagai nama kaedah penghantaran tersuai.
admin/controller/shipping/custom.php
: Ini ialah fail pengawal di mana kami akan menetapkan semua yang diperlukan untuk mengkonfigurasi borang. 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('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.
admin/language/english/shipping/custom.php
: Ini ialah fail bahasa di mana kami akan mentakrifkan teg borang.
admin/view/template/shipping/custom.tpl
: Ini ialah fail templat paparan yang mengandungi kod HTML untuk borang konfigurasi kami.
Beginilah rupa persediaan bahagian belakang.
Tetapan Fail
Buat fail Seterusnya, kami menetapkan pembolehubah
rrreee
Dalam bahagian seterusnya, kami memuatkan kurungan cukai dan kawasan geografi daripada pangkalan data, data yang akan digunakan sebagai pilihan lungsur turun dalam borang konfigurasi.
rrreee
Akhir sekali, kami menetapkan subtemplate paparan dan templat utama. 强>
rrreee
rrreee
Jika anda perlu mengenakan sebarang cukai tambahan sebagai tambahan kepada jumlah yang ditentukan dalam medan Kos, anda boleh memilih pilihan yang sesuai melalui medan Kelas Cukai. Kami kini memilih barang kena cukai. Medan Wilayah Geografi membolehkan anda memilih kawasan yang digunakan oleh kaedah ini; untuk kesederhanaan, pilih Semua Wilayah. Selain itu, pastikan anda menetapkan status kepada Didayakan, jika tidak, ia tidak akan disenaraikan dalam pembayaran bahagian hadapan. Selepas mengisi data yang diperlukan, klik butang Simpan. Itu sahaja untuk artikel hari ini, saya akan menghubungi anda tidak lama lagi dengan bahagian seterusnya di mana saya akan menerangkan persediaan fail bahagian hadapan. Hari ini kami memulakan siri tentang cara membuat kaedah penghantaran tersuai dalam OpenCart. Pada bahagian pertama, kami melihat bahagian belakang dan melihat cara menyediakan borang konfigurasi. Jika anda mempunyai sebarang soalan atau cadangan, sila tinggalkan mesej! Atas ialah kandungan terperinci Tutorial OpenCart: Menyesuaikan Kaedah Penghantaran (Bahagian 1). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!admin/controller/shipping/custom.php
dan tampal kandungan berikut ke dalam fail.
<?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">×</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-2 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-2 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-2 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-2 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-2 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; ?>
index
pengawal. Mengikut konvensyen, anda perlu mentakrifkan nama kelas ControllerShippingCustom
.
Dalam kaedah index
, kami mula-mula memuatkan fail bahasa dan menetapkan tajuk halaman.
Seterusnya, kami memuatkan model setting
dan menyimpan tetapan ke pangkalan data sebagai data POST untuk borang konfigurasi. Sebelum menyimpan data, kami mengesahkan borang menggunakan kaedah validate
yang ditakrifkan dalam fail.
rrreee
Selepas itu, kami menetapkan teg bahasa ke dalam tatasusunan $data
supaya kami boleh mengakses teg ini dalam fail templat paparan.
Seterusnya, terdapat coretan standard untuk menyediakan pautan serbuk roti yang betul.
rrreee
action
untuk memastikan borang diserahkan kepada kaedah index
kami. Begitu juga, jika pengguna mengklik butang Batal
, mereka akan dikembalikan ke senarai kaedah penghantaran.
rrreee
Buat fail bahasa
admin/language/english/shipping/custom.php
dan tampal kandungan berikut ke dalam fail. Buat fail paparan
🎜Buat fail admin/view/template/shipping/custom.
dan tampalkan kandungan berikut ke dalam fail. 🎜
rrreee
🎜Sekali lagi, ini sepatutnya mudah difahami. Tujuan fail templat ini adalah untuk menyediakan borang konfigurasi untuk kaedah penghantaran tersuai kami. Ia menggunakan pembolehubah yang kami tetapkan sebelum ini dalam fail pengawal. 🎜
🎜Jadi, setakat kaedah penghantaran tersuai kami, persediaan fail bahagian belakang adalah seperti ini. Dalam bahagian seterusnya, kita akan melihat cara untuk mendayakan kaedah penghantaran tersuai dan menyesuaikan rupa bentuk konfigurasi! 🎜
🎜Dayakan penghantaran tersuai🎜
🎜Pergi ke bahagian admin dan pergi ke 🎜 Sambungan > Penghantaran 🎜. Anda seharusnya melihat kaedah penghantaran tersuai kami disenaraikan sebagai 🎜Kadar Tersuai🎜. Klik simbol 🎜+🎜 untuk memasang kaedah penghantaran tersuai kami. Setelah dipasang, anda sepatutnya dapat melihat pautan 🎜Edit🎜 untuk membuka borang konfigurasi. Klik pautan 🎜Edit🎜 dan borang akan kelihatan seperti tangkapan skrin di bawah. 🎜
🎜🎜🎜🎜Bidang penting dalam borang di atas ialah 🎜Kelas Cukai🎜 dan 🎜Kawasan Geografi🎜. 🎜🎜🎜Kesimpulan