Jump to content

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


Recommended Posts

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

Тестировалось на версии 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

Link to post
Share on other sites
  • 1 month later...

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

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

 

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

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

Link to post
Share on other sites

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

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

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

Link to post
Share on other sites

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;			

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

Link to post
Share on other sites

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

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

Скидку рассчитывает только на товар, категория которого указана в купоне. Другой товар пойдет без скидки.
Link to post
Share on other sites

....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);


	        }	
}


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

Link to post
Share on other sites

...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');

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

Link to post
Share on other sites

....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);				

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

Link to post
Share on other sites

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

Link to post
Share on other sites
  • 2 weeks later...

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

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

 

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

 
 

Link to post
Share on other sites
  • 2 years later...
  • 3 years later...
В 29.11.2020 в 19:18, get31 сказал:

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

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

Edited by get31
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...