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

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

колхоз конечно, но работает

{get_new_products var=count_products}{counter start=-1 skip=1 print=false}{foreach $count_products as $c}	{if $c->brand_id == $b->id}		{counter print=false}	{/if}{/foreach}					({counter})

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

Работает, только у меня переносит цифры в следующую строку если не помещается, короче как зафиксировать, что бы цифра всегда находилась рядом с брэндом?

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

Еще вопрос, в фильтре по брендам в списке товаров, возле "все бренды" количество не отображается, как сделать что бы выводилось общее количество?

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

тут одна проблемка всплывает, если количества товара больше 98 он стопорится и не показывает в брендах правильное кол-во а еще больше так вообще 0 товаров показывает и во всех категориях, в чем может быть причина?

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

Меня просто бесят многомудрые умники, которые ВЕЩАЮТ всем извсестные вещи, а по теме - полный ноль...

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

Это у него образ жизни такой человек-троль...
Он действительно что то слышал что нужно делать не так , но вот как это делать, он сказать не может. (Слышыл звон да не знаю где он)

А на самом деле вся simpla написана на вот таких быдлокодах, где вместо того что бы сделать правильную выборку из базы, используются непонятные конструкции (вложенные циклы, рекурсии и т.д), или вместо одного запроса делается 4.

Теперь по теме, для того что бы отображались количества товаров для определенных брендов, нужно просто правильно составить sql запрос, что бы количества продуктов в брендах считалось MySQL, тем более что он и так их выбирает.

Вот измененыйя метод класса Brands, находится он в файле api/brands.php
/*
*
* Функция возвращает массив брендов, удовлетворяющих фильтру
* @param $filter
*
*/
public function get_brands($filter = array())
{
	$brands = array();
	$category_id_filter = '';
	if(!empty($filter['category_id']))
		$category_id_filter = $this->db->placehold('LEFT JOIN __products_categories pc 
                                                       ON p.id = pc.product_id 
                                                       WHERE pc.category_id in(?@)', 
                                                       (array)$filter['category_id']);
       // Выбираем все бренды
	$query = "SELECT COUNT(p.id) AS count, b.id, b.name, b.url, b.meta_title, b.meta_keywords, 
                             b.meta_description, b.description, b.image
			  FROM __brands AS b 
                 LEFT JOIN __products AS p 
                 ON p.brand_id = b.id 
                 $category_id_filter 
                 GROUP BY b.id, p.brand_id
                 ORDER BY b.name";
	$this->db->query($query);
	return $this->db->results();
}


Т.е нужно заменить код родного метода на тот что написал я, и после в том месте, где вам нужно отобразить количество товаров для бренда, необходимо обратититься к свойству count.

Для примера приведу вывод в файле design/default/html/products.tpl

{* Фильтр по брендам *}{if $category->brands}<div id="brands">	<a href="catalog/{$category->url}" {if !$brand->id}class="selected"{/if}>Все бренды</a>	{foreach name=brands item=b from=$category->brands}		{if $b->image}		<a data-brand="{$b->id}" href="catalog/{$category->url}/{$b->url}"><img src="{$config->brands_images_dir}{$b->image}" alt="{$b->name|escape}"></a>		{else}		<a data-brand="{$b->id}" href="catalog/{$category->url}/{$b->url}" {if $b->id == $brand->id}class="selected"{/if}>{$b->name|escape}</a>		{/if}                ({$b->count})	{/foreach}</div>{/if}

Т.е {$b->count} выводит выводит количество товаров которые относятся к данному бренду.

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

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

skype: alpex-s1
icq: 687928520
email: alpex-s@rambler.ru
Ссылка на сообщение
Поделиться на другие сайты

Благодарю AlpeX, все работает как часы! =) Подскажите а как задать стиль для вывода кол. товара? А то слишком большой отступ получается от бренда и хотелось бы изменить цвет.

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

может вообще кол-во ajax считать, так тормозов не будет. Т.е. просто выдавать статику вместо того чтобы каждый раз при обновлении страницы не получать тормоза

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

kors вы несете откровенный бред...
Посмотрите на родной метод и на этот, они отличаются только заменой оператора distinct на group при выборе записей из mysql, торомзов из-за этого быть не может, а даже наоборот данный метод будет работать быстрее, чем родной т.к в нем используется на одно обращение к методу placeholder меньше.
Вообщем читайте книги по базам данных...

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

вот код родного метода

public function get_brands($filter = array())
{
	$brands = array();
	$category_id_filter = '';
	if(!empty($filter['category_id']))
		$category_id_filter = $this->db->placehold('LEFT JOIN __products p 
		ON p.brand_id=b.id 
		LEFT JOIN __products_categories pc 
		ON p.id = pc.product_id 
		WHERE pc.category_id in(?@)'
		,(array)$filter['category_id']);

	// Выбираем все бренды
	$query = $this->db->placehold("SELECT DISTINCT b.id, b.name, b.url, b.meta_title, 
			b.meta_keywords, b.meta_description, b.description, b.image
			FROM __brands b 
			$category_id_filter 
			ORDER BY b.name");
	$this->db->query($query);

	return $this->db->results();
}


и код моего метода

public function get_brands($filter = array())	{		$brands = array();		$category_id_filter = '';		if(!empty($filter['category_id']))			$category_id_filter = $this->db->placehold('LEFT JOIN __products_categories AS pc                                                         ON p.id = pc.product_id                                                         WHERE pc.category_id in(?@)',                                                         (array)$filter['category_id']);        // Выбираем все бренды		$query = "SELECT COUNT(p.id) AS count, b.id, b.name, b.url, b.meta_title, b.meta_keywords,                               b.meta_description, b.description, b.image				  FROM __brands AS b                   LEFT JOIN __products AS p                   ON p.brand_id = b.id                   $category_id_filter                   GROUP BY b.id, p.brand_id                  ORDER BY b.name";		$this->db->query($query);		return $this->db->results();	}

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

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

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

delprofile идите читайте книги вместе с kors
Перед этим был оператор distinct, который каждую выбранную строку сравнивал между собой, а сейчас стоит group, который считает их.

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

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

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

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

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

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

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

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

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

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