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

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


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

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

Итак начнем:

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

						}
					}
				}
			}

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

 

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

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

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% и сделать подряд два возвращения прежних цен - о таком, видимо, лучше и не заикаться... 

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

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

На версии 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

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

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

 

Пакетное изменение цен
http://simpla-tuning.com/products/paketnoe-izmenenie-tsen
 

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

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

 

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

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

 

 

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

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

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

 

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

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

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

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

Я так меняю

 

 

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

 

 

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

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

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

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

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

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

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

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

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

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