Jump to content
  • 0

[ROZWIĄZANY] Bestsellery - kontroller - zakupione produkty powyżej 30 szt.


mmmxx

Question

Cześć!

czy ktoś tutaj z obecnych potrafi mi pomóc z kontrollerem Bestsellerów?

W chwili obecnej na sklepie wyświetla mi się ok.10 str najczęściej zakupionych towarów - chciałabym, aby produkty będące tam wyświetlały się POWYŻEJ zakupionych 30 szt. :)

Czy ktoś potrafi mi pomóc? szukałam pomocnego rozwiązania w internecie, ale niestety nic nie znalazłam :(

 

Wersja prestashop: 1.6.1.17

 

tak wygląda mój standardowy kontroller:

<?php
/*
* 2007-2015 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to [email protected] so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
*  @author PrestaShop SA <[email protected]>
*  @copyright  2007-2015 PrestaShop SA
*  @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*/

class BestSalesControllerCore extends FrontController
{
	public $php_self = 'best-sales';

	public function initContent()
	{
		if (Configuration::get('PS_DISPLAY_BEST_SELLERS'))
		{
			parent::initContent();

			$this->productSort();
			$nb_products = (int)ProductSale::getNbSales();
			$this->pagination($nb_products);

			if (!Tools::getValue('orderby'))
				$this->orderBy = 'sales';

			$products = ProductSale::getBestSales($this->context->language->id, $this->p - 1, $this->n, $this->orderBy, $this->orderWay);
			$this->addColorsToProductList($products);

			$this->context->smarty->assign(array(
				'products' => $products,
				'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'),
				'nbProducts' => $nb_products,
				'homeSize' => Image::getSize(ImageType::getFormatedName('home')),
				'comparator_max_item' => Configuration::get('PS_COMPARATOR_MAX_ITEM')
			));

			$this->setTemplate(_PS_THEME_DIR_.'best-sales.tpl');
		}
		else
			Tools::redirect('index.php?controller=404');
	}

	public function setMedia()
	{
		parent::setMedia();
		$this->addCSS(_THEME_CSS_DIR_.'product_list.css');
	}
}
Edited by mmmxx (see edit history)
Link to comment
Share on other sites

10 answers to this question

Recommended Posts

  • 0

hmm szczerze mówiąc, próbowałam to dodać, ale za każdym razem był błąd.

Tak wygląda moja metoda bez wprowadzonych zmian:

