Jump to content

Rendre aléatoire l'affichage du block "Nouveaux Produits"


kimzey

Recommended Posts

Bonjour,

Je cherche actuellement un moyen pour rendre l'affichage des nouveaux produits aléatoire comme pour le module Promo par exemple.
J'ai fais une recherche sur ce forum mais je n'ai rien trouvé et mes bidouillages de code n'ont rien donnés non plus.

Alors si l'un d'entre vous a une piste je suis preneur.

Merci

Link to comment
Share on other sites

Oui bien sur et malheureusement aucun ne correspond vraiment à ce que je veux. En effet il existe des carrousels mais en ayant déjà un en page d'accueil j'ai peur que ça fasse troo much d'en rajouter un sur le coté.

Link to comment
Share on other sites

Salut,

Si tu veux tu peux changer le classement des produits dans le tableau envoyé par le fichier php du module.

en utilisant shuffle();

Il faut rajouter shuffle($newProducts); avant d'envoyer le tableau.

$newProducts = Product::getNewProducts(intval($params['cookie']->id_lang), 0, intval(Configuration::get('NEW_PRODUCTS_NBR')));
       shuffle($newProducts);
       $smarty->assign(array('new_products' => $newProducts, 'mediumSize' => Image::getSize('medium')));

       return $this->display(__FILE__, 'blocknewproducts.tpl');



Testé et approuvé sur mon site.

Link to comment
Share on other sites

Je viens de tester ton code et il marche parfaitement !
Par contre il ne fait tourner que les produits s'affichant dans le bloc et j'aimerai qu'il face tourner l'ensemble du catalogue nouveaux produits (une trentaine de références ). Le seul moyen que j'ai trouvé est de configurer le bloc pour qu'il affiche 30 produits mais ça casse complétement l'équilibre visuel du site.

Existe t'il un moyen pour qu'il fasse tourner l'ensemble des références ?

Merci encore pour votre aide.

Link to comment
Share on other sites

Bonjour,

Je pense que l'affichage de 10 produits(il ne fait tourner que les produits s’affichant dans le bloc) seulement dans le block newproducts est lié à la requette qui selectionne les nouveaux produits dans la classe classes/Product.php dans la function getNewProducts(), ceci est lié à ORDER BY(),
Si vous regarder la function getRandomSpecial ,dans le méme classe, qui retourne la liste des produits en promotion vous allez trouvé un ORDER BY RAND(), c-a-dire une selection alléatoire, alors je pense que ORDER BY RAND() peut vous aider.

Link to comment
Share on other sites

Bonjour,

tout à fait bechir, par contre je déconseil de modifier une classe pour ce genre de chose, car après lors d'une mise à jour, cela complique tout.

Donc, préférez récupérer la requête pour l'adapter et l'intégrer au php du module.

Link to comment
Share on other sites

Oui tout à fait, On peut par exemple appeller le order by à partir du php du module en remplacant

$newProducts = Product::getNewProducts(intval($params['cookie']->id_lang), 0, Configuration::get('NEW_PRODUCTS_NBR'));
par
$newProducts = Product::getNewProducts(intval($params['cookie']->id_lang), 0, Configuration::get('NEW_PRODUCTS_NBR'),false, 'RAND()');

j'ai pas tester ca, mais je pense que c comme ca qu on peut faire.

Link to comment
Share on other sites

Je viens de tester les deux morceaux de code que vous m'avez fourni est malheureusement ils ne marchent pas, j'ai un message dans mon bloc:" pas de nouveau produits"

Merci en tout cas de m'aider !

Link to comment
Share on other sites

