Перейти к содержанию
Официальный форум поддержки Simpla

Купон для отдельной категории (категорий)


Рекомендуемые сообщения

Жду критики и исправлений (если нужно) :)

Тестировалось на версии 2.3.5

post-1516-0-84324000-1406489148_thumb.png

 

1. В базе данных в таблице s_coupons добавить поле category_id  int(11).
2. Добавить таблицу в базу данных с именем s_categories_coupons.
3. В новую таблицу добавить два поля category_id и coupon_id  int(11).
Заменить файлы:
api/Cart.php
api/Coupons.php
simpla/CouponAdmin.php
simpla/CouponsAdmin.php
simpla/design/html/coupon.tpl

При желании в файле simpla/design/html/cart.tpl в названии товара после

{$purchase->variant->name|escape}
 

можно вставить код:      

{foreach $cart->discount_text as $key=>$cdt}
    {if $purchase->product->id == $key}
        <br><h3>Скидка по купону −{$cdt} {$currency->sign}</h3>
    {/if}
{/foreach}
 

Тогда в корзине будет выводиться скидка по каждой позиции.      

post-1516-0-63062100-1406489014_thumb.png

Архив с файлами Coupon_in_Categories.rar

Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

Можете предоставить правки файлов:

api/Cart.php
api/Coupons.php
simpla/CouponAdmin.php
simpla/CouponsAdmin.php
simpla/design/html/coupon.tpl

 

от версии файлы могут отличаться + кто-то мог делать правки до Вас в этих файлах (как я допустим)

Заранее спасибо!

Ссылка на сообщение
Поделиться на другие сайты

Ой. Сейчас уже и не вспомнить в подробностях :(

Можно конечно в totla commander сравнить файлы и выкусить нужное, но это для понимающего человека будет не сложно.

Попробую сделать, но возможны неточности.

Ссылка на сообщение
Поделиться на другие сайты

api/Cart.php

Примерно 31-я строка.

После

		$cart->discount = 0;
		$cart->coupon_discount = 0;

Добавить

		$cart->total_price_coupon = 0;
		$cart->discount_text = array();

Там где // Скидка по купону

После

					$cart->coupon = $this->coupons->get_coupon($_SESSION['coupon_code']);
					if($cart->coupon && $cart->coupon->valid && $cart->total_price>=$cart->coupon->min_order_price)
					{

Добавить

						foreach($items as $variant_id=>$item)
						{	
							$purchase = null;
							$skidka = 0;
							$purchase = new stdClass();
							$purchase->product = $products[$item->variant->product_id];
							$product_id = $purchase->product->id;
							$coupon_id = $cart->coupon->id;						
							$this->db->query("SELECT DISTINCT count(*) cnt FROM s_categories_coupons cc, s_products_categories pc WHERE cc.category_id = pc.category_id AND pc.product_id = ? AND cc.coupon_id = ?", $product_id, $coupon_id);
							$z=$this->db->result('cnt');
							if($z)
							{
							if($cart->coupon->type!='absolute')
							{
							$skidka = ($item->variant->price*$item->amount) * ($cart->coupon->value)/100;
							}
							$cart->discount_text[$product_id] = $skidka;
							$cart->total_price_coupon += $item->variant->price*$item->amount;
							}
						}

Заменить

							// Абсолютная скидка не более суммы заказа
							$cart->coupon_discount = $cart->total_price>$cart->coupon->value?$cart->coupon->value:$cart->total_price;
							$cart->total_price = max(0, $cart->total_price-$cart->coupon->value);
						}
						else
						{
							$cart->coupon_discount = $cart->total_price * ($cart->coupon->value)/100;
							$cart->total_price = $cart->total_price-$cart->coupon_discount;
						}

 

на

							// Абсолютная скидка не более суммы заказа
							$cart->coupon_discount = $cart->total_price_coupon>$cart->coupon->value?$cart->coupon->value:$cart->total_price_coupon;
							$cart->total_price_coupon = max(0, $cart->total_price_coupon-$cart->coupon->value);
						}
						else
						{
							$cart->coupon_discount = $cart->total_price_coupon * ($cart->coupon->value)/100;
							//$cart->total_price_coupon = $cart->total_price_coupon-$cart->coupon_discount;
						}

