Jump to content
jcandres

Navigation a facette et produit hors stock

Recommended Posts

Bonjour,

 

Je souhaite modifier légérement la navigation à facette pour qu'elle ne m'affiche que les produits en stock :

 

pour cela j'ai rajouté => p.quantity > 0 dans une requete SQL et cela fonctionne par contre du coup la pagination est erronée car elle annonce 26 pages au lieu de 7

 

SELECT
   p.*,
   '.($alias_where == 'p' ? '' : 'product_shop.*,' ).'
   '.$alias_where.'.id_category_default,
   pl.available_later, pl.description_short, pl.link_rewrite, pl.name,
   i.id_image,
   il.legend,
   m.name manufacturer_name,
   DATEDIFF('.$alias_where.'.`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
  FROM `'._DB_PREFIX_.'category_product` cp
  LEFT JOIN '._DB_PREFIX_.'category c ON (c.id_category = cp.id_category)
  LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product`
  '.$join.'
  LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = p.id_product)
  LEFT JOIN '._DB_PREFIX_.'image i ON (i.id_product = p.id_product AND i.cover = 1)
  LEFT JOIN '._DB_PREFIX_.'image_lang il ON (i.id_image = il.id_image AND il.id_lang = '.(int)($cookie->id_lang).')
  LEFT JOIN '._DB_PREFIX_.'manufacturer m ON (m.id_manufacturer = p.id_manufacturer)
  WHERE '.$alias_where.'.`active` = 1 AND
  '.(Configuration::get('PS_LAYERED_FULL_TREE') ? 'c.nleft >= '.(int)$parent->nleft.'
  AND c.nright <= '.(int)$parent->nright : 'c.id_category = '.(int)$id_parent).'
  AND p.`quantity` > 0 AND c.active = 1
  AND pl.id_lang = '.(int)$cookie->id_lang.'
  AND p.id_product IN ('.implode(',', $product_id_list).')'
  .' GROUP BY p.id_product ORDER BY '.Tools::getProductsOrder('by', Tools::getValue('orderby'), true).' '.Tools::getProductsOrder('way', Tools::getValue('orderway')).
  ' LIMIT '.(((int)$this->page - 1) * $n.','.$n));

 

si j'ai bien suivi il y a une requete ajax qui recharge la pagination mais comment lui donner l'info ?

 

Cordialement

ANDRES Jean Christophe

  • Like 1

Share this post


Link to post
Share on other sites

Bonjour,

 

En effet, ce n'est pas cette requête qu'il faut modifier, mais la requête plus haut (deux en fait) :

Celle dont le résultat est stocké dans $all_products_out & $all_products_in. Ces deux requêtes sont très similaires, il faut appliquer la même clause where (donc sur p.quantity) et retirer cette même clause de la requête qui alimente $this->products.

 

J'espère que cela répond à votre problème. Du coup dès que j'aurai plus de temps, je pense rajouter cette option dans la navigation à facette :)

Share this post


Link to post
Share on other sites

Bonjour,

J'ai également le meme dilemme filtrer les produits hors stock du modules a facette, j'ai vu que ca marchait sur votre site.

 

Quel est la solution ?

 

 

Merci d'avance

Share this post


Link to post
Share on other sites

Bonjour peut-être connaissez vous la réponse ?

je cherche à mettre la navigation à facette dès la page d'index est-ce possible ?

 

cordialement

Share this post


Link to post
Share on other sites

Bonjour redtango, cela est tout à fait possible, mais il faut toucher au code.

 

Il faut dans le module (fichier modules/blocklayered/blocklayered.php) supprimmer tout ce qui est référence à la page d'accueil. C'est à dire les lignes de codes suivantes :

 

(l2241 environ, l2336 et l2597)
if ($id_parent == 1)
  return false;
(l1212)
if (Tools::getValue('id_category', Tools::getValue('id_category_layered', 1)) == 1)
  return;

 

Je n'ai pas testé. Il est possible qui faille faire quelques autres modifications.

 

Cordialement,

Share this post


Link to post
Share on other sites

Bonjour,

 

Maxenxe : Est-ce que ça marche chez toi ?

 

Quelqu'un aurait testé ce que Maxence nous propose ? J'ai peur de faire une boulette et ça me parait pas tout à fait logique.

 

Merci d'avance

Share this post


Link to post
Share on other sites

Bonsoir , est que quelqu'un pourrait m'orienter pour mettre BlockLayered en page d accueil?

 

apres avoir cherche dans blocklayered.php je trouve pas ....

 

merci et bonne année 2013 a tous

Share this post


Link to post
Share on other sites

