Jump to content

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
Link to comment
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 :)

Link to comment
Share on other sites

  • 1 month later...

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,

Link to comment
Share on other sites

  • 4 months later...
  • 1 month later...

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)
Link to comment
Share on other sites

  • 4 months later...

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).') ';

Link to comment
Share on other sites

  • 5 months later...

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

Link to comment
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!

Link to comment
Share on other sites

  • 1 month later...

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

Link to comment
Share on other sites

  • 4 weeks later...

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

Link to comment
Share on other sites

  • 1 month later...
  • 2 years later...
  • 1 month later...
  • 1 year later...
  • 2 years later...

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