Czy mogłabym prosić o podpowiedź, w którym miejscu mogę to umieścić?

 public static function getBestSales($id_lang, $page_number = 0, $nb_products = 10, $order_by = null, $order_way = null)
    {
        $context = Context::getContext();
        if ($page_number < 0) {
            $page_number = 0;
        }
        if ($nb_products < 1) {
            $nb_products = 10;
        }
        $final_order_by = $order_by;
        $order_table = '';

        if (is_null($order_by)) {
            $order_by = 'quantity';
            $order_table = 'ps';
        }

        if ($order_by == 'date_add' || $order_by == 'date_upd') {
            $order_table = 'product_shop';
        }

        if (is_null($order_way) || $order_by == 'sales') {
            $order_way = 'DESC';
        }

        $interval = Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20;

        // no group by needed : there's only one attribute with default_on=1 for a given id_product + shop
        // same for image with cover=1
        $sql = 'SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity,
					'.(Combination::isFeatureActive()?'product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity,IFNULL(product_attribute_shop.id_product_attribute,0) id_product_attribute,':'').'
					pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`,
					pl.`meta_keywords`, pl.`meta_title`, pl.`name`, pl.`available_now`, pl.`available_later`,
					m.`name` AS manufacturer_name, p.`id_manufacturer` as id_manufacturer,
					image_shop.`id_image` id_image, il.`legend`,
					ps.`quantity` AS sales, t.`rate`, pl.`meta_keywords`, pl.`meta_title`, pl.`meta_description`,
					DATEDIFF(p.`date_add`, DATE_SUB("'.date('Y-m-d').' 00:00:00",
					INTERVAL '.(int)$interval.' DAY)) > 0 AS new'
                .' FROM `'._DB_PREFIX_.'product_sale` ps
				LEFT JOIN `'._DB_PREFIX_.'product` p ON ps.`id_product` = p.`id_product` 
				'.Shop::addSqlAssociation('product', 'p', false);
        if (Combination::isFeatureActive()) {
            $sql .= ' LEFT JOIN `'._DB_PREFIX_.'product_attribute_shop` product_attribute_shop
							ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop='.(int)$context->shop->id.')';
        }

        $sql .=    ' LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
					ON p.`id_product` = pl.`id_product`
					AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').'
				LEFT JOIN `'._DB_PREFIX_.'image_shop` image_shop
					ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop='.(int)$context->shop->id.')
				LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.')
				LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`)
				LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (product_shop.`id_tax_rules_group` = tr.`id_tax_rules_group`)
					AND tr.`id_country` = '.(int)$context->country->id.'
					AND tr.`id_state` = 0
				LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`)
				'.Product::sqlStock('p', 0);

        $sql .= '
				WHERE product_shop.`active` = 1
					AND p.`visibility` != \'none\'';
					

        if (Group::isFeatureActive()) {
            $groups = FrontController::getCurrentCustomerGroups();
            $sql .= ' AND EXISTS(SELECT 1 FROM `'._DB_PREFIX_.'category_product` cp
					JOIN `'._DB_PREFIX_.'category_group` cg ON (cp.id_category = cg.id_category AND cg.`id_group` '.(count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1').')
					WHERE cp.`id_product` = p.`id_product`)';
        }

        if ($final_order_by != 'price') {
            $sql .= '
					ORDER BY '.(!empty($order_table) ? '`'.pSQL($order_table).'`.' : '').'`'.pSQL($order_by).'` '.pSQL($order_way).'
					LIMIT '.(int)($page_number * $nb_products).', '.(int)$nb_products;
        }

        $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);

        if ($final_order_by == 'price') {
            Tools::orderbyPrice($result, $order_way);
        }
        if (!$result) {
            return false;
        }
        return Product::getProductsProperties($id_lang, $result);
    }
Link to comment
Share on other sites

  • 0

Warunek jest na pewno poprawny.

Zajrzyj w bazie do tabeli PREFIX_product_sale czy coś tam masz sprzedane.

Jeśli nie, to niepoprawnie obsługujesz zamówienia nie nadając im statusów zamykających proces zamówienia.

I jeszcze w klasie ProductSale trzeba poprawić:

    public static function getNbSales()
    {
        $sql = 'SELECT COUNT(ps.`id_product`) AS nb
                FROM `'._DB_PREFIX_.'product_sale` ps
                LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = ps.`id_product`
                '.Shop::addSqlAssociation('product', 'p', false).'
                WHERE product_shop.`active` = 1 AND ps.`quantity`  > 30';
        return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
    }

żeby poprawnie pokazywało ilość wyświetlanych produktów.

Link to comment
Share on other sites

  • 0

Mam w tej tabeli 258 wierszy. Czyli zostawiam:

 

po:

$sql .= '
                WHERE product_shop.`active` = 1
                    AND p.`visibility` != \'none\'';
                    
                    
dodaj:

    $sql .= ' AND ps.`quantity`  > 30';

 

 

i poprawić?

 

 

 

I jeszcze w klasie ProductSale trzeba poprawić:

    public static function getNbSales()
    {
        $sql = 'SELECT COUNT(ps.`id_product`) AS nb
                FROM `'
._DB_PREFIX_.'product_sale` ps
                LEFT JOIN `'
._DB_PREFIX_.'product` p ON p.`id_product` = ps.`id_product`
                '
.Shop::addSqlAssociation('product', 'p', false).'
                WHERE product_shop.`active` = 1 AND ps.`quantity`  > 30'
;
        return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
    }

żeby poprawnie pokazywało ilość wyświetlanych produktów.

Edited by mmmxx (see edit history)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...