Bonjour,

 

Maxenxe : Est-ce que ça marche chez toi ?

 

Quelqu'un aurait testé ce que Maxence nous propose ? J'ai peur de faire une boulette et ça me parait pas tout à fait logique.

 

Merci d'avance

 

Bonjour, Purpelman, Spycasso, & Maxence,

 

j'ai également le même problème pour afficher la navigation à facette en page d'accueil sur la version 1.5.2, mais cela est -il vraiment possible? ou faut t-il impérativement passer par un module de recherche avancée ?

 

 

Merci !

 

Flogpro

Edited by flogpro (see edit history)

Share this post


Link to post
Share on other sites

Fichier : blocklayered.php

 

Ligne 2386 :

 

$query_filters_where .= ' AND p.id_product IN (SELECT pa.`id_product`

FROM `'._DB_PREFIX_.'product_attribute_combination` pac

LEFT JOIN `'._DB_PREFIX_.'stock` s ON (s.id_product_attribute = pac.id_product_attribute)

LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa

ON (pa.`id_product_attribute` = pac.`id_product_attribute` and s.`physical_quantity` > 0)';

if (version_compare(_PS_VERSION_,'1.5','>'))

$query_filters_where .= Shop::addSqlAssociation('product_attribute', 'pa');

$query_filters_where .= 'WHERE '.implode(' OR ', $sub_query).') ';

Share this post


Link to post
Share on other sites

Bonjour,

 

Je souhaite modifier légérement la navigation à facette pour qu'elle ne m'affiche que les produits en stock :

 

pour cela j'ai rajouté => p.quantity > 0 dans une requete SQL et cela fonctionne par contre du coup la pagination est erronée car elle annonce 26 pages au lieu de 7

 

SELECT
    p.*,
    '.($alias_where == 'p' ? '' : 'product_shop.*,' ).'
    '.$alias_where.'.id_category_default,
    pl.available_later, pl.description_short, pl.link_rewrite, pl.name,
    i.id_image,
    il.legend,
    m.name manufacturer_name,
    DATEDIFF('.$alias_where.'.`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
   FROM `'._DB_PREFIX_.'category_product` cp
   LEFT JOIN '._DB_PREFIX_.'category c ON (c.id_category = cp.id_category)
   LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product`
   '.$join.'
   LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = p.id_product)
   LEFT JOIN '._DB_PREFIX_.'image i ON (i.id_product = p.id_product AND i.cover = 1)
   LEFT JOIN '._DB_PREFIX_.'image_lang il ON (i.id_image = il.id_image AND il.id_lang = '.(int)($cookie->id_lang).')
   LEFT JOIN '._DB_PREFIX_.'manufacturer m ON (m.id_manufacturer = p.id_manufacturer)
   WHERE '.$alias_where.'.`active` = 1 AND
   '.(Configuration::get('PS_LAYERED_FULL_TREE') ? 'c.nleft >= '.(int)$parent->nleft.'
   AND c.nright <= '.(int)$parent->nright : 'c.id_category = '.(int)$id_parent).'
   AND p.`quantity` > 0 AND c.active = 1
   AND pl.id_lang = '.(int)$cookie->id_lang.'
   AND p.id_product IN ('.implode(',', $product_id_list).')'
   .' GROUP BY p.id_product ORDER BY '.Tools::getProductsOrder('by', Tools::getValue('orderby'), true).' '.Tools::getProductsOrder('way', Tools::getValue('orderway')).
   ' LIMIT '.(((int)$this->page - 1) * $n.','.$n));
si j'ai bien suivi il y a une requete ajax qui recharge la pagination mais comment lui donner l'info ?

 

Cordialement

ANDRES Jean Christophe

 

Bonjour Andres,

 

j'aimerai faire cela aussi et essayer ta solution, pourrais tu stp m'indiquer quel est le fichier à modifier stp et si tu as pu régler ton problème de nombre de pages.

 

Merci bcp

 

Bonne soirée

Share this post


Link to post
Share on other sites

Fichier : blocklayered.php

 

Ligne 2386 :

 

$query_filters_where .= ' AND p.id_product IN (SELECT pa.`id_product`

FROM `'._DB_PREFIX_.'product_attribute_combination` pac

LEFT JOIN `'._DB_PREFIX_.'stock` s ON (s.id_product_attribute = pac.id_product_attribute)

LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa

ON (pa.`id_product_attribute` = pac.`id_product_attribute` and s.`physical_quantity` > 0)';

if (version_compare(_PS_VERSION_,'1.5','>'))

$query_filters_where .= Shop::addSqlAssociation('product_attribute', 'pa');

