Создание пользовательского способа доставки в OpenCart: часть 1

Создание пользовательского способа доставки в OpenCart

От автора: в OpenCart доставка по умолчанию предполагает наличие множества полезных способов. Но всегда есть шанс, что вам понадобится свой собственный. С другой стороны, как разработчик, вы всегда будете изучать свой фреймворк и создавать что-то свое! В этой серии уроков мы создадим пользовательский модуль способа доставки в OpenCart. Серия будет из двух уроков, и в первой части мы создадим back end форму настроек для кастомного метода.

Для создания нового метода доставки необходимо создать файлы согласно схеме именования в OpenCart. В back end вам понадобится создать форму настроек, с помощью которой администратор сможет изменять цену, геозону и другие параметры, связанные с способом доставки. На front end вы создадите необходимые файлы, чтобы пользовательский метод доставки появлялся в корзине!

Сегодня мы разберем часть с back end. Предполагаю, что вы работаете в последней версии OpenCart. Во второй части мы разберем front end, где посмотрим настройки файлов и демо.

Создание файлов на back end

Начнем со списка файлов, которые необходимо создать на back end. Наш способ доставки будет называться custom.

admin/controller/shipping/custom.php: файл контроллера, где мы будем настраивать все необходимое для формы настроек

Интернет-магазин на OpenCart!

Создайте интернет-магазин на самой популярной CMS – OpenCart с нуля!

Приступить к созданию

admin/language/english/shipping/custom.php: языковой файл, в котором будут определяться лейблы для формы

admin/view/template/shipping/custom.tpl: файл шаблона представления с HTML кодом формы настроек

По части back end это все.

Создание файлов

Начнем с создания контроллера.

Создание файла контроллера

Создайте файл 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;
  }
}

Важный файл, определяющий большую часть логики для формы настроек back end. Разберем важные куски кода в методе 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. Пользователи возвращаются к списку способов доставки по клику на кнопку cancel.

Интернет-магазин на OpenCart!

Создайте интернет-магазин на самой популярной CMS – OpenCart с нуля!

Приступить к созданию
$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.php и вставьте следующий код.

<?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-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; ?>

Код очень простой. Цель шаблона – предоставить форму настроек для пользовательского способа доставки. В шаблоне используются переменные, ранее заданные в контроллере.

По созданию файлов на back end все. В следующем разделе мы посмотрим, как активировать наш пользовательский способ доставки, а также узнаем, как выглядит наша форма настроек!

Активация пользовательского способа доставки

Перейдите в панель администратора и далее Extensions > Shipping. Пользовательский метод должен быть в списке Custom Rate. Кликните на + для установки пользовательского метода доставки. После установки вы сможете отредактировать форму по ссылке edit. Кликните на edit, откроется следующая форма.

В этой форме важны поля Tax Class и Geo Zone.

Tax Class позволяет выбрать регион, для которого применим данный метод. Для простоты поставим All Zones. Также статус должен быть Enabled, иначе метод не появится в списке на front end в корзине.

После заполнения необходимых данных сохраните форму. На сегодня все. Скоро вернусь с новым уроком, где расскажу про создание файлов front end.

Заключение

Сегодня мы начали серию уроков о создании пользовательского способа доставки в OpenCart. В первой части мы прошли back end и узнали, как создать форму настроек.

Автор: Sajal Soni

Источник: http://code.tutsplus.com/

Редакция: Команда webformyself.

Интернет-магазин на OpenCart!

Создайте интернет-магазин на самой популярной CMS – OpenCart с нуля!

Приступить к созданию

Интернет-магазин на OpenCart

Создание магазина с уникальным шаблоном на CMS OpenCart

Научиться

Метки:

Похожие статьи:

Комментарии Вконтакте:

Комментарии Facebook:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree