[Инфо] Вывод в категории топ товаров - самые продаваемые

HeadHunter

Shop Script
Регистрация
21 Июн 2011
Сообщения
629
Реакции
276
Задача. При просмотре категории вывести блок, в котором будут выводится 5 товаров по критерию самые продаваемые.

1. Открываем /published/SC/html/scripts/core_functions/product_functions.php
добавляем
Код:
function prdGetTopProductsInCategory( $categoryID )
{
    $categoryID = (int)$categoryID;
 
    $sql = "
        SELECT * FROM ?#PRODUCTS_TABLE
        WHERE enabled != 0 AND categoryID = ?
        ORDER BY items_sold DESC LIMIT 5
    ";
    $q = db_phquery( $sql, $categoryID ) or die(db_error());
    $Products = array();
    while( $_Product = db_fetch_assoc($q) )
    {
        LanguagesManager::ml_fillFields(PRODUCTS_TABLE, $_Product);
 
        $_Product['PriceWithUnit']      = show_price($_Product['Price']);
        $_Product['list_priceWithUnit'] = show_price($_Product['list_price']);
        // you save (value)
        $_Product['SavePrice'] = show_price($_Product['list_price']-$_Product['Price']);
        // you save (%)
        if( $_Product['list_price'] )
        {
            $_Product['SavePricePercent'] = ceil(((($_Product['list_price']-$_Product['Price'])/$_Product['list_price'])*100));
        }
 
        $Products[] = $_Product;
    }
    _setPictures($Products);
 
    return $Products;
}
[/spoil]
2. Открываем /published/SC/html/scripts/includes/category.php
[spoil]ищем
Код:
$smarty->assign( 'subcategories_to_be_shown', catGetSubCategoriesSingleLayer($categoryID));
ниже вставляем
Код:
$smarty->assign("top_products", prdGetTopProductsInCategory( $categoryID ));
[/spoil]
3. Открываем шаблон категорий /published/SC/html/scripts/templates/frontend/category.tpl.html и в нужное место вставляем
[spoil]
Код:
{if $top_products}
 
    <ul class="top-products">
    {section name=i loop=$top_products}
        <li>
 
            <div class="top-products-name">
 
                <a href='{"?productID=`$top_products[i].productID`&product_slug=`$top_products[i].slug`"|set_query_html}'>{$top_products[i].name}</a>
 
            </div>
            <div class="top-products-pict">
 
                {if $top_products[i].picture || $top_products[i].thumbnail}
 
                    <a href='{"?productID=`$top_products[i].productID`&product_slug=`$top_products[i].slug`"|set_query_html}'>
                        <img src="{$smarty.const.URL_PRODUCTS_PICTURES}/{if $top_products[i].thumbnail}{$top_products[i].thumbnail|escape:'url'}{else}{$top_products[i].picture|escape:'url'}{/if}"
                            border="0" alt="{$top_products[i].name|escape:'html'}" title="{$top_products[i].name|escape:'html'}"></a>
 
                {else}
                    &nbsp;
                {/if}
 
            </div>
            <div class="top-products-price">{if $top_products[i].Price}{$top_products[i].PriceWithUnit}{/if}</div>
 
        </li>
    {/section}
    </ul>
 
{/if}
[/spoil]
4. Открываем файл стилей main.css и добавляем
[spoil]
Код:
ul.top-products {
    margin: 0;
    padding: 0;
    list-style: none;
    width: 710px;
    margin: 0 auto;
}
ul.top-products li {
    margin: 0;
    padding: 0;
    list-style: none;
    width: 216px;
    min-height: 300px;
    _height: 300px;
    margin: 0 0 25px 5px;
    padding: 2px 5px;
    display: -moz-inline-stack;
    display: inline-block;
    *display: inline;
    vertical-align: top;
    zoom: 1;
    border: 1px solid #ccc;
}
 
ul.top-products li .top-products-name {
    margin: 0;
    padding: 0;
    text-align: center;
}
ul.top-products li .top-products-name a {
    color: #1868ac;
    font-weight: bold;
    text-decoration: none;
}
ul.top-products li .top-products-name a:hover {
    text-decoration: underline;
}
 
ul.top-products li .top-products-pict {
    margin: 0;
    padding: 0;
    min-height: 130px;
    margin-top: 5px;
    text-align: center;
}
ul.top-products li .top-products-pict img {
    max-width: 210px;
    max-height: 130px;
    vertical-align: bottom;
    border: 0;
    -ms-interpolation-mode: bicubic;
}
 
ul.top-products li .top-products-price {
    margin: 0;
    padding: 0;
    margin: 5px auto 0 auto;
    text-align: center;
}
[/spoil]
[spoil]Улыбаемся и машем (с) mask :)
 
опубликую свой способ.

1. Создаем файл function.hits.php и копируем его в папку /kernel/includes/smarty/plugins/
PHP:
<?php
function smarty_function_hits ($params, &$smarty) {
	$default_limit = 10;
	$limit = (isset ($params['limit']) && $params['limit'] > 0)? $params['limit'] : $default_limit;
	$products = db_phquery_fetch (DBRFETCH_ROW_ALL, 'SELECT `products`.*, `products`.'.LanguagesManager::sql_prepareField('name').' as `name`, `products`.'.LanguagesManager::sql_prepareField('brief_description').' as `brief_description`, `pictures`.`thumbnail` FROM `?#PRODUCTS_TABLE` `products` LEFT JOIN `?#PRODUCT_PICTURES` `pictures` USING (`productID`) WHERE `products`.`enabled` = 1 AND `products`.`categoryID` > 1 AND `pictures`.`photoID` = `products`.`default_picture` ORDER BY `products`.`items_sold` DESC LIMIT ?', $limit);
	foreach ($products as $i => $product) {
		$products[$i]['PriceWithUnit'] = show_price ($product['Price']);
	}
	if ($products) {
		$smarty->assign ('products', $products);
		$smarty->display (DIR_FTPLS.'/hits.html');
	}
}
?>
в данном случае выборка идет по ячейке items_sold, т.е. по количеству продаж продукта. Изменить можно на любую.

