Jump to content

Afficher produits des sous catégories


Recommended Posts

Bonjour à tous,

 

Alors voilà, ça fait un petit moment que je cherche comment faire pour pouvoir afficher sur une même page mes différentes catégories. Je me suis occupé d'un site où, au vu du petit nombre d'articles, j'ai pu me permettre de le faire en dur :

http://prestashop.sdewitte.net/Static_Swim/fr/produits

Comme vous pouvez le voir en suivant le lien, sur cette page, chaque catégorie est affichée en colonne, avec l'ensemble de ses produits en dessous.

Je cherche à obtenir ce résultat, mais grâce au subcategories et en utilisant la boucle foreach smarty (similaire à celle de product-list qui permet d'afficher les produits). Pour se faire, je pensais utiliser 

"{foreach from=$subcategories item=subcategory}

    {if $products}

        //mon code

    {/if}

{/foreach}"

Seulement, de la manière dont je m'y prend, j'obtiens l'ensemble des produits de la catégorie parente, multiplié par le nombre de sous catégories. 

Quelqu'un pourrait-il éclairer ma lumière sur comment je suis censé m'y prendre pour obtenir les produits de chaque subcategory ?

Merci d'avance =)

Link to comment
Share on other sites

Voici un fichier à mettre dans classe/override/Category.php, ensuite il faudra effacer le fichier cache/class_index.php pour que l'override soit pris en compte.

Cette modification ne fait pas exactement ce que tu attends mais elle va permettre d'afficher dans une catégorie : les produits de la catégorie + les produits des sous catégories,

à toi de modifier pour arriver à tes fins et les ranger par catégorie en colonne, cette modif n'est pas prévue pour du multishop et contient aussi une autre modification afin de n'afficher QUE les produits en stock, en espérant t'aider un peu.

 

a++

<?php
class Category extends CategoryCore
{
	/**
	  * Return current category products
	  *
	  * @param integer $id_lang Language ID
	  * @param integer $p Page number
	  * @param integer $n Number of products per page
	  * @param boolean $get_total return the number of results instead of the results themself
	  * @param boolean $active return only active products
	  * @param boolean $random active a random filter for returned products
	  * @param int $random_number_products number of products to return if random is activated
	  * @param boolean $check_access set to false to return all products (even if customer hasn't access)
	  * @return mixed Products or number of products
	  */
	public function getProducts($id_lang, $p, $n, $order_by = null, $order_way = null, $get_total = false, $active = true, $random = false, $random_number_products = 1, $check_access = true, Context $context = null, $subCategories = true)
	{
		if (!$context)
			$context = Context::getContext();
		if ($check_access && !$this->checkAccess($context->customer->id))
			return false;
		
		
		
		$front = true;
		if (!in_array($context->controller->controller_type, array('front', 'modulefront')))
			$front = false;
			
		if ($p < 1) $p = 1;

		if (empty($order_by))
			$order_by = 'id_supplier';
		else
			/* Fix for all modules which are now using lowercase values for 'orderBy' parameter */
			$order_by = strtolower($order_by);

		if (empty($order_way))
			$order_way = 'ASC';
			
		$order_by_prefix = false;
		if ($order_by == 'id_product' || $order_by == 'date_add' || $order_by == 'date_upd')
			$order_by_prefix = 'p';
		elseif ($order_by == 'name')
			$order_by_prefix = 'pl';
		elseif ($order_by == 'manufacturer')
		{
			$order_by_prefix = 'm';
			$order_by = 'name';
		}
		elseif ($order_by == 'position')
			$order_by_prefix = 'cp';

		if ($order_by == 'price')
			$order_by = 'orderprice';
			
		if ($order_by == 'id_supplier'){
			$order_by = 'name';
			$order_by_prefix = 's';			
		}
				
		//$order_by = 'name';
		//$order_by_prefix = 's';
		

		if (!Validate::isBool($active) || !Validate::isOrderBy($order_by) || !Validate::isOrderWay($order_way))
			die (Tools::displayError());

		$id_supplier = (int)Tools::getValue('id_supplier');

		/* Return only the number of products */
		if ($get_total)
		{
			$sql = 'SELECT cp.`id_product`
					FROM `'._DB_PREFIX_.'product` p
					'.Shop::addSqlAssociation('product', 'p').'
					LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON p.`id_product` = cp.`id_product`
					' . (($subCategories) ? ('INNER JOIN '._DB_PREFIX_.'category c ON (c.id_category = cp.id_category AND c.nleft >= '.(int)$this->nleft.' AND c.nright <= '.(int)$this->nright.' AND c.active = 1)') : ('INNER JOIN '._DB_PREFIX_.'category c ON (c.id_category = cp.id_category AND c.id_category = ' . (int)$this->id . ' AND c.active = 1)')) . '
					'.Shop::addSqlAssociation('category', 'c').'
					LEFT JOIN `'._DB_PREFIX_.'stock_available` sa ON sa.id_product = p.`id_product`
					WHERE sa.quantity > 0 AND 1 '.
					($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').
					($active ? ' AND product_shop.`active` = 1' : '').
					($id_supplier ? 'AND p.id_supplier = '.(int)$id_supplier : '')
					.' GROUP BY product_shop.id_product';
				$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
				return (int)count($result);
		}

		$sql = 'SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, MAX(product_attribute_shop.id_product_attribute) id_product_attribute, product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity, pl.`description`, pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, MAX(image_shop.`id_image`) id_image, s.`name` AS "supplierName" , il.`legend`, m.`name` AS manufacturer_name, cl.`name` AS category_default, DATEDIFF(product_shop.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).'DAY)) > 0 AS new, 
					product_shop.price AS orderprice
				FROM `'._DB_PREFIX_.'category_product` cp
				LEFT JOIN `'._DB_PREFIX_.'product` p
					ON p.`id_product` = cp.`id_product`
				'.Shop::addSqlAssociation('product', 'p').'
				LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa
				ON (p.`id_product` = pa.`id_product`)
				'.Shop::addSqlAssociation('product_attribute', 'pa', false, 'product_attribute_shop.`default_on` = 1').'
				'.Product::sqlStock('p', 'product_attribute_shop', false, $context->shop).'
				LEFT JOIN `'._DB_PREFIX_.'category_lang` cl
					ON (product_shop.`id_category_default` = cl.`id_category`
					AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').')
				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` i
					ON (i.`id_product` = p.`id_product`)'.
				Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1').'
				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_.'supplier` s
					ON p.`id_supplier` = s.`id_supplier`						
					
				LEFT JOIN `'._DB_PREFIX_.'manufacturer` m
					ON m.`id_manufacturer` = p.`id_manufacturer`
					' . (($subCategories) ? ('INNER JOIN '._DB_PREFIX_.'category c ON (c.id_category = cp.id_category AND c.nleft >= '.(int)$this->nleft.' AND c.nright <= '.(int)$this->nright.' AND c.active = 1)') : ('INNER JOIN '._DB_PREFIX_.'category c ON (c.id_category = cp.id_category AND c.id_category = ' . (int)$this->id . ' AND c.active = 1)')) . '
					'.Shop::addSqlAssociation('category', 'c').'
				LEFT JOIN `'._DB_PREFIX_.'stock_available` sa ON sa.id_product = p.id_product
				WHERE sa.quantity > 0 
				AND product_shop.`id_shop` = '.(int)$context->shop->id
					.($active ? ' AND product_shop.`active` = 1' : '')
					.($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '')
					.($id_supplier ? ' AND p.id_supplier = '.(int)$id_supplier : '')
					.' GROUP BY product_shop.id_product';

		if ($random === true)
			$sql .= ' ORDER BY RAND() ';
		else
			$sql .= ' ORDER BY '.(!empty($order_by_prefix) ? $order_by_prefix.'.' : '').'`'.bqSQL($order_by).'` '.pSQL($order_way);
		
		
		if ($n > 1)
		{
			$sql .= ' LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
		}
		
		if(Tools::getValue('pp')==1)
	   	{
			//echo $sql;
		}
		 
		$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
		if ($order_by == 'orderprice')
			Tools::orderbyPrice($result, $order_way);

		if (!$result)
			return array();

		/* Modify SQL result */
		return Product::getProductsProperties($id_lang, $result);
	}
}

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