Jump to content

Lister les catégories de même niveau (frère)


Recommended Posts

Bonjour à tous,

Je cherche à lister la liste de toutes les catégories du même niveau que la catégorie en cours.
 

Je m'explique. Disons que j'ai les catégories suivantes :
cat parent 1 :

 - cat enfant 1.1

 - cat enfant 1.2

 - cat enfant 1.3

cat parent 2 :

 - cat enfant 2.1

 - cat enfant 2.2

 

Disons que je suis dans la cagégorie cat enfant 1.2, je souhaite lister tous les frères de cette catégorie (donc : cat enfant 1.1, cat enfant 1.2 et cat enfant 1.3).

Je ne trouve pas comment faire ça simplement. Quelqu'un aurait une solution ?

Link to comment
Share on other sites

Bonjour,

 

Chaque catégorie, sous-catégorie, etc. ont l'identifiant de leur catégorie parente (id_parent).

 

Il vous suffit de récupérer cet identifiant de la catégorie souhaitez et de recherche les autres catégorie ayant le même identifiant.

 

Cdt

Link to comment
Share on other sites

Je récupères bien l'id de la catégorie parent, mais je ne vois pas comment lister toutes les catégories qui en découlent. Tu pourras me donner une solution si possible ?

 

Merci d'avance :)

Link to comment
Share on other sites

Il faudrait que tu précise ton contexte de travail (contrôleur, classe, vue tpl, etc.), car des solutions il y a en plein, mais qui ne correspondront pas peut-être à ce que tu veux faire.

 

Cdt

Link to comment
Share on other sites

Je souhaites réalisé ça dans product-list.tpl. Je pensais que ce serait jouable avec un foreach en récupérant les variables smarty non ?
Pour tout ce qui est lié aux controllers etc, je ne sais pas vraiment, c'est le premier site que je fais sous prestashop :)

 

Du coup ce que je souhaiterai, c'est que quand je suis dans la liste des produits d'une sous catégorie (exemple cat enfant 1.2, pour reprendre mon premier exemple) j'ai la liste des autres catégories du même niveau (cat enfant 1.1, cat enfant 1.2 et cat enfant 1.3)

Link to comment
Share on other sites

Ok, je comprend mieux.

 

En fait, il faut que tu utilise la variable smarty $subcategories (ligne 76 environ) de category.tpl (product-list.tpl étant inclut dans category.tpl ).

 

Après je pense que tu pourra faire aisément faire ce que tu souhaite avec un foreach et un petit if.

Link to comment
Share on other sites

Excuse moi, je me suis planté.

En fait c'est normal que tu n'y arriva pas car la variable $subcatgorie contient les sous catégories de la catégorie en cour, il n'est donc pas possible  de récupérer les catégories frères et je ne crois pas qu'il y ai des variables smarty natives pour le faire.

 

Le seul moyen est de créer une nouvelle variable smarty en apportant une modification au niveau du contrôleur des catégories avec une override.

 

J'essaye de regarder cela et je reviens vers toi.

 

cdt

Link to comment
Share on other sites

Bonjour exootia,

 

Voici la solution avec un override du contrôleur.

 

L'opération consiste à "redéfinir "la fonction initContent() du contrôleur CategoryController.php en lui ajoutant une variable smarty qui te permettra d'extrait les catégories soeurs s'il y en a. La ligne à rajouter est la suivante :

 

'category_sisters' => CategoryCore::getChildren((int)$this->category->id_parent, $this->context->language->id)

 

Attention la modification ne doit pas se faire dans le contrôleur situé dans le répertoire controllers/front/ , mais dans le répertoire override/controllers/front/.

 

Pour commencer : créer un fichier CategoryController.php dans le répertoire override/controllers/front/ de ton prestashop et complète le avec le code ci-dessous et enregistre le.

<?php

class CategoryController extends CategoryControllerCore
{
	public function initContent()
	{
		parent::initContent();
		
		$this->setTemplate(_PS_THEME_DIR_.'category.tpl');
		
		if (!$this->customer_access)
			return;

		if (isset($this->context->cookie->id_compare))
			$this->context->smarty->assign('compareProducts', CompareProduct::getCompareProducts((int)$this->context->cookie->id_compare));

		$this->productSort(); // Product sort must be called before assignProductList()
		
		$this->assignScenes();
		$this->assignSubcategories();
		if (!in_array($this->category->id, array(Configuration::get('PS_HOME_CATEGORY'), Configuration::get('PS_ROOT_CATEGORY'))))
			$this->assignProductList();

		$this->context->smarty->assign(array(
			'category' => $this->category,
			'description_short' => Tools::truncateString($this->category->description),
			'products' => (isset($this->cat_products) && $this->cat_products) ? $this->cat_products : null,
			'id_category' => (int)$this->category->id,
			'id_category_parent' => (int)$this->category->id_parent,
			'return_category_name' => Tools::safeOutput($this->category->name),
			'path' => Tools::getPath($this->category->id),
			'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'),
			'categorySize' => Image::getSize(ImageType::getFormatedName('category')),
			'mediumSize' => Image::getSize(ImageType::getFormatedName('medium')),
			'thumbSceneSize' => Image::getSize(ImageType::getFormatedName('m_scene')),
			'homeSize' => Image::getSize(ImageType::getFormatedName('home')),
			'allow_oosp' => (int)Configuration::get('PS_ORDER_OUT_OF_STOCK'),
			'comparator_max_item' => (int)Configuration::get('PS_COMPARATOR_MAX_ITEM'),
			'suppliers' => Supplier::getSuppliers(),
			'category_sisters' => CategoryCore::getChildren((int)$this->category->id_parent, $this->context->language->id)
		));
	}

}

Ensuite, il faut que tu supprime le fichier class_index.php du répertoire cache/ pour que l'override soit pris en compte (il sera régénérer automatiquement par prestsahop).

 

Et il ne te reste plus qu'à générer l'affichage que tu souhait dans ton fichier product-list.tpl ou category.tpl avec un foreach, if, etc., avec la nouvelle variable smarty crée :  $category_sisters

 

Pour info, j'ai fait le test sur une version 1.5.6.2, donc il est possible que le code de la fonction initContent() varie un peu selon ta version (prend le temps de vérifier avant et de rajouter la ligne par rapport au code de ta version). 

 

@+

Link to comment
Share on other sites

  • 5 weeks later...

Bonjour exootia,

 

Voici la solution avec un override du contrôleur.

 

L'opération consiste à "redéfinir "la fonction initContent() du contrôleur CategoryController.php en lui ajoutant une variable smarty qui te permettra d'extrait les catégories soeurs s'il y en a. La ligne à rajouter est la suivante :

 

'category_sisters' => CategoryCore::getChildren((int)$this->category->id_parent, $this->context->language->id)

 

Attention la modification ne doit pas se faire dans le contrôleur situé dans le répertoire controllers/front/ , mais dans le répertoire override/controllers/front/.

 

Pour commencer : créer un fichier CategoryController.php dans le répertoire override/controllers/front/ de ton prestashop et complète le avec le code ci-dessous et enregistre le.

<?php

class CategoryController extends CategoryControllerCore
{
	public function initContent()
	{
		parent::initContent();
		
		$this->setTemplate(_PS_THEME_DIR_.'category.tpl');
		
		if (!$this->customer_access)
			return;

		if (isset($this->context->cookie->id_compare))
			$this->context->smarty->assign('compareProducts', CompareProduct::getCompareProducts((int)$this->context->cookie->id_compare));

		$this->productSort(); // Product sort must be called before assignProductList()
		
		$this->assignScenes();
		$this->assignSubcategories();
		if (!in_array($this->category->id, array(Configuration::get('PS_HOME_CATEGORY'), Configuration::get('PS_ROOT_CATEGORY'))))
			$this->assignProductList();

		$this->context->smarty->assign(array(
			'category' => $this->category,
			'description_short' => Tools::truncateString($this->category->description),
			'products' => (isset($this->cat_products) && $this->cat_products) ? $this->cat_products : null,
			'id_category' => (int)$this->category->id,
			'id_category_parent' => (int)$this->category->id_parent,
			'return_category_name' => Tools::safeOutput($this->category->name),
			'path' => Tools::getPath($this->category->id),
			'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'),
			'categorySize' => Image::getSize(ImageType::getFormatedName('category')),
			'mediumSize' => Image::getSize(ImageType::getFormatedName('medium')),
			'thumbSceneSize' => Image::getSize(ImageType::getFormatedName('m_scene')),
			'homeSize' => Image::getSize(ImageType::getFormatedName('home')),
			'allow_oosp' => (int)Configuration::get('PS_ORDER_OUT_OF_STOCK'),
			'comparator_max_item' => (int)Configuration::get('PS_COMPARATOR_MAX_ITEM'),
			'suppliers' => Supplier::getSuppliers(),
			'category_sisters' => CategoryCore::getChildren((int)$this->category->id_parent, $this->context->language->id)
		));
	}

}

Ensuite, il faut que tu supprime le fichier class_index.php du répertoire cache/ pour que l'override soit pris en compte (il sera régénérer automatiquement par prestsahop).

 

Et il ne te reste plus qu'à générer l'affichage que tu souhait dans ton fichier product-list.tpl ou category.tpl avec un foreach, if, etc., avec la nouvelle variable smarty crée :  $category_sisters

 

Pour info, j'ai fait le test sur une version 1.5.6.2, donc il est possible que le code de la fonction initContent() varie un peu selon ta version (prend le temps de vérifier avant et de rajouter la ligne par rapport au code de ta version). 

 

@+

 

Bonjour

 

Merci pour la solution proposée afin de faire apparaitre les catégories soeur.

 

Mais comment utiliser concrêtement $category_sisters avec un foreach ?

 

Merci par avance pour vos éclaircissements.

Link to comment
Share on other sites

Bonjour,

 

Oui avec un foreach dans le fichier product-list.tpl ou category.tpl.

 

La variable smarty $category_sisters est un tableau associatif contenant les informations de chacune des catégories soeurs (id_category, id_category_parent, etc.) Chaque Item qui sera extrait par le foreach permettra l'accès aux informations.

 

Un petit exemple pour affiche le(s) nom(s) des catégories soeurs (si existante(s))

<ul>
    {foreach from=$category_sisters item=category}
        <li>{$category.name}</li>
    {/foreach}
</ul>

Petite astuce pour connaitre le contenu de la variable $category_sisters, faire dans un des fichiers .tpl :

{var_dump($category_sisters)}

Cela affichera le contenu de la variable lors de l'appel de la page. Attention: ne pas conserver cette ligne dans votre tpl et penser à la supprimer dès que vous avez trouver les informations souhaitées.

 

Cdt

Link to comment
Share on other sites

  • 2 weeks later...

Bonjour,

 

Oui avec un foreach dans le fichier product-list.tpl ou category.tpl.

 

La variable smarty $category_sisters est un tableau associatif contenant les informations de chacune des catégories soeurs (id_category, id_category_parent, etc.) Chaque Item qui sera extrait par le foreach permettra l'accès aux informations.

 

Un petit exemple pour affiche le(s) nom(s) des catégories soeurs (si existante(s))

<ul>
    {foreach from=$category_sisters item=category}
        <li>{$category.name}</li>
    {/foreach}
</ul>

Petite astuce pour connaitre le contenu de la variable $category_sisters, faire dans un des fichiers .tpl :

{var_dump($category_sisters)}

Cela affichera le contenu de la variable lors de l'appel de la page. Attention: ne pas conserver cette ligne dans votre tpl et penser à la supprimer dès que vous avez trouver les informations souhaitées.

 

Cdt

 

 

Bonjour Crokeco,

 

Je te remercie pour ton retour. Ca fonctionne effectivement avec ton code. Je m'étais planté bêtement dans mon foreach...

 

Pour ceux que cela intéresse voici le code qui permet d'afficher les catégories soeurs avec les liens :

<ul>
    {foreach from=$category_sisters item=category}
    <li><a href="{$link->getCategoryLink($category.id_category, $category.link_rewrite)}" class="cat_name"><span>{$category.name}</span></a></li>
    {/foreach}
</ul>

Cdlt

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