Скидки от суммы заказа в OpenCart 3: Пошаговый урок создания модуля disc.ocmod.zip
- Показывать справа: 0
Это пошаговый урок по настройке скидок от суммы заказа в OpenCart 3! В этом уроке мы будем использовать модуль disc.ocmod.zip, чтобы предоставить покупателям скидки, зависящие от общей стоимости их корзины. Это отличный способ увеличить продажи и лояльность клиентов. Разберем установку, настройку и устранение распространенных проблем. Этот модуль позволит вам легко настроить скидки от суммы заказа в OpenCart, увеличивая тем самым средний чек и стимулируя клиентов к совершению более крупных покупок. Ищете, где скачать готовый модуль скидок OpenCart 3? Это расширение скидок для OpenCart – это то, что вам нужно - если хотите сделать сами! Также в магазине есть готовый модуль OPENCART с расширенными настройками и возможностями скидки
Основные преимущества модуля (и что вы узнаете в этом уроке):
- Автоматическое применение скидки при достижении определенной суммы заказа - вы научитесь настраивать это самостоятельно.
- Настраиваемые проценты скидок для разных суммовых диапазонов - попрактикуетесь с различными диапазонами и стратегиями.
- Простая установка и конфигурация - мы пройдем через каждый шаг.
- Мультиязыковая поддержка - узнаете, как адаптировать модуль для разных языков.
Шаг 1: Установка модуля:
- Создайте архив
disc.ocmod.zip.(как его сделать как раз ниже об этом) - В админ-панели OpenCart перейдите в "Модули" -> "Установка расширений".
- Загрузите файл
disc.ocmod.zip. - Перейдите в "Модули" -> "Модификации" и обновите кеш модификаций. *Важно: не забудьте этот шаг, иначе модуль может не работать корректно!*
- Перейдите в "Модули" -> "Модули" и найдите модуль "Disc" (или "Скидка от суммы").
- Установите и настройте модуль. *Переходим к следующему шагу!*
Шаг 2: Файловая структура модуля: Разбираемся с компонентами
Дерево файлов модуля (это поможет вам понять структуру которую необходимо создать):
install.xml
upload/
├── admin/
│ ├── controller/
│ │ └── extension/
│ │ └── total/
│ │ └── disc.php
│ ├── language/
│ │ ├── en-gb/
│ │ │ └── extension/
│ │ │ └── total/
│ │ │ └── disc.php
│ │ └── ru-ru/
│ │ └── extension/
│ │ └── total/
│ │ └── disc.php
│ └── view/
│ └── template/
│ └── extension/
│ └── total/
│ └── disc.twig
└── catalog/
├── controller/
│ └── extension/
│ └── total/
│ └── disc.php
├── language/
│ └── en-gb/
│ └── extension/
│ └── total/
│ └── disc.php
└── model/
└── extension/
└── total/
└── disc.php
Шаг 3: Расположение и содержимое основных файлов: Изучаем код
Файл установки ocmod:
Содержимое файла install.xml: (Этот файл определяет, какие изменения вносятся в файлы OpenCart):
<?xml version="1.0" encoding="utf-8"?>
<modification>
<name>disc</name>
<version>1.0.0</version>
<author>webalan</author>
<code>disc</code>
<link>http://www.webalan.ru</link>
<description>Простой модуль для расчета суммы скидки от общей суммы в корзине.</description>
<oc_version>3.0.*</oc_version>
</modification>l
Файлы административной части: Настройка модуля
Контроллер административной панели: admin/controller/extension/total/disc.php (Отвечает за логику работы модуля в админке)
<?php
class ControllerExtensionTotalDisc extends Controller {
private $error = array();
public function index() {
$this->load->language('extension/total/disc');
$this->document->setTitle($this->language->get('heading_title'));
$this->load->model('setting/setting');
if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
if (empty($this->request->post['total_disc_name'])) {
$this->request->post['total_disc_name'] = 'Скидка';
}
if (empty($this->request->post['total_disc_sort_order'])) {
$this->request->post['total_disc_sort_order'] = 0;
}
if (empty($this->request->post['total_disc_sum'])) {
$this->request->post['total_disc_sum'] = '5000';
}
if (empty($this->request->post['total_disc_big'])) {
$this->request->post['total_disc_big'] = '10';
}
// if (empty($this->request->post['total_disc_status'])) {
// $this->request->post['total_disc_status'] = '0';
// }
$this->model_setting_setting->editSetting('total_disc', $this->request->post);
$this->session->data['success'] = $this->language->get('text_success');
$this->response->redirect($this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=total', 'SSL'));
}
// Language variables
$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');
// Settings
// $data['total_disc_status'] = isset($this->request->post['total_disc_status']) ? $this->request->post['total_disc_status'] : $this->config->get('total_disc_status');
$data['total_disc_name'] = isset($this->request->post['total_disc_name']) ? $this->request->post['total_disc_name'] : $this->config->get('total_disc_name');
$data['error_name'] = "";
if (empty($data['total_disc_name']))
$data['error_name'] = $this->language->get('error_name');
$data['total_disc_sum'] = isset($this->request->post['disc_sum']) ? $this->request->post['total_disc_sum'] : $this->config->get('total_disc_sum');
$data['error_sum'] = "";
if (empty($data['total_disc_sum']))
$data['error_sum'] = $this->language->get('error_sum');
$data['total_disc_big'] = isset($this->request->post['total_disc_big']) ? $this->request->post['total_disc_big'] : $this->config->get('total_disc_big');
$data['error_big'] = "";
if (empty($data['total_disc_big']))
$data['error_big'] = $this->language->get('error_big');
// Buttons
$data['button_save'] = $this->language->get('button_save');
$data['button_cancel'] = $this->language->get('button_cancel');
// Breadcrumbs
$data['breadcrumbs'] = array();
$data['breadcrumbs'][] = array(
'text' => $this->language->get('text_home'),
'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], 'SSL')
);
$data['breadcrumbs'][] = array(
'text' => $this->language->get('text_extension'),
'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=total', 'SSL')
);
$data['breadcrumbs'][] = array(
'text' => $this->language->get('heading_title'),
'href' => $this->url->link('extension/total/disc', 'user_token=' . $this->session->data['user_token'], 'SSL')
);
// Form actions
$data['action'] = $this->url->link('extension/total/disc', 'user_token=' . $this->session->data['user_token'], 'SSL');
$data['cancel'] = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=total', 'SSL');
if (isset($this->error['warning'])) {
$data['error_warning'] = $this->error['warning'];
} else {
$data['error_warning'] = '';
}
if (isset($this->request->post['total_disc_status'])) {
$data['total_disc_status'] = $this->request->post['total_disc_status'];
} else {
$data['total_disc_status'] = $this->config->get('total_disc_status');
}
if (isset($this->request->post['total_disc_name'])) {
$data['total_disc_name'] = $this->request->post['total_disc_name'];
} else {
$data['total_disc_name'] = $this->config->get('total_disc_name');
}
if (isset($this->request->post['total_disc_sum'])) {
$data['total_disc_sum'] = $this->request->post['total_disc_sum'];
} else {
$data['total_disc_sum'] = $this->config->get('total_disc_sum');
}
if (isset($this->request->post['total_disc_big'])) {
$data['total_disc_big'] = $this->request->post['total_disc_big'];
} else {
$data['total_disc_big'] = $this->config->get('total_disc_big');
}
if (isset($this->request->post['total_disc_sort_order'])) {
$data['total_disc_sort_order'] = $this->request->post['total_disc_sort_order'];
} else {
$data['total_disc_sort_order'] = $this->config->get('total_disc_sort_order');
}
$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('extension/total/disc', $data));
}
protected function validate() {
if (!$this->user->hasPermission('modify', 'extension/total/disc')) {
$this->error['warning'] = $this->language->get('error_permission');
}
return !$this->error;
}
}
?>
Языковой файл (русский) административной панели: admin/language/ru-ru/extension/total/disc.php (Содержит текст интерфейса на русском языке)
<?php
// Heading
$_['heading_title'] = 'Скидка от цены';
// Text
$_['text_extension'] = 'Расширения';
$_['text_success'] = 'Настройки успешно изменены!';
$_['text_edit'] = 'Редактирование';
$_['text_all_zones'] = 'Полная зона';
// Entry
$_['entry_status'] = 'Статус';
$_['entry_sort_order'] = 'Порядок сортировки';
// Discount Rules
$_['text_discount_rules'] = 'Discount Rules';
$_['entry_name'] = 'Введите сумму';
$_['entry_sum'] = 'Минимальная сумма';
$_['entry_big'] = 'Скидка (%)';
// Errors
$_['error_permission'] = 'Warning: You do not have permission to modify custom discount totals!';
$_['error_numeric_sum'] = 'Warning: Minimum total must be a numeric value!';
$_['error_numeric_discount_percentage'] = 'Warning: Discount percentage must be a numeric value!';
$_['error_name'] = 'Не введено имя!';
$_['error_sum'] = 'Не введена сумма!';
$_['error_big'] = 'Не введены проценты!';
?>
Файл шаблона (twig) административной панели: admin/view/template/extension/total/disc.twig (Отвечает за отображение настроек модуля в админке)
{{ header }}
{{ column_left }}
<div id="content">
<div class="page-header">
<div class="container-fluid">
<div class="pull-right">
<button type="submit" form="form-disc" data-bs-toggle="tooltip" title="{{ button_save }}" class="btn btn-primary"><i class="fa fa-save"></i></button>
<a href="/{{ cancel }}" data-bs-toggle="tooltip" title="{{ button_cancel }}" class="btn btn-default"><i class="fa fa-reply"></i></a>
</div>
<h1>{{ heading_title }}</h1>
<ul class="breadcrumb">
{% for breadcrumb in breadcrumbs %}
<li><a href="/{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li>
{% endfor %}
</ul>
</div>
</div>
<div class="container-fluid">
{% if error_warning %}
<div class="alert alert-danger"><i class="fa fa-exclamation-circle"></i> {{ error_warning }}
<button type="button" class="close" data-bs-dismiss="alert">×</button>
</div>
{% endif %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-pencil"></i> {{ text_edit }}</h3>
</div>
<div class="panel-body">
<form action="{{ action }}" method="post" enctype="multipart/form-data" id="form-custom-discount" class="form-horizontal">
<div class="form-group">
<label class="col-sm-2 control-label" for="input-status">{{ entry_status }}</label>
<div class="col-sm-10">
<select name="total_disc_status" id="input-status" class="form-control">
{% if total_disc_status %}
<option value="1" selected="selected">{{ text_enabled }}</option>
<option value="0">{{ text_disabled }}</option>
{% else %}
<option value="1">{{ text_enabled }}</option>
<option value="0" selected="selected">{{ text_disabled }}</option>
{% endif %}
</select>
</div>
</div>
<!-- Настройка названия строки скидки -->
<div class="form-group">
<label class="col-sm-2 control-label" for="input-name">Возможность настройки названия строки скидки, отображаемой в корзине</label>
<div class="col-sm-10">
<input type="text" name="total_disc_name" value="{{ total_disc_name }}" placeholder="{{ entry_name }}" id="input-name" class="form-control"/>
{% if error_name %}
<div class="text-danger">{{ error_name }}</div>
{% endif %}
</div>
</div>
<!-- Минимальная сумма для скидки -->
<div class="form-group">
<label class="col-sm-2 control-label" for="input-sum">Возможность настройки минимальной суммы для получения скидки</label>
<div class="col-sm-10">
<input type="text" name="total_disc_sum" value="{{ total_disc_sum }}" placeholder="{{ entry_sum }}" id="input-sum" class="form-control"/>
{% if error_sum %}
<div class="text-danger">{{ error_sum }}</div>
{% endif %}
</div>
</div>
<!-- Размер скидки в процентах -->
<div class="form-group">
<label class="col-sm-2 control-label" for="input-big">Возможность настройки размера скидки в процентах</label>
<div class="col-sm-10">
<input type="text" name="total_disc_big" value="{{ total_disc_big }}" placeholder="{{ entry_big }}" id="input-big" class="form-control"/>
{% if error_big %}
<div class="text-danger">{{ error_big }}</div>
{% endif %}
</div>
</div>
<!-- Порядок сортировки -->
<div class="form-group">
<label class="col-sm-2 control-label" for="input-sort-order">{{ entry_sort_order }}</label>
<div class="col-sm-10">
<input type="text" name="total_disc_sort_order" value="{{ total_disc_sort_order }}" placeholder="{{ entry_sort_order }}" id="input-sort-order" class="form-control"/>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
{{ footer }}
Файлы клиентской части (каталога): Работает для покупателей
Контроллер клиентской части: catalog/controller/extension/total/disc.php (Определяет, как скидка применяется к корзине покупателя)
<?php
class ControllerExtensionTotalDisc extends Controller {
public function getTotal($total_data) {
$this->load->language('extension/total/disc');
//
}
}
Модель клиентской части: catalog/model/extension/total/disc.php (Выполняет расчет скидки)
<?php
class ModelExtensionTotalDisc extends Model {
public function getTotal($total) {
$this->load->language('extension/total/disc');
$totals = $this->cart->getTotal();
$applied_discount_percentage = 0;
if ($totals>=$this->config->get('total_disc_sum')){
$applied_discount_percentage=round($totals*$this->config->get('total_disc_big')/100);
}
if ($applied_discount_percentage!=0) {
$total['totals'][] = array(
'code' => 'disc',
'title' =>sprintf($this->config->get('total_disc_name'), $applied_discount_percentage),
'value' => $applied_discount_percentage,
'sort_order' => $this->config->get('total_disc_sort_order')
);
$total['total'] -= $applied_discount_percentage;
}
}
}
Шаг 4: Настройка модуля: Практика!
После установки модуля в админ-панели OpenCart, найдите модуль "Disc" (или "Скидка от суммы"). В настройках модуля вы сможете указать:
- Статус модуля (Включено/Выключено).
- Порядок сортировки.
- Название модуля (отображается в корзине).
- Диапазоны сумм заказа и соответствующие проценты скидки.
Шаг 5: Пример настройки скидок:
- Сумма заказа от 1000 руб. - скидка 5%. *Создайте тестовый заказ и убедитесь, что скидка применяется!*
- Сумма заказа от 3000 руб. - скидка 10%. *Проверьте этот диапазон!*
- Сумма заказа от 5000 руб. - скидка 15%. *И этот тоже!*
Шаг 6: Распространенные проблемы и решения:
- *Проблема: Модуль не отображается в списке. Решение: 1) Убедитесь, что вы обновили кеш модификаций. 2) Проверьте права доступа для группы пользователей "Administrator" (или вашей основной группы) в разделе "Система" -> "Пользователи" -> "Группы пользователей". Убедитесь, что для модуля "Disc" (или "Скидка от суммы") разрешен просмотр и внесение изменений.*
- *Проблема: Скидка не применяется. Решение: Проверьте правильность настройки диапазонов и статуса модуля.*
Заключение:
Модуль disc.ocmod.zip - это эффективный инструмент для повышения лояльности клиентов и увеличения среднего чека в вашем магазине OpenCart 3. Гибкие настройки и простая установка позволяют быстро настроить скидки от суммы заказа и начать получать результаты. Сделайте модуль прямо сейчас и увеличьте свои продажи в своем OpenCart магазине!