Перед

		return $cart;

Вставить

		$cart->total_price = $cart->total_price - $cart->coupon_discount;			

Продолжение следует...

Ссылка на сообщение
Поделиться на другие сайты

Что если товар из разных категорий?

Как будет работать?

Скидку рассчитывает только на товар, категория которого указана в купоне. Другой товар пойдет без скидки.
Ссылка на сообщение
Поделиться на другие сайты

....api/Coupons.php

В фунциях  public function get_coupon($id) и public function get_coupons($filter = array()) в Селектах добавить  c.category_id

В самый конец добавить функции

    public function delete_coupon_categories($id)
    {
        $id = intval($id);
        $query = $this->db->placehold("DELETE FROM __categories_coupons WHERE coupon_id=?", $id);
        $this->db->query($query);
    }    

	public function get_coupon_categories($id)
	{
		$query = $this->db->placehold("SELECT cf.category_id as category_id FROM __categories_coupons cf
										WHERE cf.coupon_id = ?", $id);
		$this->db->query($query);
		return $this->db->results('category_id');	
	}	
	public function add_coupon_category($id, $category_id)
	{
		$query = $this->db->placehold("INSERT IGNORE INTO __categories_coupons SET coupon_id=?, category_id=?", $id, $category_id);
		$this->db->query($query);
	}
			
	public function update_coupon_categories($id, $categories)
	{
		$id = intval($id);
		$query = $this->db->placehold("DELETE FROM __categories_coupons WHERE coupon_id=?", $id);
		$this->db->query($query);
		
		
		if(is_array($categories))
		{
			$values = array();
			foreach($categories as $category)
				$values[] = "($id , ".intval($category).")";
	
			$query = $this->db->placehold("INSERT INTO __categories_coupons (coupon_id, category_id) VALUES ".implode(', ', $values));
			$this->db->query($query);


	        }	
}


Продолжение следует...

Ссылка на сообщение
Поделиться на другие сайты

...simpla/CouponAdmin.php

После

			$coupon->single = $this->request->post('single', 'float');

Вставить

			$coupon_categories = $this->request->post('coupon_categories');

После

				$this->design->assign('message_error', 'code_exists');

Вставить

				$this->design->assign('message_error', 'code_group');

После

  	    		else
  	    		{
  	    			$this->coupons->update_coupon($coupon->id, $coupon);
  	    			$coupon = $this->coupons->get_coupon($coupon->id);
					$this->design->assign('message_success', 'updated');
  	    		}	

Вставить

				$this->coupons->update_coupon_categories($coupon->id, $coupon_categories);

Заменить

		else
		{
			$coupon->id = $this->request->get('id', 'integer');
			$coupon = $this->coupons->get_coupon($coupon->id);
		}

//		if(empty($coupon->id))
//			$coupon->expire = date($this->settings->date_format, time());
 		




		$this->design->assign('coupon', $coupon);

 	  	return $this->design->fetch('coupon.tpl');

На

		else
		{
			$coupon->id = $this->request->get('id', 'integer');
			$coupon = $this->coupons->get_coupon($coupon->id);
		}
		$coupon_categories = array();	
		if($coupon)
		{	
			$coupon_categories = $this->coupons->get_coupon_categories($coupon->id);
		}
		
		$categories = $this->categories->get_categories_tree();
		$this->design->assign('categories', $categories);		
		$this->design->assign('coupon', $coupon);
		$this->design->assign('coupon_categories', $coupon_categories);
 	  	return $this->design->fetch('coupon.tpl');

Продолжение следует....

Ссылка на сообщение
Поделиться на другие сайты

....simpla/CouponsAdmin.php

Заменить

				    foreach($ids as $id)
						$this->coupons->delete_coupon($id);    
			        break;

На

				    foreach($ids as $id)
			    	{
			    		// текущие категории
			    		$cats = $this->coupons->get_coupon_categories($id);
			    		
			    		// В каких категориях оставлять
			    		$diff = array_diff($cats, (array)$current_cat);
			    		if(!empty($current_cat) && !empty($diff))
			    		{
			    			$this->coupons->update_coupon_categories($id, $diff);
			    		}
			    		else
						{						
						$this->coupons->delete_coupon($id);
						}
					}	
			        break;

После

	 	$this->design->assign('current_page', $filter['page']);

Вставить

		$categories = $this->categories->get_categories_tree();
		$category = null;
		
		$filter = array();
		$category_id = $this->request->get('category_id', 'integer');
		if($category_id)
		{
			$category = $this->categories->get_category($category_id);
			$filter['category_id'] = $category->id;
		}		

После

		$coupons = $this->coupons->get_coupons($filter);

Вставить

		$this->design->assign('categories', $categories);
		$this->design->assign('category', $category);				

Продолжение следует....

Ссылка на сообщение
Поделиться на другие сайты

<p>....<span style="color:rgb(40,40,40);font-family:helvetica, arial, sans-serif;">simpla/design/html/coupon.tpl</span></p>

<p><span style="color:rgb(40,40,40);font-family:helvetica, arial, sans-serif;">Добавить скрипт</span></p>

<pre class="_prettyXprint">

<script>

$(function() {

$query = $this->db->placehold('select * from __categories');

$this->db->query($query);

$categories = array();

foreach($this->db->results() as $categories);

echo $this->db->query($query);

});

</script>

 

</pre>

<p>Преред</p>

<pre class="_prettyXprint">

<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>

 

</pre>

<p>Вставить</p>

<pre class="_prettyXprint">

<li>

<h2>Использовать в категориях</h2>

<select class=multiple_categories multiple name="coupon_categories[]">

{function name=category_select selected_id=$product_category level=0}

{foreach from=$categories item=category}

<option value='{$category->id}' {if in_array($category->id, $coupon_categories)}selected{/if} category_name='{$category->single_name}'>{section name=sp loop=$level}&nbsp;&nbsp;&nbsp;&nbsp;{/section}{$category->name}</option>

{category_select categories=$category->subcategories selected_id=$selected_id level=$level+1}

{/foreach}

{/function}

{category_select categories=$categories}

</select>

</li>

 

</pre>

<p>Вроде как всё.</p>

<p>Изменения относительно файлов версии 2.3.6. В ранних версиях исходные коды могут отличаться. Ищите аналогичные участки кода.</p>

Ссылка на сообщение
Поделиться на другие сайты
  • 2 недели спустя...

Пока что отменил установку, по причине пропорционально растущих в БД запросов (в зависимости от кол-ва товаров в корзине). Подумайте, можем вместе подумать как  дергать все одним запросом = )

Кстати можем обойтись без новой таблицы s_categories_coupons, в любом случае спасибо за труды.

 

Нужно подумать, как сделать эту выборку легче! Если у Вас есть желание доработать, сообщите, может посоветую как облегчить работу доработки.

 
 

Ссылка на сообщение
Поделиться на другие сайты
  • 2 года спустя...
  • 3 года спустя...

А как вывести в шаблоне товаров? чтобы скидка выводилась (-20%) к категории которой относится скидка

Ссылка на сообщение
Поделиться на другие сайты
В 29.11.2020 в 19:18, get31 сказал:

А как вывести в шаблоне товаров? чтобы скидка выводилась (-20%) к категории которой относится скидка

Кто-то делал подобное? Можете пожалуйста подсказать? 

Изменено пользователем get31
Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...