Перейти к содержимому


Фото
- - - - -

Как для страниц категорий вывести в title цену самого дешевого товара


  • Чтобы отвечать, сперва войдите на форум
10 ответов в теме

#1 maxonemore

maxonemore
  • Пользователь
  • 11 сообщений
  • Пользователь
  • Откуда:Москва

Опубликовано 09.04.2018 - 10:44

Всем привет!

 

Предположим у нас есть категория Майки, в которой 100 товаров, самая дешевая стоит 250 руб.

 

Как вывести в title этой категории "Цена от 250 руб."?

 

Насколько я вижу, title формируется в index.tpl, можно ли в нем получить минимальное значение цены из категории или это серьёзная доработка?

 



#2 Maksclub

Maksclub

    Помогаю с Симплой и c PHP

  • Фрилансер
  • 1 371 сообщений
  • Дизайн, Программирование, Верстка, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 09.04.2018 - 12:59

Всем привет!

 

Предположим у нас есть категория Майки, в которой 100 товаров, самая дешевая стоит 250 руб.

 

Как вывести в title этой категории "Цена от 250 руб."?

 

Насколько я вижу, title формируется в index.tpl, можно ли в нем получить минимальное значение цены из категории или это серьёзная доработка?

 

Значение $title

title формируется для разных страниц в view, то есть

  • Для категориии — /view/ProductsView.php
  • Для товара — /view/ProductView.php
  • Для главной — /view/MainView.php

в index.tpl он выводится (а не формируется), 

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

{if $module=='ProductsView' } выводи чего-то своего {/if}

 

По наименьшей цене

На страница твоаров выводится только ограниченнео число товаров (например 20 из 3000), соответственно взять наименьшее — не верно, нужно брать наименьшее от 3000 :)

Для этого лучше сделать отдельный запрос в БД

 

 

Доработка пустяковая, но нужно понимать — что и где делать в коде


Изменено: Maksclub, 09.04.2018 - 13:03


#3 question

question
  • Пользователь
  • 71 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 09.04.2018 - 16:30

Принцип такой: нужно перебрать товары с сортировкой от минимальной цены и на первом же товаре прервать цикл.

Если непонятно, напишите. 



#4 yr4ik

yr4ik
  • Фрилансер
  • 854 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:Украина Чернигов

Опубликовано 09.04.2018 - 16:50

Принцип такой: нужно перебрать товары с сортировкой от минимальной цены и на первом же товаре прервать цикл.
Если непонятно, напишите.

 
Вы хотите выбрать все товары с категории при сортировке от мин цены и взять у него цену? Тогда это самый нерациональный способ...
Уже хотя бы  limit=1 ставили

------------------------------------------------
1) в api/Products.php добавляем: 
 
