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

Тема в разделе "WebAsyst", создана пользователем kadurinho, 25 дек 2012.

Модераторы: mdss
  1. kadurinho

    kadurinho

    Регистр.:
    21 июн 2011
    Сообщения:
    601
    Симпатии:
    242
    Задача. При просмотре категории вывести блок, в котором будут выводится 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;
    }

    2. Открываем /published/SC/html/scripts/includes/category.php
    ищем
    Код:
    $smarty->assign( 'subcategories_to_be_shown', catGetSubCategoriesSingleLayer($categoryID));
    ниже вставляем
    Код:
    $smarty->assign("top_products", prdGetTopProductsInCategory( $categoryID ));

    3. Открываем шаблон категорий /published/SC/html/scripts/templates/frontend/category.tpl.html и в нужное место вставляем
    Код:
    {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}

    4. Открываем файл стилей main.css и добавляем
    Код:
    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;
    }

    Улыбаемся и машем (с) mask :)
     
  2. mdss

    mdss ♖♘♗♕♔♗♘♖

    Moderator
    Регистр.:
    20 фев 2007
    Сообщения:
    1.126
    Симпатии:
    668
    опубликую свой способ.

    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 - количество продуктов, которые надо выводить.

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

    kadurinho

    Регистр.:
    21 июн 2011
    Сообщения:
    601
    Симпатии:
    242



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

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

    multfilm Постоялец

    Регистр.:
    18 ноя 2008
    Сообщения:
    58
    Симпатии:
    7
    подскажи пожалуйста, почему выводится вертикольно? как это исправить, чтобы 8 товаров выводились в линию по горизонтали?
     
  5. SnakeXP

    SnakeXP Создатель

    Регистр.:
    31 дек 2007
    Сообщения:
    40
    Симпатии:
    4
    Потому что это список, сделать горизонтальным можно вот такими строчками в css:



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

    Сбрось ссылку на сайт я напишу тебе код с горизонтальным выводом;)
     
  6. Mishel

    Mishel Постоялец

    Регистр.:
    11 дек 2012
    Сообщения:
    67
    Симпатии:
    13
    Как узнать нужное место ????
    в нужном месте выводим прописав следующее
    HTML:
    {hits limit=8}
     
  7. glen_s

    glen_s Писатель

    Регистр.:
    14 май 2013
    Сообщения:
    4
    Симпатии:
    1
    to mdss, то есть фактически, благодаря твоему методу можно вывести самые продаваемыетовары на главную страницу?
     
  8. mdss

    mdss ♖♘♗♕♔♗♘♖

    Moderator
    Регистр.:
    20 фев 2007
    Сообщения:
    1.126
    Симпатии:
    668
    именно так и есть. Решение рабочее и стоит уже не на одном шопе.