Jump to content

blockcategories menu with products as submenu


guyk

Recommended Posts

hack de quelques lignes de code, à nettoyer et configurabiliser, mais ça marche,
j'ai modifié le module blockcategories pour afficher un niveau de produit sous les categories
(c'est pour une boutique où il y a très peu de produits)

I hacked blockcategories module to display products under the categories (for veryfew products stores)


   function getTree($resultParents, $resultIds, $id_category = 1, $currentDepth = 0)
   {
...
       if (!isset($resultIds[$id_category]))
           return false;
       if (substr($id_category,0,1)=='p') //product hack
           return array('id' => $id_category, 
               'link' => $link->getProductLink(substr($id_category,1),$resultIds[$id_category]['link_rewrite'], $resultIds[$id_category]['category']),
                    'name' => $resultIds[$id_category]['name'], 'desc'=> $resultIds[$id_category]['description'],
                    'children' => null);
       return array('id' => $id_category, 'link' => $link->getCategoryLink($id_category, $resultIds[$id_category]['link_rewrite']),
                'name' => Category::hideCategoryPosition($resultIds[$id_category]['name']), 'desc'=> $resultIds[$id_category]['description'],
                'children' => $children);//normal category
   }




        $result = Db::getInstance()->ExecuteS('
       SELECT * FROM '._DB_PREFIX_.'product p 
       LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (p.id_product = pl.id_product AND id_lang = '.intval($params['cookie']->id_lang).')
       WHERE p.active = 1
       ORDER BY pl.name ASC');
       foreach ($result as $row)
       {
           //$row['name'] = Category::hideCategoryPosition($row['name']);
           $id_parent=$row['id_category_default'];
           $row['id_category']="p".$row['id_product'];
           $resultParents[$id_parent][] = $row;
           $resultIds[$row['id_category']] = $row;
       }



surprisingly nothing else to change

blockcategories.php

Link to comment
Share on other sites

  • 2 weeks later...

added other dirty hack lines to keep the menu open // ajout pour garder le menu ouvert sur le produit sélectionné

blockcategories.php line 139

        if (isset($_GET['id_category']))
           $smarty->assign('currentCategoryId', intval($_GET['id_category']));
       if (isset($_GET['id_product'])) //product hack
           $smarty->assign('currentCategoryId', 'p'.intval($_GET['id_product']));

blockcategories.php

Link to comment
Share on other sites

  • 3 months later...

super c'est exactement ce que je cherchais à faire !

par contre ne pas oublier de définir la catégorie par défaut de chaque produits
je me suis retrouvée avec la liste des produits après la liste des catégories car j'avais tout par défaut à 1 (id_category_default) = accueil

Link to comment
Share on other sites

normalement ça ne devrait pas,
ça crée un arbre cat1->cat2->cat3->produits
ah peyt etre que dans ton cas tu as des produits dans les categories intermediaires (comme cat2) ?
.....
mais comme ça se base sur category_default il faut vérifier que tes produits ont bien
la categorie par defaut = la cat ou tu veux les afficher,
et mettre les categories intermediaires avec les machins à cocher (ps_product_category)

liste des produits avec un mauvais category_default

SELECT  id_product,id_category_default,reference
FROM ps_product p 
WHERE id_category_default=1
OR id_category_default is null
OR id_category_default not in 
(select c.id_category from ps_category_product c where p.id_product=c.id_product)



ça doit etre ça le pb

Link to comment
Share on other sites

  • 4 weeks later...

Salut,

Tout d'abord merci pour ce hack car ça fait un petit moment que j'essaie de faire ça, mais mes connaissances étant assez limitées, ben c'est pas facile facile.

Bref, actuellement la structure html générée est du genre :


  • catégorie 1
  • produit 1
  • produit 2
  • catégorie 2
  • produit 1
  • produit 2


et donc les catégories et les produits sont au même niveau.

Comment faire donc pour avoir soit cette structure :

  • catégorie 1
  • produit 1
  • produit 2
  • catégorie 2
  • produit 1
  • produit 2


ou celle ci :


  • catégorie 1

    • produit 1
    • produit 2


  • catégorie 2

    • produit 1
    • produit 2




me permettant donc de distinguer mes produits de mes catégories.

Merci d'avance,

Julien
Link to comment
Share on other sites

Re,

Bon faut croire que tout le monde fait le pont :D, personne pour m'expliquer comment faire ma liste ?

Autre souci, comme Kelcible j'ai la liste des produits après celle des catégories, par contre mes produits sont bien assignés à une catégorie qui n'est pas accueil.

Des idées ?

Merci d'avance,

Julien

Link to comment
Share on other sites

Arf autant pour moi,

Non seulement j'avais mal assigné mes produits à mes catégories (j'avais juste vu la case à cocher "catalogue", et pas la liste déroulante avec écrit "catégorie par défaut", surement trop bien affiché, pas l'habitude que ce soit si évident lol), mais du coup ça me donne l'arborescence dont j'avais besoin pour mon design.

Bref je m'en vais de ce pas m'autoflageller.

Julien

Link to comment
Share on other sites

  • 1 year later...

Bonjour,

Merci pour ce script.
j'aurais juste une question d'adaptation, actuellement, la liste des produits sous les catégories est classée par ordre alphabétique, y a t'il un moyen de les classer dans l'ordre de position choisit dans l'administration ?

Merci pour vos réponses.

Link to comment
Share on other sites

  • 3 months later...

Bonjour,

Le script est bien fonctionnel, par contre, impossible de jouer sur la position des produits dans la listes ?? (ne fonctionne ni avec le classement par date, ni avec les flèches de position dans le Back Office...)

Quelqu'un pourrait m'aider sur la modification à effectuer dans le script ?

Merci

Laurent

Link to comment
Share on other sites

  • 6 months later...

Bonjour,
Ce script fonctionnait jusqu'à présent pour la version 1.4.0.17, mais je viens de passer en 1.4.2(.5) et là ça n'a plus l'air de fonctionner : aucune erreur affichée, juste le fait que plus aucun produit ne s'affiche dans ce block.

Surement que certains éléments ont changés avec cette mise à jour. Savez-vous comment le faire fonctionner à nouveau ?

Vous remerciant pour vos réponses,

Link to comment
Share on other sites

  • 2 months later...

Bonjour,

 

J'ai ajouté/supprimé les lignes de code suivantes dans blockcategories.php (Cf. PJ) :

 

- Ajout dans 'public function getTree'

 

public function getTree($resultParents, $resultIds, $maxDepth, $id_category = 1, $currentDepth = 0)
{
global $link;

$children = array();
if (isset($resultParents[$id_category]) AND sizeof($resultParents[$id_category]) AND ($maxDepth == 0 OR $currentDepth < $maxDepth))
	foreach ($resultParents[$id_category] as $subcat)
		$children[] = $this->getTree($resultParents, $resultIds, $maxDepth, $subcat['id_category'], $currentDepth + 1);
			if (!isset($resultIds[$id_category]))
				return false;
				if (substr($id_category,0,1)=='p') //product hack
					return array('id' => $id_category, 
						'link' => $link->getProductLink(substr($id_category,1),$resultIds[$id_category]['link_rewrite'], $resultIds[$id_category]['category']),
					'name' => $resultIds[$id_category]['name'], 'desc'=> $resultIds[$id_category]['description'],
					'children' => null);
					return array('id' => $id_category, 'link' => $link->getCategoryLink($id_category, $resultIds[$id_category]['link_rewrite']),
					'name' => $resultIds[$id_category]['name'], 'desc'=> $resultIds[$id_category]['description'],
					'children' => $children);
}

 

- Suppression dans 'public function hookLeftColumn'

 

foreach ($result as &$row)
{
$resultParents[$row['id_parent']][] = &$row;
$resultIds[$row['id_category']] = &$row;
}

 

- Ajout dans 'public function hookLeftColumn'

 

$result = Db::getInstance()->ExecuteS('
SELECT * FROM '._DB_PREFIX_.'product p 
LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (p.id_product = pl.id_product AND id_lang = '.intval($params['cookie']->id_lang).')
WHERE p.active = 1
ORDER BY pl.name ASC');
foreach ($result as $row)
{
$id_parent=$row['id_category_default'];
$row['id_category']="p".$row['id_product'];
$resultParents[$id_parent][] = $row;
$resultIds[$row['id_category']] = $row;
}

 

Cependant, un de mes produit s'affiche en bas (alors que j'ai bien mis la Catégorie par défaut (Cf. PJs)

 

Configuration : Prestashop 1.4.3

 

Merci d'avance pour vos retours.

blockcategories.php

post-213080-0-21712500-1312423159_thumb.png

post-213080-0-22068400-1312423169_thumb.png

Link to comment
Share on other sites

  • 1 month later...
Bonjour, J'ai ajouté/supprimé les lignes de code suivantes dans blockcategories.php (Cf. PJ) : - Ajout dans 'public function getTree'
public function getTree($resultParents, $resultIds, $maxDepth, $id_category = 1, $currentDepth = 0) { global $link; $children = array(); if (isset($resultParents[$id_category]) AND sizeof($resultParents[$id_category]) AND ($maxDepth == 0 OR $currentDepth < $maxDepth)) foreach ($resultParents[$id_category] as $subcat) $children[] = $this->getTree($resultParents, $resultIds, $maxDepth, $subcat['id_category'], $currentDepth + 1); if (!isset($resultIds[$id_category])) return false; if (substr($id_category,0,1)=='p') //product hack return array('id' => $id_category, 'link' => $link->getProductLink(substr($id_category,1),$resultIds[$id_category]['link_rewrite'], $resultIds[$id_category]['category']), 'name' => $resultIds[$id_category]['name'], 'desc'=> $resultIds[$id_category]['description'], 'children' => null); return array('id' => $id_category, 'link' => $link->getCategoryLink($id_category, $resultIds[$id_category]['link_rewrite']), 'name' => $resultIds[$id_category]['name'], 'desc'=> $resultIds[$id_category]['description'], 'children' => $children); }

- Suppression dans 'public function hookLeftColumn'

foreach ($result as &$row) { $resultParents[$row['id_parent']][] = &$row; $resultIds[$row['id_category']] = &$row; }

- Ajout dans 'public function hookLeftColumn'

$result = Db::getInstance()->ExecuteS(' SELECT * FROM '._DB_PREFIX_.'product p LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (p.id_product = pl.id_product AND id_lang = '.intval($params['cookie']->id_lang).') WHERE p.active = 1 ORDER BY pl.name ASC'); foreach ($result as $row) { $id_parent=$row['id_category_default']; $row['id_category']="p".$row['id_product']; $resultParents[$id_parent][] = $row; $resultIds[$row['id_category']] = $row; }

Cependant, un de mes produit s'affiche en bas (alors que j'ai bien mis la Catégorie par défaut (Cf. PJs) Configuration : Prestashop 1.4.3 Merci d'avance pour vos retours.

 

Effectivement, un produit s'affiche dans la liste des catégories, si quelqu'un avait la solution...

 

L'ordre des produits n'est pas pris en compte vu qu'on fait un ORDER BY pl.name ASC. Il faudrait récupérer le position de la table ps_category_product. J'ai tenté de joindre cette table et d'ordonner sur le champ position mais ça ne marche pas... Si quelqu'un arrive à le faire je suis preneur.

 

Merci

 

EDIT : je viens de voir que cette méthode ne liste les produits que si la catégorie en question est la catégorie principale.

Link to comment
Share on other sites

  • 2 weeks later...
  • 4 weeks later...
  • 2 months later...

Bonjour, Merci pour ce morceau de code, je m'en suis servis pour afficher directement la page produit quand une catégorie ne contient qu'un seul produit, ça évite de cliquer deux fois pour arriver sur la page produit.

Si ça interesse quelqu'un je lui passe mon code.

Link to comment
Share on other sites

Bonsoir

@timmxnizar

 

Bonsoir,

Moi je veux bien jeter un oeil à ce code =P

 

Dans la fonction hookLeftColumn()

la fonction getTree() tu recupère le code posté plus haut dans ce sujet

$resultParents = array();
  $resultIds = array();
  foreach ($result as &$row)
  {
	// je recupere 2 eventuels produits de la categorie courante
	$category = new Category($row['id_category'], Configuration::get('PS_LANG_DEFAULT'));
	 $product = $category->getProducts((int)($params['cookie']->id_lang), 1, 2);
        // test si la categorie contient un seul produit
	 if(is_array($product) && count($product) == 1 )
	  {
		$row['id_product'] = $product[0]['id_product'];							  
		$resultParents[$row['id_parent']][] = &$row;
		$row['id_category']="p".$row['id_product']; // hack produit
		$resultIds[$row['id_category']] = &$row;
	   }
	   else // code d'origine
		{	  
		  $resultParents[$row['id_parent']][] = &$row;
		  $resultIds[$row['id_category']] = &$row;
		 }
  }

tes questions ou tes remarques sont les bienvenues

Link to comment
Share on other sites

  • 3 weeks later...
  • 3 weeks later...

Hello,

Des nouvelles pour le problème du produit qui s'affiche dans la mauvaise catégorie?

Est-ce que quelqu'un peut mettre en ligne la dernière version du fichier blockcategories.php modifié?

Ceux qui ont réussi à corriger le problème peuvent-ils nous aider?

Link to comment
Share on other sites

  • 7 months later...
  • 1 month later...
Guest
This topic is now closed to further replies.
×
×
  • Create New...