/**
* Функция возвращает максимальную и минимальную цену
* @retval	object
*/
public function max_min_products($filter = array())
{		
	$category_id_filter = '';
	$brand_id_filter = '';
	$product_id_filter = '';
	$keyword_filter = '';
	$visible_filter = '';
	$is_featured_filter = '';
	$in_stock_filter = '';
	$discounted_filter = '';
	$features_filter = '';
	
	if(!empty($filter['category_id']))
		$category_id_filter = $this->db->placehold('INNER JOIN __products_categories pc ON pc.product_id = p.id AND pc.category_id in(?@)', (array)$filter['category_id']);

	if(!empty($filter['brand_id']))
		$brand_id_filter = $this->db->placehold('AND p.brand_id in(?@)', (array)$filter['brand_id']);

	if(!empty($filter['id']))
		$product_id_filter = $this->db->placehold('AND p.id in(?@)', (array)$filter['id']);
	
	if(isset($filter['keyword']))
	{
		$keywords = explode(' ', $filter['keyword']);
		foreach($keywords as $keyword)
		{
			$kw = $this->db->escape(trim($keyword));
			if($kw!=='')
				$keyword_filter .= $this->db->placehold("AND (p.name LIKE '%$kw%' OR p.meta_keywords LIKE '%$kw%' OR p.id in (SELECT product_id FROM __variants WHERE sku LIKE '%$kw%'))");
		}
	}

	if(isset($filter['featured']))
		$is_featured_filter = $this->db->placehold('AND p.featured=?', intval($filter['featured']));

	if(isset($filter['in_stock']))
		$in_stock_filter = $this->db->placehold('AND (SELECT count(*)>0 FROM __variants pv WHERE pv.product_id=p.id AND pv.price>0 AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = ?', intval($filter['in_stock']));

	if(isset($filter['discounted']))
		$discounted_filter = $this->db->placehold('AND (SELECT 1 FROM __variants pv WHERE pv.product_id=p.id AND pv.compare_price>0 LIMIT 1) = ?', intval($filter['discounted']));

	if(isset($filter['visible']))
		$visible_filter = $this->db->placehold('AND p.visible=?', intval($filter['visible']));
	
	
	if(!empty($filter['features']) && !empty($filter['features']))
		foreach($filter['features'] as $feature=>$value)
			$features_filter .= $this->db->placehold('AND p.id in (SELECT product_id FROM __options WHERE feature_id=? AND value=? ) ', $feature, $value);
	
	
	$query = "SELECT  MIN(NULLIF(pv.price, 0)) as min_price, MAX(NULLIF(pv.price, 0)) as max_price
			FROM __products AS p
			RIGHT JOIN __variants pv ON pv.product_id=p.id
			$category_id_filter
			WHERE 1
				$brand_id_filter
				$product_id_filter
				$keyword_filter
				$is_featured_filter
				$in_stock_filter
				$discounted_filter
				$visible_filter
				$features_filter ";

	$this->db->query($query);	
	return $this->db->result();
}[/code]
2) view/ProductsView.php добавляем после
[code=auto:0]if(!empty($products))
{
такой код:
$this->design->assign('product_prices', $this->products->max_min_products($filter));	
после этого в шаблоне получаем максимальную и минимальную цену
 
 
{$product_prices->min_price}
{$product_prices->max_price}

Изменено: yr4ik, 09.04.2018 - 16:53


#5 phukortsin

phukortsin
  • Пользователь
  • 269 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 09.04.2018 - 20:06

Опробовал предложенную функцию.
Во многих простых случаях дает неверные максимум и минимум.

#6 yr4ik

yr4ik
  • Фрилансер
  • 854 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:Украина Чернигов

Опубликовано 09.04.2018 - 20:44

Опробовал предложенную функцию.
Во многих простых случаях дает неверные максимум и минимум.

Kors, я рад что тебе понравилось...

#7 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 6 586 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 10.04.2018 - 00:19

Опробовал предложенную функцию.
Во многих простых случаях дает неверные максимум и минимум.

Пример таковых случаев\условий...
P.S. Он быстрее придумает свое платное решение нежели поможет кому-либо. Цыган ей богу!

#8 question

question
  • Пользователь
  • 71 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 10.04.2018 - 01:16

 
Вы хотите выбрать все товары с категории при сортировке от мин цены и взять у него цену? Тогда это самый нерациональный способ...
Уже хотя бы  limit=1 ставили

Прошу прощения. Не break, а limit = 1, вы абсолютно правы. Не знаю, почему это решение по-вашему нерационально, ведь не нужно лезть в движок, всё решается на уровне шаблона, да и на базу почти нет дополнительных нагрузок - в запросе выбор всего одного товара.

Плюс этого метода в том, что можно выбрать несколько категорий. Например, у вас несколько разделов - уличные майки, майки с принтом, однотонные майки и т.д., а вывести нужно минимальную цену из всех маек.

Или другой пример: вывести минимальную цену рекомендованных маек.

Короче, всё от задач зависит.


Изменено: question, 10.04.2018 - 01:17


#9 question

question
  • Пользователь
  • 71 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 10.04.2018 - 01:24

Попробуйте такую конструкцию в шаблоне

 

                                    {get_products var=cat_pr category_id=тут напишите номер категории featured=0 limit=1 sort=price}
                                    {foreach $cat_pr as $product}
                                            {$product->variant->price|convert}
                                    {/foreach}


Номер категории, если вы в ней находитесь, можно получить как $category->id



#10 phukortsin

phukortsin
  • Пользователь
  • 269 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 10.04.2018 - 08:55

Пример таковых случаев\условий...
P.S. Он быстрее придумает свое платное решение нежели поможет кому-либо. Цыган ей богу!

Как-то даже неудобно на такой вопрос отвечать, если он от знатока...
Пример легко получить, даже если в категории всего 2 товара. Или даже один товар с двумя вариантами...
Если этих подсказок недостаточно и надо еще подробнее, сообщайте...

#11 phukortsin

phukortsin
  • Пользователь
  • 269 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 10.04.2018 - 09:18

Прошу прощения. Не break, а limit = 1, вы абсолютно правы. Не знаю, почему это решение по-вашему нерационально, ведь не нужно лезть в движок, всё решается на уровне шаблона, да и на базу почти нет дополнительных нагрузок - в запросе выбор всего одного товара.

 

А Вы попробуйте практически выложить этот самый способ, где "всё решается на уровне шаблона". Наверняка завязнете в многочисленных ошибках и будете потом долго исправлять...






0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых