Jump to content

Afficher les produits d'une catégorie par sous-catégories


ywan

Recommended Posts

Bonjour à tous.

 

Je ne trouve plus un module qui était présent sur Addons et qui pemettait de classer dans sa page catégorie tous les produits par sous-catégorie.

 

Par exemple, dans la catégorie 1, si on avait sous-cat 1 et sous-cat 2, on avait ceci :

 

Titre Sous-cat 1

Prod 1

Prod 2

Prod 3

 

Titre sous-cat 2

Prod 1

 

Prod 2

Prod 3

 

Existe-t il un moyen de faire cela sans passer par le module, ou quelqu’un peut il me donner l'adresse du module en question ?

 

Pour info je suis passé sous Presta 1.4.9.

 

Merci à tous ;)

Link to comment
Share on other sites

Bonjour,

 

J'ai déjà réalisé plusieurs fois cette manipulation, et la meilleur des façons est d'utiliser l'override du controller Category.

 

En gros tu surcharges le controller category, en y ajoutant une liste de produits:

 

<?php
class CategoryController extends CategoryControllerCore
{
public function initContent()
{
	$category = new Category(Context::getContext()->shop->getCategory(), Configuration::get('PS_LANG_DEFAULT'));
 $nb = (int)(Configuration::get('HOME_FEATURED_NBR'));
 $products = $category->getProducts(Context::getContext()->language->id, 1, ($nb ? $nb : 10));


 $this->context->smarty->assign(array(
  'products2' => $products,
  'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'),
  'homeSize' => Image::getSize('home'),
 ));
	parent::initContent();
}
}

 

Ensuite dans le tpl de category, tu transmets à l'include du tpl de product-list ton tableau de produits, comme ceci :

{include file="$tpl_dir./product-list.tpl" products=$products2 categories=$subcategories}

 

Et enfin dans ton template product-list, tu adaptes ton affichage en bouclant sur les subcategories et boucle sur tes produits

 

J'espère être assez claire :)

 

Par contre il s'avère difficile de le gérer par un module sauf si tu créés une page différente de category.tpl sans la gestion d'override.

Edited by BoutiqueDuBio.fr (see edit history)
Link to comment
Share on other sites

dans prestashop tu as un répertoire "override\controllers" sur la racine de ton site. Je suis avec un version PS1.5 et le fichier existe déjà mais sur la 1.4.9 tu créé le fichier CategoryController.php

 

Mon code est adapté sur du prestashop 1.5, si tu as des erreurs avec la 1.4 essayes de l'adapter mais normalement cela devrais être bon

Edited by BoutiqueDuBio.fr (see edit history)
Link to comment
Share on other sites

Je viens de voir du code intéressant. Tu utilises le module HOME_FEATURED pour gérer la liste produit ?

 

Je n'ai pas activé ce module, et les codes que je viens d'envoyer dans CategoryController.php et category ne changent rien à l'affichage, et je n'ai aucune erreur.

 

Il vaut mieux activer le module home-featured ?

 

Egalement, je confirme que je n'ai pas beaucoup de compétences en dev, je ne sais pas vraiment comment toucher à product-list.tpl :unsure:

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

oui effectivement mais tu peux l'enlever

 

<?php
class CategoryController extends CategoryControllerCore
{
	public function initContent()
{
			$category = new Category(Context::getContext()->shop->getCategory(), Configuration::get('PS_LANG_DEFAULT'));
 $nb = 1000;// 1000 produits à l'affichage
 $products = $category->getProducts(Context::getContext()->language->id, 1, ($nb ? $nb : 10));

 $this->context->smarty->assign(array(
  'products2' => $products,
  'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'),
  'homeSize' => Image::getSize('home'),
 ));
			parent::initContent();
	}
}

 

Ensuite il faut retoucher en smarty et en html le contenu de ta product-list.tpl

 

Voici un exemple:

 


{assign var=nbproductsbycategory value=8}
{if isset($products)}
<!-- Products list -->
<ul id="product_list" class="clear">
{if isset($categories) && count($categories)}
	{foreach from=$categories item=category name=categories}
			{assign var=i value=0}
			{foreach from=$products item=product name=products}
				{if $product.id_category_default == $category.id_category}
					{if $i==0}<li class="titre-category clear">{$category.name|escape:'htmlall':'UTF-8'}</li>{/if}
					{if $i < $nbproductsbycategory}
						<li class="ajax_block_product curve single columns {if $smarty.foreach.products.first}first_item{elseif $smarty.foreach.products.last}last_item{/if} {if $smarty.foreach.products.index % 2}alternate_item{else}item{/if}">
							<div class="all_block">
								<div class="left_block">
								   <a href="{$product.link|escape:'htmlall':'UTF-8'}" class="product_img_link" title="{$product.name|escape:'htmlall':'UTF-8'}">
										<img src="{$link->getImageLink($product.link_rewrite, $product.id_image, 'home')}" class="no_mobile" alt="{$product.legend|escape:'htmlall':'UTF-8'}"  />
										<img src="{$link->getImageLink($product.link_rewrite, $product.id_image, 'home_mobile')}" class="mobile" alt="{$product.legend|escape:'htmlall':'UTF-8'}"  />
									</a>
									{if isset($product.new) && $product.new == 1}<span class="new">{l s='New'}</span>{/if}
									{if isset($product.on_sale) && $product.on_sale && isset($product.show_price) && $product.show_price && !$PS_CATALOG_MODE}<span class="on_sale">{l s='On sale!'}</span>
									{elseif isset($product.reduction) && $product.reduction && isset($product.show_price) && $product.show_price && !$PS_CATALOG_MODE}<span class="discount">{l s='Reduced price!'}</span>{/if}
									{if isset($product.online_only) && $product.online_only}<span class="online_only">{l s='Online only!'}</span>{/if}
								</div>
								<div class="center_block">
									<h3><a href="{$product.link|escape:'htmlall':'UTF-8'}" title="{$product.name|escape:'htmlall':'UTF-8'}">{$product.name|truncate:35:'...'|escape:'htmlall':'UTF-8'}</a></h3>
									{if (!$PS_CATALOG_MODE AND ((isset($product.show_price) && $product.show_price) || (isset($product.available_for_order) && $product.available_for_order)))}
									<div class="prices_block">
										{if isset($product.show_price) && $product.show_price && !isset($restricted_country_mode)}<span class="price" style="display: inline;">{if !$priceDisplay}{convertPrice price=$product.price}{else}{convertPrice price=$product.price_tax_exc}{/if}</span>{/if}

									</div>
									{/if}
								</div>
								<div class="right_block">
									<p class="product_desc"><a href="{$product.link|escape:'htmlall':'UTF-8'}" title="{$product.description_short|truncate:360:'...'|strip_tags:'UTF-8'|escape:'htmlall':'UTF-8'}">{$product.description_short|truncate:360:'...'|strip_tags:'UTF-8'}</a>{if isset($product.available_for_order) && $product.available_for_order && !isset($restricted_country_mode)}
									{if ($product.allow_oosp || $product.quantity > 0)}<span class="availability">{l s='Available'}</span>{elseif (isset($product.quantity_all_versions) && $product.quantity_all_versions > 0)}<span class="option">{l s='Product available with different options'}</span>{else}<span class="outofstock">{l s='Out of stock'}</span>{/if}{/if}
									</p>
									<div class="buttons_block">
										{if ($product.id_product_attribute == 0 || (isset($add_prod_display) && ($add_prod_display == 1))) && $product.available_for_order && !isset($restricted_country_mode) && $product.minimal_quantity <= 1 && $product.customizable != 2 && !$PS_CATALOG_MODE}
											{if ($product.allow_oosp || $product.quantity > 0)}
												<a class="button ajax_add_to_cart_button exclusive" rel="ajax_id_product_{$product.id_product|intval}" href="{$link->getPageLink('cart.php')}?add&id_product={$product.id_product|intval}{if isset($static_token)}&token={$static_token}{/if}" title="{l s='Add to cart'}">{l s='Add to cart'}</a>
											{else}
													<span class="exclusive">{l s='Add to cart'}</span>
											{/if}
										{/if}
										<a class="button button_view" href="{$product.link|escape:'htmlall':'UTF-8'}" title="{l s='View'}">{l s='View'}</a>
									</div>
									{if isset($comparator_max_item) && $comparator_max_item}
										<p class="compare"><input type="checkbox" class="comparator" id="comparator_item_{$product.id_product}" value="comparator_item_{$product.id_product}" {if isset($compareProducts) && in_array($product.id_product, $compareProducts)}checked{/if}/> <label for="comparator_item_{$product.id_product}">{l s='Select to compare'}</label></p>
									{/if}
								</div>
							</div>
						</li>
						{assign var=i value=$i+1}
					{/if}
				{/if}
			{/foreach}
	{/foreach}
{/if}
</ul>
<!-- /Products list -->
{/if}

 

Controle bien le code html/smarty que j'ai mis il est peut-etre pas adapter à ton projet niveau CSS

Edited by BoutiqueDuBio.fr (see edit history)
Link to comment
Share on other sites

re,

 

il doit y avoir une erreur dans la code.

 

J'ai bien mes deux fichiers. J'ai suivi scrupuleusement tes consignes.

 

Je peux naviguer dans mes rubriques et sous-rubriques, mais :

 

- dans les pages catégories, rien en change, j'ai toujours les logos des sous-catégories sans produits

- quand je clic sur une sous catégorie dans laquelle il y a des produit, la page est blanche

 

Voila pour le retour :(

Link to comment
Share on other sites

  • 1 month later...

Pour être précis j'ai fais exactement ce que tu as écrit, j'ai fais un copier coller de ton .tpl, mais dans le code source le <ul> est vide:

 

 

<ul id="product_list" class="clear"> </ul>

 

Les boucles ne chargent rien apparemment. Je suis sous PS 1.5, comme toi.

Link to comment
Share on other sites

  • 4 weeks later...

Bonjour,

 

Pour afficher les produits des sous catégories, il y a un autre moyen plus simple, sans passer par l'override du controller Category.

Il faut installer le module "Navigation à facettes" compris dans le pack de base Prestashop.

Celui-ci vient se greffer sur le hook ProductList et va ajouter tous les produits des sous-catégories dans la variable $products.

 

Après installation, les produits des sous-catégories s'affichent automatiquement après les sous-catégories dans une page catégorie.

 

Pour trier les produits par sous catégories, il faut modifier le template product-list.tpl comme cela a déjà été mentionné plus haut par Boutiquedubio.

 

J'utilise la double boucle suivante avec un compteur pour gérer l'alignement des blocs.

 

{foreach from=$subcategories item=subcat name=subcats}
 <h2>{$subcat.name}</h2>
 <ul class="product_list clear">
 {counter start=0 skip=1 assign="count"}
 {foreach from=$products key=index item=product name=products}
  {if $subcat.link_rewrite == $product.category}
  {counter}
<li class="ajax_block_product grid_products nk-{$count} {if $count is div by 3}omega{/if} clearfix">
<!-- DU CODE ICI -->
							 </li>
   {/if}
   {/foreach}
 </ul>
{/foreach}

 

Bonne journée! :)

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

  • 2 weeks later...
  • 3 weeks later...
  • 6 months later...

Bonjour à tous et merci pour toutes ces infos et autres tutos qui nous aident beaucoup.

 

Je souhaite faire exactement ce qui est décrit ici mais avec une petite difficulté supplémentaire : j'ai deux niveau de sous catégories (sous-catégories et sous-sous-catégories).

Donc afficher pour chaque page :

 

Titre Catégorie 1 :

 

 

- sous-catégorie 1

 

-- > sous-sous-cat 1

-----Produit 1

-----Produit 2

-----Produit 3

 

-- > sous-sous-cat 2

-----Produit 1

-----Produit 2

-----Produit 3

 

 

- sous-catégorie 2

 

-- > sous-sous-cat 1

-----Produit 1

-----Produit 2

-----Produit 3

-- > sous-sous-cat 2

-----Produit 1

-----Produit 2

-----Produit 3

 

Les codes Php donnés ici ont l'air de bien fonctionner pour le cas d'un seul niveau, mais pour deux niveau, ça ne marche pas, bien sûr.

Je débute en Php et je ne sais pas s'il faut boucler dans la boucle ou si c'est plus complexe que ça...

Quelqu'un a-t-il une bonne idée ?

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...