2. создаем файл hits.html и копируем его в папку /published/SC/html/scripts/templates/frontend/
HTML:
<div class="hits">
	<p class="hits_title">Топ продаж</p>
	<ul class="hits_list">
{foreach from=$products item=product name=hits}
		<li>
			<a href="{"?productID=`$product.productID`&product_slug=`$product.slug`"|set_query_html}" class="hits_pic">{if $product.thumbnail}<img src="{$smarty.const.URL_PRODUCTS_PICTURES}/{$product.thumbnail}" alt="{$product.name|escape:'html'}" />{else}<img src="/i/hits_pic.jpg" alt="{$product.name|escape:'html'}" />{/if}</a>
			<div class="hits_container">
				<p class="hits_name"><a href="{"?productID=`$product.productID`&product_slug=`$product.slug`"|set_query_html}">{$product.name}</a></p>
				<p class="hits_price">{$product.PriceWithUnit}</p>
				<p class="hits_more"><a href="{"?productID=`$product.productID`&product_slug=`$product.slug`"|set_query_html}">Подробнее</a></p>
			</div>
			<div class="clear"></div>
		</li>
{/foreach}
	</ul>
	<div class="clear"></div>
</div>

3. в нужном месте выводим прописав следующее
HTML:
{hits limit=8}
где число 8 - количество продуктов, которые надо выводить.

ЗЫ и не надо править кучу файлов движка, чтобы потом можно было спокойно обновляться.
 
опубликую свой способ.

1. Создаем файл function.hits.php и копируем его в папку /kernel/includes/smarty/plugins/
PHP:
<?php
function smarty_function_hits ($params, &$smarty) {
$default_limit = 10;
$limit = (isset ($params['limit']) && $params['limit'] > 0)? $params['limit'] : $default_limit;
$products = db_phquery_fetch (DBRFETCH_ROW_ALL, 'SELECT `products`.*, `products`.'.LanguagesManager::sql_prepareField('name').' as `name`, `products`.'.LanguagesManager::sql_prepareField('brief_description').' as `brief_description`, `pictures`.`thumbnail` FROM `?#PRODUCTS_TABLE` `products` LEFT JOIN `?#PRODUCT_PICTURES` `pictures` USING (`productID`) WHERE `products`.`enabled` = 1 AND `products`.`categoryID` > 1 AND `pictures`.`photoID` = `products`.`default_picture` ORDER BY `products`.`items_sold` DESC LIMIT ?', $limit);
foreach ($products as $i => $product) {
$products[$i]['PriceWithUnit'] = show_price ($product['Price']);
}
if ($products) {
$smarty->assign ('products', $products);
$smarty->display (DIR_FTPLS.'/hits.html');
}
}
?>
в данном случае выборка идет по ячейке items_sold, т.е. по количеству продаж продукта. Изменить можно на любую.

2. создаем файл hits.html и копируем его в папку /published/SC/html/scripts/templates/frontend/
HTML:
<div class="hits">
<p class="hits_title">Топ продаж</p>
<ul class="hits_list">
{foreach from=$products item=product name=hits}
<li>
<a href="{"?productID=`$product.productID`&product_slug=`$product.slug`"|set_query_html}" class="hits_pic">{if $product.thumbnail}<img src="{$smarty.const.URL_PRODUCTS_PICTURES}/{$product.thumbnail}" alt="{$product.name|escape:'html'}" />{else}<img src="/i/hits_pic.jpg" alt="{$product.name|escape:'html'}" />{/if}</a>
<div class="hits_container">
<p class="hits_name"><a href="{"?productID=`$product.productID`&product_slug=`$product.slug`"|set_query_html}">{$product.name}</a></p>
<p class="hits_price">{$product.PriceWithUnit}</p>
<p class="hits_more"><a href="{"?productID=`$product.productID`&product_slug=`$product.slug`"|set_query_html}">Подробнее</a></p>
</div>
<div class="clear"></div>
</li>
{/foreach}
</ul>
<div class="clear"></div>
</div>

3. в нужном месте выводим прописав следующее
HTML:
{hits limit=8}
где число 8 - количество продуктов, которые надо выводить.

ЗЫ и не надо править кучу файлов движка, чтобы потом можно было спокойно обновляться.


Твое решение для всех продуктов. То что выложил я, для продуктов, которые находятся в той или иной категории) Некий топ товаров в категории

P.S. обновляться уже некуда) судя по ответам представителей WebAsyst версия 308 последняя)
 

подскажи пожалуйста, почему выводится вертикольно? как это исправить, чтобы 8 товаров выводились в линию по горизонтали?
 
Потому что это список, сделать горизонтальным можно вот такими строчками в css:



HTML:
ul.hits_list{ margin: 0; padding: 0; }
ul.hits_list li { display: inline; margin-right: 4px; padding: 2px; }


Сбрось ссылку на сайт я напишу тебе код с горизонтальным выводом;)
 
Как узнать нужное место ????
в нужном месте выводим прописав следующее
HTML:
{hits limit=8}
 
to mdss, то есть фактически, благодаря твоему методу можно вывести самые продаваемыетовары на главную страницу?
 
to mdss, то есть фактически, благодаря твоему методу можно вывести самые продаваемыетовары на главную страницу?
именно так и есть. Решение рабочее и стоит уже не на одном шопе.
 
Назад
Сверху