$query_filters_where .= 'WHERE '.implode(' OR ', $sub_query).') ';

Salut!

Avec ceci, le filtre n'indique plus aucun produit dès qu'il est activé.

Aurais tu une autre solution stp?

 

Merci bcp!

Share this post


Link to post
Share on other sites

Bonjour,

 

En effet, ce n'est pas cette requête qu'il faut modifier, mais la requête plus haut (deux en fait) :

Celle dont le résultat est stocké dans $all_products_out & $all_products_in. Ces deux requêtes sont très similaires, il faut appliquer la même clause where (donc sur p.quantity) et retirer cette même clause de la requête qui alimente $this->products.

 

J'espère que cela répond à votre problème. Du coup dès que j'aurai plus de temps, je pense rajouter cette option dans la navigation à facette :)

 

 Bonsoir je rencontre le même problème je souhaiterais filtrer les declinaisons dont le stock est épuisé,

je suis un débutant en la matière, Pourriez vous me donner exactement les modifications a effectuer s'il vous plait ?

je suis sur 1.5.6.1

Share this post


Link to post
Share on other sites

Bonjour,

 

Je souhaite modifier légérement la navigation à facette pour qu'elle ne m'affiche que les produits en stock :

 

pour cela j'ai rajouté => p.quantity > 0 dans une requete SQL et cela fonctionne par contre du coup la pagination est erronée car elle annonce 26 pages au lieu de 7

 

SELECT
    p.*,
    '.($alias_where == 'p' ? '' : 'product_shop.*,' ).'
    '.$alias_where.'.id_category_default,
    pl.available_later, pl.description_short, pl.link_rewrite, pl.name,
    i.id_image,
    il.legend,
    m.name manufacturer_name,
    DATEDIFF('.$alias_where.'.`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
   FROM `'._DB_PREFIX_.'category_product` cp
   LEFT JOIN '._DB_PREFIX_.'category c ON (c.id_category = cp.id_category)
   LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product`
   '.$join.'
   LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = p.id_product)
   LEFT JOIN '._DB_PREFIX_.'image i ON (i.id_product = p.id_product AND i.cover = 1)
   LEFT JOIN '._DB_PREFIX_.'image_lang il ON (i.id_image = il.id_image AND il.id_lang = '.(int)($cookie->id_lang).')
   LEFT JOIN '._DB_PREFIX_.'manufacturer m ON (m.id_manufacturer = p.id_manufacturer)
   WHERE '.$alias_where.'.`active` = 1 AND
   '.(Configuration::get('PS_LAYERED_FULL_TREE') ? 'c.nleft >= '.(int)$parent->nleft.'
   AND c.nright <= '.(int)$parent->nright : 'c.id_category = '.(int)$id_parent).'
   AND p.`quantity` > 0 AND c.active = 1
   AND pl.id_lang = '.(int)$cookie->id_lang.'
   AND p.id_product IN ('.implode(',', $product_id_list).')'
   .' GROUP BY p.id_product ORDER BY '.Tools::getProductsOrder('by', Tools::getValue('orderby'), true).' '.Tools::getProductsOrder('way', Tools::getValue('orderway')).
   ' LIMIT '.(((int)$this->page - 1) * $n.','.$n));
si j'ai bien suivi il y a une requete ajax qui recharge la pagination mais comment lui donner l'info ?

 

Cordialement

ANDRES Jean Christophe

 

 

Bonjour

avez vous trouver la solution pour n'afficher que les declinaisons en stock, l’erreur de pagination ne me gêne pas, pourriez vous m'indiquer exactement ou je dois faire cela : pour cela j'ai rajouté => p.quantity > 0 dans une requete SQL

et la requête sql a ajouter s'il vous plait

 

cdlt

Share this post


Link to post
Share on other sites

Bonjour,

 

J'ai le même problème. J'aimerais juste que les déclinaisons hors stock n'apparaissent pas dans les résultats du module facette.

 

Merci

Share this post


Link to post
Share on other sites

Pareil pour moi

J'aimerais voir que les tailles disponibles en Stock et non pas les tailles possiblement disponibles.

Share this post


Link to post
Share on other sites

Bonjour 

un petit up, quelqu'un peut il indiquer la modification exact a faire pour que les déclinaisons hors stock n'apparaissent pas dans les résultats du module facette.

 

cdlt

 

presta 1.6.1

Share this post


Link to post
Share on other sites

Bonjour,

Petit up, toujours pas de réponse, j'aimerais aussi que mon bloc de recherche n'affiche que les tailles en stock!

Merci à tous par avance...

Gilles

Share this post


Link to post
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...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More