Jump to content

Comment faire en sorte que dans l'url, l'id catégorie soit toujours présent? (En vue d'un effet selected sur menu)


Recommended Posts

Bonjour, bon je vais essayer d'être clair dans l'exposé de mon petit problème.
J'ai un menu en dhtml dans le header qui liste toutes les catégories et pour chacune les sous-catégories associées.
Si je clique sur une catégorie, l'effet "selected" du bouton de ma catégorie s'active (Donc css associé->bouton enfoncé)
Si je clique sur une sous-catégorie, idem, le bouton de la catégorie principale reste actif...

Mon problème est lorsque je clique sur un produit, par exemple depuis les produits phares, là le menu ne détecte pas l'id de la catégorie de mon produit, donc l'effet selected du menu, bien évidemment ne fonctionne pas.

Ma question arrive: mon menu, comme beaucoup d'autres, tient compte de l'url qui est appelée du style:
category.php?id_category=19

Mais quand je clique sur un produit directement:
product.php?id_product=169 ne renseigne pas l'url donc l'effet selected du menu ne fonctionne pas...

Alors aux pros, avez-vous été confronté à un problème similaire et dans l'affirmative comment l'avez-vous réglé?

Merci beaucoup

Link to comment
Share on other sites

Salut Maxhome,


Cette problématique c'est posée également sur un menu que je viens de réaliser pour un de mes templates.
Avec l'aide de Sotew et yoya, nous avons réussi à parer ce petit défaut.


Pour cela il te faut éditer le fichier blockcategories.php et ajouter ces quelques lignes :

    $currentCategoryId=0;
       if (isset($_GET['id_category']))
       {
           $cat = new Category($_GET['id_category'], null);
           $parents = $cat->getParentsCategories();
           $currentCategoryId = $parents[sizeof($parents)-1]['id_category'];
           $cookie->last_visited_category = intval($_GET['id_category']);
           //$smarty->assign('currentCategoryId', intval($_GET['id_category']));    
       }
       if (isset($_GET['id_product']))
       {            
           if (!isset($cookie->last_visited_category) OR !Product::idIsOnCategoryId(intval($_GET['id_product']), array('0' => array('id_category' => $cookie->last_visited_category))))
           {
               $product = new Product(intval($_GET['id_product']));
               if (isset($product) AND Validate::isLoadedObject($product)) 
                   $cookie->last_visited_category = intval($product->id_category_default);
           }
           $cat = new Category($cookie->last_visited_category, null);
           $parents = $cat->getParentsCategories();
           $currentCategoryId = $parents[sizeof($parents)-1]['id_category'];
           //$smarty->assign('currentCategoryId', intval($cookie->last_visited_category));
       }
       $smarty->assign('currentCategoryId', $currentCategoryId);
       $smarty->assign('blockCategTree', $blockCategTree);



en lieu et place de :

if (isset($_GET['id_category']))
       {
           $cookie->last_visited_category = intval($_GET['id_category']);
           $smarty->assign('currentCategoryId', intval($_GET['id_category']));    
       }
       if (isset($_GET['id_product']))
       {            
           if (!isset($cookie->last_visited_category) OR !Product::idIsOnCategoryId(intval($_GET['id_product']), array('0' => array('id_category' => $cookie->last_visited_category))))
           {
               $product = new Product(intval($_GET['id_product']));
               if (isset($product) AND Validate::isLoadedObject($product))
                   $cookie->last_visited_category = intval($product->id_category_default);
           }
           $smarty->assign('currentCategoryId', intval($cookie->last_visited_category));
       }    
       $smarty->assign('blockCategTree', $blockCategTree);



On a ajouté la fonction "getParentsCategories"...

Bonne continuation.

V++

Atch

Link to comment
Share on other sites

Bonjour Atch et merci de t'interesser à mon cas...
Pour moi pas bon, par contre j'ai oublié de te préciser que le menu que j'avais fait était en dur, fait à la main, c'est à dire qu'il ne reprend pas automatiquement le nom des catégories et sous-catégories dans la BDD; c'est moi qui les ai saisi... (Nom+URL du style category.php?id_category=2)...
Je tenais à préciser car tu n'as peut-être pas tous les éléments

Link to comment
Share on other sites

Pourquoi t'es tu "résigné" à faire cette modification "en dur" ? pour avoir la bonne catégorie principale ?

Dans tous les cas, ça ne change rien à l'affaire, si tu as l'id_product, tu peux obtenir sa catégorie principale avec ces 3 lignes :

$cat = new Category($cookie->last_visited_category, null);
$parents = $cat->getParentsCategories();
$currentCategoryId = $parents[sizeof($parents)-1]['id_category'];



La première récupère la dernière catégorie visitée dans les cookies (Méthode utilisée dans le menu blockcategories de base. Dans la navigation de l'utilisateur sur le site, ça correspond à la catégorie du produit, tu peux voir dans le code fourni par atch l'affectation de la variable en question)

La seconde ligne réccupère la liste de toutes les catégories parents jusqu'à arriver au home (exclus de la liste). on a donc la liste des catégories par ordre de profondeur inverse.

La troisième ligne affecte la variable $currentCategoryId à la dernière ligne de la liste précédent, soit la catégory principale du produit.


Cette variable, tu en fais ensuite ce que tu veux pour que ton TPL selectionne la catégorie correspondante, comme tu le fais avec ta liste "en dur"

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