Jump to content

Редактирование цен по категориям


Recommended Posts

Добрый день.Решил выложить изменение цен по категориям.Так как цены меняются,то есть нужда менять цены сразу у всей категории. В самой симпле такого к сожалению нету.

Итак начнем:

 
1. Добавляем в БД поле с инфой об изменении цен.
Запросы:
ALTER TABLE  `s_categories` ADD  `cupon` TEXT NOT NULL;
ALTER TABLE  `s_categories` ADD  `no_change` INT NOT NULL DEFAULT  '0';

 

2. Работаем с шаблоном админки. Файл /simpla/design/html/category.tpl
Внизу, после:
<input class="button_green button_save" type="submit" name="" value="Сохранить" />

Вставляем 


<div style="padding-top:10px; clear:both;"></div>
	<div class="block layer">
		<h2>Корректировка цен</h2>
		<ul>
				<li><label class=property>Прибавить к ценам: </label>
				
				<input name="plus" class="page_url" type="text" value="" />
				</li>
				<li>
				<label class=property>Тип: </label>
				<select name="type">
					<option value="1">рублей</option>
					<option value="2">процентов</option>
				</select>
				</li>
				<li>
				<label class=property>Вложенность: </label>
				<select name="type2">
					<option value="1">не учитывать подкатегории</option>
					<option value="2" selected="selected">учитывать подкатегории</option>
				</select>
				</li>
				
				<li>
				<label class=property>Возврат к прежним значением:<br><span style="font-size:11px;">(работает только с процентами)</span> </label>
				<select name="type3">
					<option value="1">Нет</option>
					<option value="2">Да</option>
				</select>
				</li>
				
			</ul> 
	</div>
	{$category->cupon}
	<input class="button_green button_save" type="submit" name="" value="Обновить цены" />
3. Добавляем в запрос к БД дополнительное поле. Файл /api/Catrgories.php
Строка 187 (или где-то рядом).
Ищем запрос:

$query = $this->db->placehold("SELECT c.id, c.parent_id, c.name, c.description, c.url, c.meta_title, c.meta_keywords, c.meta_description, c.image, c.visible, c.position FROM __categories c ORDER BY c.parent_id, c.position");

и добавляем в него  c.cupon,должно получиться :

 

$query = $this->db->placehold("SELECT c.id, c.parent_id, c.name, c.cupon, c.description, c.url, c.meta_title, c.meta_keywords, c.meta_description, c.image, c.visible, c.position FROM __categories c ORDER BY c.parent_id, c.position");

 

 4. Добавляем функционал пакетного изменения цен. Файл /simpla/CategoryAdmin.php
