Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Проверка - активирован ли купон


Recommended Posts

Доброго времени суток.

На странице оформления заказа, при выборе способа Самовывоз, у меня автоматом отметается скидка 10% вот таким способом:
в файле: \catalog\model\extension\shipping\pickup.php

добавлен код:

$cost = $this->cart->getSubTotal() - ($this->cart->getSubTotal() * 0.9);

перед: 

$quote_data['pickup'] = array(

полный код этого файла выглядит так:

<?php
class ModelExtensionShippingPickup extends Model {
    function getQuote($address) {
        $this->load->language('extension/shipping/pickup');

        $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "zone_to_geo_zone WHERE geo_zone_id = '" . (int)$this->config->get('pickup_geo_zone_id') . "' AND country_id = '" . (int)$address['country_id'] . "' AND (zone_id = '" . (int)$address['zone_id'] . "' OR zone_id = '0')");

        if (!$this->config->get('pickup_geo_zone_id')) {
            $status = true;
        } elseif ($query->num_rows) {
            $status = true;
        } else {
            $status = false;
        }

        $method_data = array();

        if ($status) {
            $quote_data = array();

            $cost = $this->cart->getSubTotal() - ($this->cart->getSubTotal() * 0.9);
            $quote_data['pickup'] = array(
                'code'         => 'pickup.pickup',
                'title'        => $this->language->get('text_description'),
                'cost'         => -$cost,
                'tax_class_id' => $this->config->get('total_shipping_tax_class_id'),
                'text'         => '( - ' . $this->currency->format($cost, $this->session->data['currency']) . ')',
            );

            $method_data = array(
                'code'       => 'pickup',
                'title'      => $this->language->get('text_title'),
                'quote'      => $quote_data,
                'sort_order' => $this->config->get('pickup_sort_order'),
                'error'      => false
            );
        }

        return $method_data;
    }
}

 

Вопрос: можно как то сделать проверку в этом файле, которая узнает активировал ли пользователь какой либо купон?

 

чтобы можно было запихнуть код в условие:

if (код активирован = да) {
     $cost = $this->cart->getSubTotal() - ($this->cart->getSubTotal());
} else {
     $cost = $this->cart->getSubTotal() - ($this->cart->getSubTotal() * 0.9);
}

 

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

Змінено користувачем sashamaximiv
Надіслати
Поділитися на інших сайтах


9 минут назад, sashamaximiv сказал:

Доброго времени суток.

На странице оформления заказа, при выборе способа Самовывоз, у меня автоматом отметается скидка 10% вот таким способом:
в файле: \catalog\model\extension\shipping\pickup.php

добавлен код:

перед: 

полный код этого файла выглядит так:

 

Вопрос: можно как то сделать проверку в этом файле, которая узнает активировал ли пользователь какой либо купон?

 

чтобы можно было запихнуть код в условие:


if (код активирован = да) {
     $cost = $this->cart->getSubTotal() - ($this->cart->getSubTotal());
} else {
     $cost = $this->cart->getSubTotal() - ($this->cart->getSubTotal() * 0.9);
}

 

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

 

Скорее всего нет. Поскольку если юсер не авторизировался и активировал купон то его зафиксить на сколько я понял нельзя если юсер не авторизирован.

 

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

потому в купонал обязательно ели указать Авторизация покупателя Да.

 

Я сделал небольшой тест и вот что вышло. Я в бд к таблице oc_coupon добавил поле user_id

Далее в модели catalog/model/extension/total/coupon.php перед функцией getTotal добавил метод

	public function editCouponUser($coupon_id, $user_id) {
		
		$this->db->query("UPDATE `" . DB_PREFIX . "coupon` 
		                  SET user_id = '" . (int)$user_id . "'
						  WHERE coupon_id = '" . (int)$coupon_id . "'
						 ");
	}

 

Теперь нам нужно при активации купона приписывать юсера к нему

Идем в файл catalog/controller/extension/total/coupon.php

Находим метод function coupon

Находим строки

		if (empty($this->request->post['coupon'])) {
			$json['error'] = $this->language->get('error_empty');

			unset($this->session->data['coupon']);
		} elseif ($coupon_info) {

И после них добавляем

			/////////////////////////////////////
			if ($this->customer->isLogged()) {
			    $this->model_extension_total_coupon->editCouponUser($coupon_info['coupon_id'], $this->customer->getId());
			}
			/////////////////////////////////////////

Таким образом если юсер авторизирован то мы его зафиксим к купону

 

Ну и теперь Сама проверка

$cost = $this->cart->getSubTotal() - ($this->cart->getSubTotal());

if ($this->customer->isLogged()) {
		
	$coupon_query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "coupon` 
		                              WHERE user_id = '" . (int)$this->customer->getId() . "' 
									 ");
	if ($coupon_query->num_rows) {	
            
		$cost = $this->cart->getSubTotal() - ($this->cart->getSubTotal() * 0.9);
	}
}	

Что то вроде этого. ))))  То есть мы можем осуществить проверку если у купона есть юсер, а он добавляется только если авторизирован, неавторизированого мы добавить никак не можем. Ну и собственно Если юсер авторизирован, делаем запрос в бд, если под ним есть хоть один купон то меняем сумму

 

