Скидки от суммы заказа в OpenCart 3: Пошаговый урок создания модуля disc.ocmod.zip

Показывать справа: 0

Это пошаговый урок по настройке скидок от суммы заказа в OpenCart 3! В этом уроке мы будем использовать модуль disc.ocmod.zip, чтобы предоставить покупателям скидки, зависящие от общей стоимости их корзины. Это отличный способ увеличить продажи и лояльность клиентов. Разберем установку, настройку и устранение распространенных проблем. Этот модуль позволит вам легко настроить скидки от суммы заказа в OpenCart, увеличивая тем самым средний чек и стимулируя клиентов к совершению более крупных покупок. Ищете, где скачать готовый модуль скидок OpenCart 3? Это расширение скидок для OpenCart – это то, что вам нужно - если хотите сделать сами! Также в магазине есть готовый модуль OPENCART с расширенными настройками и возможностями скидки

Основные преимущества модуля (и что вы узнаете в этом уроке):

  • Автоматическое применение скидки при достижении определенной суммы заказа - вы научитесь настраивать это самостоятельно.
  • Настраиваемые проценты скидок для разных суммовых диапазонов - попрактикуетесь с различными диапазонами и стратегиями.
  • Простая установка и конфигурация - мы пройдем через каждый шаг.
  • Мультиязыковая поддержка - узнаете, как адаптировать модуль для разных языков.

Шаг 1: Установка модуля:

  1. Создайте архив disc.ocmod.zip.(как его сделать как раз ниже об этом)
  2. В админ-панели OpenCart перейдите в "Модули" -> "Установка расширений".
  3. Загрузите файл disc.ocmod.zip.
  4. Перейдите в "Модули" -> "Модификации" и обновите кеш модификаций. *Важно: не забудьте этот шаг, иначе модуль может не работать корректно!*
  5. Перейдите в "Модули" -> "Модули" и найдите модуль "Disc" (или "Скидка от суммы").
  6. Установите и настройте модуль. *Переходим к следующему шагу!*

Шаг 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 магазине!

Покупка готового скрипта joomla 3

или просто напишите в телеграмм https://t.me/webalan