После:
if($this->request->method('post'))
{

Вставляем 

 


if((int)$_REQUEST['plus']!='' && (int)$_REQUEST['plus']!=0)
			{

				$euro=1;
				if($_REQUEST['type']==1)
				{
					$summ=(int)$_REQUEST['plus']/$euro;
					$summrub=(int)$_REQUEST['plus'];
					if($_REQUEST['type2']==1)
					{
						
						if($_REQUEST['type3']==1)
							{
								$txt="В последний раз цены менялись на ".$_REQUEST['plus']." рублей";
							}else{
								$txt="В последний раз цены были восстановлены";
							}
						$query = "UPDATE __categories set cupon='".$txt."' WHERE id='".$_REQUEST['id']."' AND no_change!=1";
						$this->db->query($query);						
						
						$query = "SELECT * FROM __variants WHERE product_id IN (SELECT product_id FROM __products_categories WHERE category_id = '".$_REQUEST['id']." AND category_id IN (SELECT id from __categories WHERE  no_change!=1)')";
						$this->db->query($query);
						$pr=$this->db->results();	
						
						for($a=0;$a<count($pr);$a++)
						{
								$query = "UPDATE __variants set price=price+'".$summrub."' WHERE id='".$pr[$a]->id."'";
								$this->db->query($query);
						}	
					}else{

						$this->categoriesp[]=$_REQUEST['id'];					
						$this->prod_in_ctg($_REQUEST['id']);
						$products=Array();
						for($a=0;$a<count($this->categoriesp);$a++)
						{
							
							
							if($_REQUEST['type3']==1)
							{
								$txt="В последний раз цены менялись на ".$_REQUEST['plus']." рублей";
							}else{
								$txt="В последний раз цены были восстановлены";
							}
							$query = "UPDATE __categories set cupon='".$txt."' WHERE id='".$this->categoriesp[$a]."' AND no_change!=1";
							$this->db->query($query);								
							
							$query = "SELECT product_id FROM __products_categories WHERE category_id = '".$this->categoriesp[$a]."' AND category_id IN (SELECT id from __categories WHERE  no_change!=1)";
							$this->db->query($query);
							$pr=$this->db->results();													
							for($b=0;$b<count($pr);$b++)
							{
								$products[]=$pr[$b]->product_id;	
							}
						}
						$query = "SELECT * FROM __variants WHERE product_id IN (".implode(",", $products).")";
						$this->db->query($query);
						$pr=$this->db->results();	
						for($a=0;$a<count($pr);$a++)
						{
							
							$query = "UPDATE __variants set price=price+'".$summrub."' WHERE id='".$pr[$a]->id."'";
							$this->db->query($query);
						}
					}		
					
							
				}else{
					

					if($_REQUEST['type2']==1)
					{
						if($_REQUEST['type3']==1)
						{
							$txt="В последний раз цены менялись на ".$_REQUEST['plus']." процентов";
						}else{
							$txt="В последний раз цены были восстановлены";
						}
						$query = "UPDATE __categories set cupon='".$txt."' WHERE id='".$_REQUEST['id']."' AND no_change!=1";
						$this->db->query($query);							
						
						
						$query = "SELECT * FROM __variants WHERE product_id IN (SELECT product_id FROM __products_categories WHERE category_id = '".$_REQUEST['id']." AND category_id IN (SELECT id from __categories WHERE  no_change!=1)')";
						$this->db->query($query);
						$pr=$this->db->results();	

						for($a=0;$a<count($pr);$a++)
						{
							$price=0;								
							
								if($_REQUEST['type3']==1)
								{
									$price=$pr[$a]->price+($pr[$a]->price*$_REQUEST['plus']/100);						
								}else{
									$price=$pr[$a]->price/(100-$_REQUEST['plus'])*100;						
								}								
								$query = "UPDATE __variants set price='".$price."' WHERE id='".$pr[$a]->id."'";
								$this->db->query($query);	
						}
					}else{

						$this->categoriesp[]=$_REQUEST['id'];					
						$this->prod_in_ctg($_REQUEST['id']);
						$products=Array();
						for($a=0;$a<count($this->categoriesp);$a++)
						{
							if($_REQUEST['type3']==1)
							{
								$txt="В последний раз цены менялись на ".$_REQUEST['plus']." процентов";
							}else{
								$txt="В последний раз цены были восстановлены";
							}
							$query = "UPDATE __categories set cupon='".$txt."' WHERE id='".$this->categoriesp[$a]."' AND no_change!=1";
							$this->db->query($query);								
														
							$query = "SELECT product_id FROM __products_categories WHERE category_id = '".$this->categoriesp[$a]."' AND category_id IN (SELECT id from __categories WHERE  no_change!=1)";
							$this->db->query($query);
							$pr=$this->db->results();													
							for($b=0;$b<count($pr);$b++)
							{
								$products[]=$pr[$b]->product_id;	
							}
						}

						
						
						$query = "SELECT * FROM __variants WHERE product_id IN (".implode(",", $products).")";
						$this->db->query($query);
						$pr=$this->db->results();	
						
						
											
						for($a=0;$a<count($pr);$a++)
						{
							$price=0;								
							
								if($_REQUEST['type3']==1)
								{
									$price=$pr[$a]->price+($pr[$a]->price*$_REQUEST['plus']/100);						
									
								}else{
									$price=$pr[$a]->price/(100-$_REQUEST['plus'])*100;						
								}
								$query = "UPDATE __variants set price='".$price."' WHERE id='".$pr[$a]->id."'";
								$this->db->query($query);

						}
					}
				}
			}

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

 

Если у кого что не получится пишите.может что и упустил.

Link to post
Share on other sites

1. Для чего служит no_change? Таблице базы поле создается, по умолчанию значение у него 0. Нигде это поле НЕ ИЗМЕНЯЕТСЯ, то есть оно всегда равно 0. В коде в нескольких местах стоит условие no_change!=1, которое всегда true.

 

2. Вручную обрабатываются передаваемые скрипту параметры, хотя в Simpla есть удобный и надежный инструмент $this->request->get(), $this->request->post().

 

3. prod_in_ctg() - видимо, Ваша собственная функция. Если так, то без ее определения у пользователей будет вылетать ошибка...

 

4. Довольно нерационально во многих местах как по сложности кода, так и по обращению к БД. Например, в блоке

						$query = "SELECT * FROM __variants WHERE product_id IN (SELECT product_id FROM __products_categories WHERE category_id = '".$_REQUEST['id']." AND category_id IN (SELECT id from __categories WHERE  no_change!=1)')";
						$this->db->query($query);
						$pr=$this->db->results();	
						
						for($a=0;$a<count($pr);$a++)
						{
								$query = "UPDATE __variants set price=price+'".$summrub."' WHERE id='".$pr[$a]->id."'";
								$this->db->query($query);
						}	

делается запрос select *, хотя используется только одно поле id. 

В этом блоке меняется значение циклом по варианту. А можно было бы легко и просто вместо всего блока написать лишь ОДИН запрос.

 

5. В нескольких местах стоит:  "менялись на ... рублей". А если магазин работает в гривнах и не знает никаких рублей?

 

6. Код очень длинный и повторяющийся. Явно можно было бы существенно сократить.

 

7. Восстановление цен - работает совсем неправильно, так как оно уменьшает текущую цену на тот же процент. А поскольку процент идет от новой цены, то результат совсем другой (см. материалы по математике средней школы).  А восстановление цен при изменении на фиксированное количество рублей вообще отсутствует. И что будет, если сначала повысить на 20%, потом повысить на 30% и сделать подряд два возвращения прежних цен - о таком, видимо, лучше и не заикаться... 

Спасибо за замечания)будем допиливать.Если что буду обновлять. :)

