Giter Club home page Giter Club logo

simpla-one-time-coupon's Introduction

Simpla CMS: расширенные многоразовые купоны

Реализация для Simpla CMS возможности использовать многоразовый купон только один раз на клиента. Появится возможность для каждого купона установить флаг, является ли данный купон купоном только для одного применения клиентом. Т.е. один купон смогут применять сколько угодно клиентов, но каждый из клиентов не более одного раза. Купон считается использованым, если заказ, в котором он применён, в любом статусе кроме "Отменён". Таким образом можно отменить клиенту заказ и тогда он вправе будет ещё раз применить этот же купон.

Установка

Simpla CMS не предусматривает возможности добавления сторонних модулей. Внедрение даной доработки потребует изменения системных файлов. Проверено на Simpla CMS 2.3.8. При обновлении CMS работа данного решания, вероятно, будет нарушена. Потребуется повторное выполнение (проверка) всех шагов установки.

Настройки в базе данных

Для хранения дополнительного флага "Только для первой покупки" потребуется добавления столбца в таблицу купонов. Выполнить в СУБД SQL-запрос:

ALTER TABLE `s_coupons` ADD `for_first_buy` boolean;

Доработка класса купонов (Coupons)

Класс Coupons - файл /api/Coupons.php

  1. В методе get_coupon() добавить новое поле в перечень полей. Для базовой установки Simpla CMS строку
$query = $this->db->placehold("SELECT c.id, c.code, c.value, c.type, c.expire, min_order_price, c.single, c.usages,

заменить на

$query = $this->db->placehold("SELECT c.id, c.code, c.value, c.type, c.expire, min_order_price, c.single, c.usages, c.for_first_buy,
  1. В методе get_coupons() добавить новое поле в перечень полей. Для базовой установки Simpla CMS строку
$query = $this->db->placehold("SELECT c.id, c.code, c.value, c.type, c.expire, min_order_price, c.single, c.usages,
$query = $this->db->placehold("SELECT c.id, c.code, c.value, c.type, c.expire, min_order_price, c.single, c.usages, c.for_first_buy,
  1. В методе add_coupon() после строк
		if(empty($coupon->single))
			$coupon->single = 0;

добавить строки:

		if (empty($coupon->for_first_buy)) {
			$coupon->for_first_buy = 0;
		}
  1. В конец файла (перед последней закрывающейся фигурной скобкой) добавить метод проверки купона только для первой покупки:
    /**
     * Метод определяет, можно ли применять купон. Для купонов, которые только для однократного использования одним пользователем,
     * этот метод вернёт ЛОЖЬ в случае, если у клиента есть не отменённые заказы с таким купоном
     * @param integer $userId Идентификатор клиента
     * @param string $coupon Купон
     * @return boolean Флаг результата операции
     */
    public function isFirstUse($userId, $coupon)
    {
        $result = false;

        if (empty($userId) || empty($coupon)) {
            $result = true;
        } else {
            $query = $this->db->placehold("SELECT o.id FROM __orders AS o, __coupons AS c WHERE c.for_first_buy=1 AND c.code=? AND c.code=o.coupon_code AND o.user_id=? AND o.status<>3 LIMIT 1", $coupon, intval($userId));
            $this->db->query($query);
            $ids = $this->db->results();

            if (empty($ids)) {
                $result = true;
            } else {
                $result = false;
            }
        }

        return $result;
    }

Доработка класса корзины (CartView)

В файле /view/CartView.php. Строки

				if(empty($coupon) || !$coupon->valid)
				{
		    		$this->cart->apply_coupon($coupon_code);
					$this->design->assign('coupon_error', 'invalid');
				}
				else
				{
					$this->cart->apply_coupon($coupon_code);
					header('location: '.$this->config->root_url.'/cart/');
				}

заменить на

				if(empty($coupon) || !$coupon->valid)
				{
		    		$this->cart->apply_coupon($coupon_code);
					$this->design->assign('coupon_error', 'invalid');
                } else if (!$this->coupons->isFirstUse($this->user->id, $coupon_code)) {
                    // Проверили, что купон только для первого использования: проверка не пройдена
                    $this->cart->apply_coupon($coupon_code);
                    $this->design->assign('coupon_error', 'only_first');
                }
				else
				{
					$this->cart->apply_coupon($coupon_code);
					header('location: '.$this->config->root_url.'/cart/');
				}

Доработка внешнего вида корзины

Файл /design/default/html/cart.tpl. После строки

			{if $coupon_error == 'invalid'}Купон недействителен{/if}

добавить строку

			{if $coupon_error == 'only_first'}Вы уже использовали этот купон ранее{/if}

Сохранение значения флага при сохранении купона в админке

В файле /simpla/CouponAdmin.php после обработки параметров

			$coupon->value = $this->request->post('value', 'float');			
			$coupon->type = $this->request->post('type', 'string');
			$coupon->min_order_price = $this->request->post('min_order_price', 'float');
			$coupon->single = $this->request->post('single', 'float');

добавить строку

			$coupon->for_first_buy = $this->request->post('for_first_buy', 'boolean');

Новый флаг "Только для одного заказа"

Отображение нового флага в форме редактирования купона

В файле /simpla/design/html/coupon.tpl после строк

				<li>
					<label class=property for="single"></label>
					<input type="checkbox" name="single" id="single" value="1" {if $coupon->single==1}checked{/if}> <label for="single">одноразовый</label>					
				</li>

добавить строки

				<li>
					<label class="property" for="for_first_buy"></label>
					<input type="checkbox" name="for_first_buy" id="for_first_buy" value="1" {if $coupon->for_first_buy==1}checked{/if}> <label for="for_first_buy">только на первый заказ</label>
				</li>

Отображение нового флага в списке купонов

В файле /simpla/design/html/coupons.tpl после строк

	 				<div class="detail">
	 				Одноразовый
	 				</div>

добавить строки

					{if $coupon->for_first_buy}
	 				<div class="detail">
	 				Только на первый заказ
	 				</div>
	 				{/if}

Благодарности и ссылки

simpla-one-time-coupon's People

Contributors

xolegator avatar

Stargazers

 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.