Ну, это так, тесты на скорую руку. Во всяком случае я не увидел чтобы к купону фикселся юсер

 

 

  • +1 1
Надіслати
Поділитися на інших сайтах

4 часа назад, spectre сказал:

$this->session->data['coupon']

если есть то не считайте скидку

ДА???? А вы не в курсе что я вот активировал купон он записался в сессию, заказ оформил. Завтра на сайт пришел и что будет в сессии, ЧТО?

 Пусто! Правильно? Правильно! Тогда что вы будете проверять? Ведь по сути человек уже активировал хоть раз купон

 

Потому для того чтобы знать ВООБЩЕ ЮСЕР ХОТЬ РАЗ АКТИВИРОВАЛ купон или нет для того нужно чтоб можно было его активировать авторизированым пользователям - это раз, второе проверку тоже проводить если авторизирован, потому как у не авторизированого ничего в данных сайта нет как только он пришел на сайт.

 

Момент еще такой, если откинуть авторизацию то можно реализовать на куках

Надіслати
Поділитися на інших сайтах

21 минуту назад, Venter сказал:

ДА???? А вы не в курсе что я вот активировал купон он записался в сессию, заказ оформил. Завтра на сайт пришел и что будет в сессии, ЧТО?

 Пусто! Правильно? Правильно! Тогда что вы будете проверять? Ведь по сути человек уже активировал хоть раз купон

 

Потому для того чтобы знать ВООБЩЕ ЮСЕР ХОТЬ РАЗ АКТИВИРОВАЛ купон или нет для того нужно чтоб можно было его активировать авторизированым пользователям - это раз, второе проверку тоже проводить если авторизирован, потому как у не авторизированого ничего в данных сайта нет как только он пришел на сайт.

 

Момент еще такой, если откинуть авторизацию то можно реализовать на куках

 

мне непонятна ваша логика и где автор просил условие ЧТОБЫ ЮСЕР ХОТЬ РАЗ АКТИВИРОВАЛ КУПОН???!!!

 

он хочет просто чтоб не было скидки на самовывоз с купоном и ВСЕ!!!

  • +1 1
Надіслати
Поділитися на інших сайтах

Можно реализовать на куках, но нужно понимать что их можно чистить или зайти с другого браузера

В общем реализация на куках