Link to post
Share on other sites
  • 8 months later...

На версии 2.3.6 при обновлении цен, появляется ошибка на 50 строке $this->prod_in_ctg($_REQUEST['id']);

 

Fatal error: Call to undefined method CategoryAdmin::prod_in_ctg() in Y:\home\localhost\www\hot\simpla\CategoryAdmin.php on line 50

Link to post
Share on other sites

Про это автору было сообщено ранее (п.3)  более чем полгода тому назад. Исправить что-то он не спешит...

 

Пакетное изменение цен

http://simpla-tuning.com/products/paketnoe-izmenenie-tsen

 

 

Дорогое и не совсем рабочее дополнение. Если мы меняем на 30% (или на любой другой процент) категорию "мобильные телефоны", у нас все меняется, но если хотем уменьшить получаем ошибку..

Link to post
Share on other sites

Дорогое и не совсем рабочее дополнение. Если мы меняем на 30% (или на любой другой процент) категорию "мобильные телефоны", у нас все меняется, но если хотем уменьшить получаем ошибку..

 

На демо такой ошибки не наблюдаю.

Если можете точно описать, какая ошибка и при каких действиях выходит на демо, проверю. 

Или обращайтесь в личку...

Link to post
Share on other sites
  • 4 years later...

Я так меняю

 

 

UPDATE n_variants, n_products, n_categories, n_products_categories SET n_variants.compare_price = round (n_variants.price * 0.85 ,2) WHERE n_variants.product_id = n_products.id AND n_products.id = n_products_categories.product_id AND n_products_categories.category_id IN (84, 112, 180, 195, 206, 279, 1796, 1797, 1798, 1799, 1800);

 

 

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