Le principe est de faire une requette de cette facon
"
SELECT p.*, pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, p.`ean13`, i.`id_image`, il.`legend`, t.`rate`, m.`name` AS manufacturer_name FROM `ps_product` p LEFT JOIN `ps_product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = 2) LEFT JOIN `ps_image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) LEFT JOIN `ps_image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = 2) LEFT JOIN `ps_tax` t ON (t.`id_tax` = p.`id_tax`) LEFT JOIN `ps_manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`) WHERE p.`active` = 1 AND DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL 20 DAY)) > 0 AND p.`id_product` IN ( SELECT cp.`id_product` FROM `ps_category_group` cg LEFT JOIN `ps_category_product` cp ON (cp.`id_category` = cg.`id_category`) WHERE cg.`id_group` = 1 ) ORDER BY RAND() LIMIT 0, 5"

Ca ,vous pouvez le faire à partir du classe Product.php en remplacant la ligne 1015 :

"ORDER BY '.(isset($orderByPrefix) ? pSQL($orderByPrefix).'.' : '').'`'.pSQL($orderBy).'` '.pSQL($orderWay).'"

Par

"ORDER BY RAND()"
NB: Ajouter des parenthèse à la fin de la fonction RAND

Mais comme Jeckyle a dit, on préfére de ne pas toucher à la classe pour les raisons de mis à jour.

Link to comment
Share on other sites

merci pour votre aide mais la manipulation me semble un peu trop complexe pour moi donc je me contenterai du module par défaut.

Je tiens une nouvelle fois à saluer l'esprit d'entraide qui règne sur ce forum, MERCI !

Link to comment
Share on other sites

  • 2 months later...

Bonjour,

Je viens de trouver une solution au problème pour laquelle on ne modifie que les fichiers blocknewproducts.php et blocknewproducts.php.tpl. L'idée est la suivante :

- Dans le backoffice, configurer le nombre de nouveaux produits à afficher avec une valeur élevée qui correspond aux nombre des derniers nouveaux produits parmi lesquels on veut que le choix aléatoire se fasse (c'est clair ?)

- Modifier le fichier blocknewproducts.php pour que les produits soient mélangés avec l'instruction
shuffle (merci jeckyl ;-) ):

    $newProducts = Product::getNewProducts(intval($params['cookie']->id_lang), 0, intval(Configuration::get('NEW_PRODUCTS_NBR')));
   shuffle($newProducts);
   $smarty->assign(array('new_products' => $newProducts, 'mediumSize' => Image::getSize('medium')));



- Modifier le fichier blocknewproducts.tpl pour limiter la boucle d'affichage au nombre de produits à afficher (4 dans l'exemple, donc on teste si l'index est inférieur à 5) :

   {foreach from=$new_products item=newproduct name=myLoop}
       {if $smarty.foreach.myLoop.index < 5}
{$newproduct.name|strip_tags|escape:html:'UTF-8'}
           {if $newproduct.description_short}{$newproduct.description_short|strip_tags:'UTF-8'|truncate:50:'...'} >" src="{$img_dir}bullet.gif"/>{/if}
       {/if}
   {/foreach}



Les fichiers sont ceux de la version 1.3.1
Cela fonctionne trés bien comme vous pouvez le voir sur mon site : www.playdsir.com
Totuefois, je suppose que comme on demande un plus grand nombre de resultats à la base SQL, cela utilise plus de ressources sur le serveur et augmente le temps de chargement des pages... à vérifier.

blocknewproducts.php

  • Like 1
Link to comment
Share on other sites

  • 2 years later...

En 1.4.6.2 pour avoir un affichage 1 / 2 ou n produits dans la colonne :

 

 

$newProducts = Product::getNewProducts((int)($params['cookie']->id_lang), 0, intval(Configuration::get('NEW_PRODUCTS_NBR')));
if (!$newProducts AND !Configuration::get('PS_BLOCK_NEWPRODUCTS_DISPLAY'))
return;
shuffle($newProducts);
// changer nb de array_slice(array,x,nb) pour changer le nombre de produits affichés
$smarty->assign(array('new_products' => array_slice($newProducts,0,2), 'mediumSize' => Image::getSize('medium')));

Edited by zedcharly (see edit history)
Link to comment
Share on other sites

En 1.4.6.2 pour avoir un affichage 1 / 2 ou n produits dans la colonne :

 

$newProducts = Product::getNewProducts((int)($params['cookie']->id_lang), 0, intval(Configuration::get('NEW_PRODUCTS_NBR')));

if (!$newProducts AND !Configuration::get('PS_BLOCK_NEWPRODUCTS_DISPLAY'))

return;

shuffle($newProducts);

 

// changer nb de array_slice(array,x,nb) pour changer le nombre de produits affichés

 

$smarty->assign(array('new_products' => array_slice($newProducts,0,2), 'mediumSize' => Image::getSize('medium')));

Link to comment
Share on other sites

  • 10 months later...
  • 1 month later...
  • 4 months later...
  • 6 months 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...