Статьи

Создание пользовательского метода доставки в OpenCart: часть первая

Хотя OpenCart предоставляет ряд полезных методов доставки в самом ядре, всегда есть шанс, что вам понадобится создать свой собственный. С другой стороны, будучи веб-разработчиком, вы всегда будете пытаться исследовать фреймворк по вашему выбору, чтобы увидеть, как создать свой собственный материал!

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

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

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

Давайте начнем со списка файлов, необходимых в серверной части. Мы будем использовать «пользовательский» в качестве имени нашего пользовательского метода доставки.

  • admin/controller/shipping/custom.php : это файл контроллера, в котором мы настроим все необходимое для формы конфигурации.
  • admin/language/english/shipping/custom.php : Это языковой файл, в котором мы определим метки для нашей формы.
  • admin/view/template/shipping/custom.tpl : это файл шаблона представления, который содержит HTML-код нашей формы конфигурации.

Вот и все, что касается внутренней настройки.

Начнем с настройки контроллера.

Создайте файл admin/controller/shipping/custom.php и вставьте следующее содержимое в этот файл.

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<?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 определенный в этом файле.

1
2
3
4
5
6
7
$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 чтобы мы могли получить к ним доступ в файле шаблона представления.

Продвигаясь вперед, есть стандартный фрагмент для настройки правильных ссылок.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
$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 .

1
2
$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’);

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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’);
}

В следующем разделе мы загрузим налоговые классы и геозоны из базы данных, которые будут использоваться в качестве параметров раскрывающегося списка в форме конфигурации.

1
2
3
4
5
$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();

Наконец, мы назначаем дочерние шаблоны и основной шаблон представления.

1
2
3
4
5
$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 и вставьте следующее содержимое в этот файл.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<?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 и вставьте следующее содержимое в этот файл.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php echo $header;
<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;
      <ul class=»breadcrumb»>
        <?php foreach ($breadcrumbs as $breadcrumb) { ?>
        <li><a href=»<?php echo $breadcrumb[‘href’]; ?>»><?php echo $breadcrumb[‘text’];
        <?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;
      </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;
            <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;
            <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;
                <?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’];
                <?php } else { ?>
                <option value=»<?php echo $tax_class[‘tax_class_id’]; ?>»><?php echo $tax_class[‘title’];
                <?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;
            <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;
                <?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’];
                <?php } else { ?>
                <option value=»<?php echo $geo_zone[‘geo_zone_id’]; ?>»><?php echo $geo_zone[‘name’];
                <?php } ?>
                <?php } ?>
              </select>
            </div>
          </div>
          <div class=»form-group»>
            <label class=»col-sm-2 control-label» for=»input-status»><?php echo $entry_status;
            <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 value=»0″><?php echo $text_disabled;
                <?php } else { ?>
                <option value=»1″><?php echo $text_enabled;
                <option value=»0″ selected=»selected»><?php echo $text_disabled;
                <?php } ?>
              </select>
            </div>
          </div>
          <div class=»form-group»>
            <label class=»col-sm-2 control-label» for=»input-sort-order»><?php echo $entry_sort_order;
            <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;

Опять же, это должно быть довольно легко понять. Цель этого файла шаблона — предоставить форму конфигурации для нашего пользовательского метода доставки. Он использует переменные, которые мы установили ранее в файле контроллера.

Итак, вот и все, что касается настройки внутреннего файла для нашего пользовательского метода доставки. В следующем разделе мы увидим, как включить наш пользовательский метод доставки и как выглядит пользовательская форма конфигурации!

Перейдите в раздел администратора и перейдите в Расширения> Доставка . Вы должны увидеть, что наш пользовательский способ доставки указан как Пользовательский тариф . Нажмите на знак +, чтобы установить наш способ доставки. После установки вы должны увидеть ссылку « Изменить», чтобы открыть форму конфигурации. Нажмите на ссылку Изменить, и форма должна выглядеть так, как показано на следующем снимке экрана.

Форма конфигурации

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

Поле « Налоговый класс» позволяет вам выбрать соответствующий вариант, если вам нужно будет ввести какой-либо дополнительный налог в дополнение к сумме, определенной в поле « Стоимость» . Давайте сейчас выберем налогооблагаемый товар .

Поле Geo Zone позволяет вам выбрать регион, к которому применяется этот метод; для простоты выберите Все зоны . Кроме того, убедитесь, что вы установили статус « Включен» , иначе он не будет указан при оформлении заказа.

Нажмите кнопку Сохранить , как только вы заполнили необходимые данные, и все будет в порядке. Вот и все для сегодняшней статьи, и я скоро вернусь к вам со следующей частью, которая объяснит настройку файла переднего плана.

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