В файле catalog/controller/extension/total/coupon.php после строк

		$coupon_info = $this->model_extension_total_coupon->getCoupon($coupon);

		if (empty($this->request->post['coupon'])) {
			$json['error'] = $this->language->get('error_empty');

			unset($this->session->data['coupon']);
		} elseif ($coupon_info) {
			
			$this->session->data['coupon'] = $this->request->post['coupon'];

			$this->session->data['success'] = $this->language->get('text_success');

Пишем

			/////////////////////////////////////
			// Устанавливаем куки на 360 дней
			setcookie('set_coupon', $coupon_info['coupon_id'], time() + 3600 * 24 * 360, '/');
			setcookie('set_coupon_code', $this->session->data['coupon'], time() + 3600 * 24 * 360, '/');
			/////////////////////////////////////////

Далее простая проверка


// Если юсер хоть раз активировал купон
if (isset($this->request->cookie['set_coupon']) && isset($this->request->cookie['set_coupon_code'])) {
		
	// Что то делаем	
}

 

В

$this->request->cookie['set_coupon']

ID купона

 

В

$this->request->cookie['set_coupon_code']

Название купона.

 

В общем какого то универсального средства по тому поводу нет если юсер не авторизирован.

Даже если писать в куки, то при смене браузера или компа юсер будет считаться при таком подходе новым пользователем

  • +1 1
Надіслати
Поділитися на інших сайтах

17 минут назад, spectre сказал:

 

мне непонятна ваша логика и где автор просил условие ЧТОБЫ ЮСЕР ХОТЬ РАЗ АКТИВИРОВАЛ КУПОН???!!!

 

он хочет просто чтоб не было скидки на самовывоз с купоном и ВСЕ!!!

Хорошо. Я вас тоже понял, вашу логику. Тады дождемся ТС и он сам скажет что к чему. И вам спасибо за ответы по теме

Надіслати
Поділитися на інших сайтах

Venter, спасибо за такой подробный ответ. Но мне нужно чтобы это условие действовало только при каждой сессии отдельно. Т.е. попал в корзину, ввел купон, оформил заказ и все, после этого информация о том что человек активировал купон будет удалятся. И если он опять зайдет в корзину но не введет купон, то на странице оформления заказа скидка на самовывоз будет опять -10%. А если введет код, тогда скидки на самовывоз не будет. Ну вы понимаете. Во всяком случае благодарю за такой подробный ответ.

Надіслати
Поділитися на інших сайтах


12 часов назад, spectre сказал:

он хочет просто чтоб не было скидки на самовывоз с купоном и ВСЕ!!!

 

Именно это) Спасибо и вам spectre за идею)

я так понимаю нужно сделать в контроллере самовывоза так:

Цитата

$statuscoupon = $this->session->data['coupon'];

 

а дальше обернуть в условие:
 

Цитата

if ($statuscoupon) {
                $cost = $this->cart->getSubTotal() - ($this->cart->getSubTotal());
            } else {
                $cost = $this->cart->getSubTotal() - ($this->cart->getSubTotal() * 0.9);
            }

 

Змінено користувачем sashamaximiv
Надіслати
Поділитися на інших сайтах


статус надо проверять как isset

и почему в 1 условии не написать просто 0

а во втором *0.1

это ж все запросы к бд 

  • +1 1
Надіслати
Поділитися на інших сайтах

6 часов назад, spectre сказал:

статус надо проверять как isset

и почему в 1 условии не написать просто 0

а во втором *0.1

это ж все запросы к бд 

 

да, вы правы. проще сделать так уже:

 

if (!$statuscoupon) {
                $cost = $this->cart->getSubTotal() - ($this->cart->getSubTotal() * 0.9);
            }

а можно поподробнее на счет isset?

Надіслати
Поділитися на інших сайтах


Огромное спасибо spectre. решение помогло идеально. Прикрепляю полный код если кому надо:
файл: /catalog/model/extension/shipping/pickup.php

<?php
class ModelExtensionShippingPickup extends Model {
	function getQuote($address) {
		$this->load->language('extension/shipping/pickup');

		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "zone_to_geo_zone WHERE geo_zone_id = '" . (int)$this->config->get('pickup_geo_zone_id') . "' AND country_id = '" . (int)$address['country_id'] . "' AND (zone_id = '" . (int)$address['zone_id'] . "' OR zone_id = '0')");
		
		$coupon_query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "coupon` WHERE code = '" . $this->db->escape($code) . "' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) AND status = '1'");

		if (!$this->config->get('pickup_geo_zone_id')) {
			$status = true;
		} elseif ($query->num_rows) {
			$status = true;
		} else {
			$status = false;
		}

		$method_data = array();

		if ($status) {
			$quote_data = array();
			
			$statuscoupon = $this->session->data['coupon'];
            
            if (!$statuscoupon) {
                $cost = $this->cart->getSubTotal() - ($this->cart->getSubTotal() * 0.9);
            }
            
            $quote_data['pickup'] = array(
                'code'         => 'pickup.pickup',
                'title'        => $this->language->get('text_description'),
                'cost'         => -$cost,
                'tax_class_id' => $this->config->get('total_shipping_tax_class_id'),
                'text'         => '( - ' . $this->currency->format($cost, $this->session->data['currency']) . ')',
            );

			$method_data = array(
				'code'       => 'pickup',
				'title'      => $this->language->get('text_title'),
				'quote'      => $quote_data,
				'sort_order' => $this->config->get('pickup_sort_order'),
				'error'      => false
			);
		}

		return $method_data;
	}
}

 

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.