Jump to content

Recommended Posts

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

{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})

закинуть в цикл вывода брендов
Link to post
Share on other sites

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

Link to post
Share on other sites

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

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

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

Link to post
Share on other sites
  • 3 months later...
И не для вашего троллизма :-)

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

А на самом деле вся 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
Link to post
Share on other sites

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

Link to post
Share on other sites

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

Link to post
Share on other sites

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

Link to post
Share on other sites

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

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

а теперь расскажите со ссылкой на достоверные источники, изза чего здесь могут возникнуть тормоза?
Link to post
Share on other sites

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

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