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

290

Від автора: в 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: частина 1

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

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

Приступити до створення

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

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

По частині back end це все.

Створення файлів

Почнемо з створення контролера.

Створення файлу контролера

Створіть файл 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(‘змінити’, ‘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: частина 1

Інтернет-магазин на 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 та вставте наступний код.

Код говорить сам за себе!

Створення файлу подання

Створіть файл admin/view/template/shipping/custom.php та вставте наступний код.

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

Щодо створення файлів на back end все. В наступному розділі ми побачимо, як активувати наш користувацький спосіб доставки, а також дізнаємося, як виглядає наша форма налаштувань!

Активація користувача способу доставки

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

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

У цій формі важливі поля Tax Class і Geo Zone.

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

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

Висновок

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

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

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

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

Приступити до створення