Jump to content

[ASTUCE] - Affichage Aléatoire des Produits Phares - (Accueil)


Vinc3nzo

Recommended Posts

Bonjour! Bonjour!

Une nouvelle contribution aujourd'hui, la 3eme! ceci comme toujours graçe au forum et à vous!

 

- Fonctionne sur Prestahop 1.5

 

 

OUVRIR ==> /modules/homefeatured/homefeatured.php

 

Ligne 102:

$products = $category->getProducts((int)Context::getContext()->language->id, 1, ($nb ? $nb : 10));

Remplacer par:

$products = $category->getProducts((int)Context::getContext()->language->id, 1, ($nb ? $nb : 10),NULL,NULL,false,true,true,($nb ? $nb : 50));

 

50 = Nombre Total de Produits Aléatoire. (Vérifier dans le BO vos Produits en "Catégorie => Accueil")

10 = Nombre de Produits Phares à afficher.

Edited by Vinc3nzo (see edit history)
  • Like 3
Link to comment
Share on other sites

petite précision :

($nb ? $nb : 20) renvoi le nombre de produits à afficher par page, si nb n'est pas défini on le défini à 20

mais ($nb ? $nb : 10) est en fait le nombre de produits aléatoire à afficher... pourquoi ne pas mettre 20 aussi ? (c'est soit l'un soit l'autre : soit aléatoire soit par id_product ou date)

Link to comment
Share on other sites

Autant pour moi! Merci bien de cette correction! :rolleyes:

 

En se basant sur l'affichage par défaut de prestashop (10 produits sur l'accueil), ceci permet de rendre aléatoire 20 produits ou plus au lieu de 10 à chaque fois. Si on met 10 et 10 un membre viendra redemander a coup sur "pourquoi j'ai toujours les mêmes 10 produits qui tourne en boucle sachant que j'ai ajouté 20 produit??"

 

Dans mon code ci dessus du coup je vais changer et mettre 50, ceci donnera une marge correct. (si la personne à 1000 produits elle mettra 1000 en gros.)

  • Like 1
Link to comment
Share on other sites

Autant pour moi! Merci bien de cette correction! :rolleyes:

 

En se basant sur l'affichage par défaut de prestashop (10 produits sur l'accueil), ceci permet de rendre aléatoire 20 produits ou plus au lieu de 10 à chaque fois. Si on met 10 et 10 un membre viendra redemander a coup sur "pourquoi j'ai toujours les mêmes 10 produits qui tourne en boucle sachant que j'ai ajouté 20 produit??"

 

Dans mon code ci dessus du coup je vais changer et mettre 50, ceci donnera une marge correct. (si la personne à 1000 produits elle mettra 1000 en gros.)

 

 

si il a toujours les 10 mêmes produits c'est qu'il n'y a que 10 produits visibles, normalement ça change à chaque fois, voici une partie de la fonction:

 

 

 

if ($random === true){$sql .= ' ORDER BY RAND()';$sql .= ' LIMIT 0, '.(int)$random_number_products;}

 

 

si tu veux afficher 20 produits (quelque soit le nombre de produits disponible, mais quand même supérieur à 20) il vaut mieux mettre 20 (nombre de produit par page, qui n'est pas utile pour le homefeatured) et 20 (nombre de produits à afficher).

Link to comment
Share on other sites

Bonjour,

 

LooL Non, pas un Chef, je ne fais que rendre plus clair les solutions trouvé sur le Forum grace aux membres, à vous! :)

 

Merci de me confirmer ci c'est bien la bonne ligne correct de votre fichier "homefeatured.php" d'origine.

 

Ouvrir ==> /modules/homefeatured/homefeatured.php

 

Ligne 69:

$products = $category->getProducts(intval($params['cookie']->id_lang), 1, ($nb ? $nb : 10));

 

 

Remplacer par:

$products = $category->getProducts(intval($params['cookie']->id_lang), 1, ($nb ? $nb : 50), NULL, NULL, false, true, true, ($nb ? $nb : 10));

Edited by Vinc3nzo (see edit history)
  • Like 2
Link to comment
Share on other sites

  • 4 months later...

Merci pour prestahsop 1.5.3.1

 

CHANGER 

/*'products' => $category->getProducts((int)$params['cookie']->id_lang, 1, ($nb ? $nb : 10)),*/


PAR

 'products' => $category->getProducts(intval($params['cookie']->id_lang), 1, ($nb ? $nb : 50), NULL, NULL, false, true, true, ($nb ? $nb : 10)),


  • Like 1
Link to comment
Share on other sites

Hello,

 

J'utilise déjà votre astuce depuis un certain temps déjà et je trouve cela vraiment génial.

Je voudrais savoir s'il serait possible d'y coder un moyen de faire en sorte que les produits phares afficher sur le site, ne soit uniquement des produits en stock=1 ?

 

Merci d'avance

 

bien a vous

 

Johan

  • Like 1
Link to comment
Share on other sites

Bonjour,

 

J'ai la version 1.4.9.0 et j'ai ceci dans /modules/homefeatured/homefeatured.php

 

'products' => $category->getProducts((int)$params['cookie']->id_lang, 1, ($nb ? $nb : 10)),
 'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'),
 'homeSize' => Image::getSize('home')));
 return $this->display(__FILE__, 'homefeatured.tpl');

 

J'ai remplacé la première ligne par :

$products = $category->getProducts(intval($params['cookie']->id_lang), 1, ($nb ? $nb : 50), NULL, NULL, false, true, true, ($nb ? $nb : 10));

et j'obtiens une page blanche !???

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

Bonjour,

 

J'ai la version 1.4.9.0 et j'ai ceci dans /modules/homefeatured/homefeatured.php

 

'products' => $category->getProducts((int)$params['cookie']->id_lang, 1, ($nb ? $nb : 10)),
 'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'),
 'homeSize' => Image::getSize('home')));
 return $this->display(__FILE__, 'homefeatured.tpl');

 

J'ai remplacé la première ligne par :

$products = $category->getProducts(intval($params['cookie']->id_lang), 1, ($nb ? $nb : 50), NULL, NULL, false, true, true, ($nb ? $nb : 10));

et j'obtiens une page blanche !???

 

Normalement vous n'avez juste qu'à ajouter après "language->" cette ligne:

id, 1, ($nb ? $nb : 10),NULL,NULL,false,true,true,($nb ? $nb : 50));

 

ou après "id_lang)" ajoutez cette ligne:

, 1, ($nb ? $nb : 10), NULL,NULL,false,true,true,($nb ? $nb : 50));

Edited by Vinc3nzo (see edit history)
  • Like 1
Link to comment
Share on other sites

  • 3 weeks later...

Bonsoir,

 

ou après "id_lang)" ajoutez cette ligne:

 

, 1, ($nb ? $nb : 10), NULL,NULL,false,true,true,($nb ? $nb : 50));

 

J'ai beau essayé, j'obtiens toujours la même page blanche ! :(

 

Quel est votre version de prestashop?

C'est le fichier d'origine du thème par défaut?

Link to comment
Share on other sites

  • 1 month later...

Bonjour,

 

Merci Vinc3nzo pour cette astuce.

 

Je me permets d'en ajouter une que j'utilise sur 1.4.7...

Il suffit de remplacer le hook home en bas de homefeatured.php par ce code ci-dessous. Il faut juste rajouter shuffle($products);

 

function hookHome($params)
{
 global $smarty;
 $category = new Category(1, Configuration::get('PS_LANG_DEFAULT'));
 $nb = (int)(Configuration::get('HOME_FEATURED_NBR'));
 $products = $category->getProducts((int)($params['cookie']->id_lang), 1, ($nb ? $nb : 10));

 shuffle($products);

 $smarty->assign(array(
 'products' => $products,
 'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'),
 'homeSize' => Image::getSize('home')));


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

 

Par contre, avec ce code, comme avec celui de Vinc3enzo, le site n'affiche que les produits dans la catégorie "Accueil" bien entendu.

 

Quelqu'un saurait-il comment faire que le shuffle prenne en compte tous les produits d'une catégorie x? Je ne sais pas où entrer le category ID...

 

Merci!!! :D

Link to comment
Share on other sites

Je me réponds et je suis super contente d'enfin pouvoir (peut-être) apporter quelque chose à d'autres...

 

En fait dans la ligne

$category = new Category(1, Configuration::get('PS_LANG_DEFAULT'));

 

Le "1" correspond à l'ID de la catégorie. En modifiant cet ID et en re uploadant le fichier par FTP, vous avez les produits de la catégorie que vous voulez en page d'accueil!

 

Bisous à tous!

Link to comment
Share on other sites

  • 3 months later...

Merci Vinc3nzo;

 

Ça faisait 3 jours que je m'arrachais les cheveux pour avoir ET les produits en aléatoire ET conserver le graphisme d'un thème

 

Le simple "shuffle" ne fonctionnant pas correctement.... Et les modules "tout fait", me craquant le graphisme.

Voir ici:

http://www.prestashop.com/forums/topic/264277-probleme-produits-phare-aleatoires/

 

Avec ta correction >>>>> Nickel ( presta 1.4.4.0 )

 

Un grand MERCI

Link to comment
Share on other sites

  • 4 months later...

Bonjour,

 

Je me permets de relancer le post car l'astuce ne semble pas fonctionner correctement chez moi, cela doit être un mauvais paramétrage de ma part mais je ne vois où se situe le problème.

 

Mon site

 

Je suis sur la version prestashop 1.5.6.1 et j'ai un thème personnalisé

 

J'ai modifié la ligne dans homefeature.php comme indiqué dans le premier message. J'ai juste indiqué 9 pour le nombre de produit phare à afficher.

if (!defined('_PS_VERSION_'))
    exit;

class HomeFeatured extends Module
{
    private $_html = '';
    private $_postErrors = array();

    function __construct()
    {
        $this->name = 'homefeatured';
        $this->tab = 'front_office_features';
        $this->version = '1.1';
        $this->author = 'PrestaShop';
        $this->need_instance = 0;

        parent::__construct();

        $this->displayName = $this->l('Featured products on the homepage.');
        $this->description = $this->l('Displays featured products in the middle of your homepage.');
    }

    function install()
    {
        $this->_clearCache('homefeatured.tpl');
        Configuration::updateValue('HOME_FEATURED_NBR', 8);

        if (!parent::install()
            || !$this->registerHook('displayHome')
            || !$this->registerHook('header')
            || !$this->registerHook('addproduct')
            || !$this->registerHook('updateproduct')
            || !$this->registerHook('deleteproduct')
        )
            return false;
        return true;
    }
    
    public function uninstall()
    {
        $this->_clearCache('homefeatured.tpl');
        return parent::uninstall();
    }

    public function getContent()
    {
        $output = '<h2>'.$this->displayName.'</h2>';
        if (Tools::isSubmit('submitHomeFeatured'))
        {
            $nbr = (int)Tools::getValue('nbr');
            if (!$nbr OR $nbr <= 0 OR !Validate::isInt($nbr))
                $errors[] = $this->l('An invalid number of products has been specified.');
            else
                Configuration::updateValue('HOME_FEATURED_NBR', (int)($nbr));
            if (isset($errors) AND sizeof($errors))
                $output .= $this->displayError(implode('<br />', $errors));
            else
                $output .= $this->displayConfirmation($this->l('Your settings have been updated.'));
        }
        return $output.$this->displayForm();
    }

    public function displayForm()
    {
        $output = '
        <form action="'.Tools::safeOutput($_SERVER['REQUEST_URI']).'" method="post">
            <fieldset><legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Settings').'</legend>
                <p>'.$this->l('To add products to your homepage, simply add them to the "home" category.').'</p><br />
                <label>'.$this->l('Define the number of products to be displayed.').'</label>
                <div class="margin-form">
                    <input type="text" size="5" name="nbr" value="'.Tools::safeOutput(Tools::getValue('nbr', (int)(Configuration::get('HOME_FEATURED_NBR')))).'" />
                    <p class="clear">'.$this->l('Define the number of products that you would like to display on homepage (default: 8).').'</p>

                </div>
                <center><input type="submit" name="submitHomeFeatured" value="'.$this->l('Save').'" class="button" /></center>
            </fieldset>
        </form>';
        return $output;
    }

    public function hookDisplayHeader($params)
    {
        $this->hookHeader($params);
    }

    public function hookHeader($params)
    {
        $this->context->controller->addCSS(($this->_path).'homefeatured.css', 'all');
    }

    public function hookDisplayHome($params)
    {
        if (!$this->isCached('homefeatured.tpl', $this->getCacheId('homefeatured')))
        {
            $category = new Category(Context::getContext()->shop->getCategory(), (int)Context::getContext()->language->id);
            $nb = (int)Configuration::get('HOME_FEATURED_NBR');
            $products = $category->getProducts((int)Context::getContext()->language->id, 1, ($nb ? $nb : 9),NULL,NULL,false,true,true,($nb ? $nb : 50));        

            $this->smarty->assign(array(
                'products' => $products,
                'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'),
                'homeSize' => Image::getSize(ImageType::getFormatedName('home')),
            ));
        }
        return $this->display(__FILE__, 'homefeatured.tpl', $this->getCacheId('homefeatured'));
    }

    public function hookAddProduct($params)
    {
        $this->_clearCache('homefeatured.tpl');
    }

    public function hookUpdateProduct($params)
    {
        $this->_clearCache('homefeatured.tpl');
    }

    public function hookDeleteProduct($params)
    {
        $this->_clearCache('homefeatured.tpl');
    }
}

Après recompilation des fichiers dans le backoffice, je visualise ma boutique et en effet l'ordre des produits a changé mais il n 'y en a que 8 alors que j'ai paramétré à 9 ???

 

De plus, cette affichage reste fixe. Pour qu'il change, je dois systématiquement recompiler et vider le cache de smarty et d l'autoload.

 

Nicolas

 

PS : j'ai aussi testé un module tout fait de produits phares aléatoires mais ça casse complètement mon thème, l'affichage est horrible, les produits sont positionnés verticalement et le texte coupé. Heureusement, je n'ai pas acheté ce module :unsure: .

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

PS : j'ai aussi testé un module tout fait de produits phares aléatoires mais ça casse complètement mon thème, l'affichage est horrible, les produits sont positionnés verticalement et le texte coupé. Heureusement, je n'ai pas acheté ce module :unsure: .

Bonjour,

 

j'imagine que vous faites référence à mon module gratuit de produits phares aléatoire qui est basé sur le design de base de Prestashop et donc il vous incombe de faire les modifications adéquates pour le rendre compatible avec votre template personnalisé car je n'ai pas les moyen de connaitre et adapter ce module pour le milliers de template du monde Prestashop.

Mais sinon de rien de proposer des moduels fonctionnel ou vous n'avez que le css à modifier et non plonger dans du code qui peut planter votre site.

  • Like 1
Link to comment
Share on other sites

Bonjour,

 

Oui, en effet, on peut comprendre qu'il est impossible de créer un module qui s'adapte à tous les thèmes. Ça ne pose pas de problème si ce dernier est gratuit mais quand vous payez un module cher qui ne s'adapte pas tout de suite et qu'il faut soi-même faire tout le travail, on peut comprendre la déception de l'acheteur.

 

Le problème semble néanmoins réglé sans faire de modifications.

 

J'ai inséré ces lignes après la ligne 120 dans /modules/homefeature/homefeature.php de la version 1.5.6.1 de prestashop :

$category = new Category(Context::getContext()->shop->getCategory(), (int)Context::getContext()->language->id);
            $nb = (int)Configuration::get('HOME_FEATURED_NBR');
            $products = $category->getProducts((int)Context::getContext()->language->id, 1, ($nb ? $nb : 9),NULL,NULL,false,true,true,($nb ? $nb : 50));

Le chiffre 9 correspond au nombre de produits à afficher sur la page et 50 correspond aux premiers produits utilisés par les produits phares. Si on a 2000 produits, on peut remplacer 50 par 2000.

 

Il pourrait être intéressant de modifier ce code pour offrir un choix sur une catégorie de produits ou des produits en promo à mettre dans les produits phares plutôt que tous les produits sans distinction.

 

Dans tous les cas, votre module m'a été utile pour comprendre le fonctionnement de homefeature. Sans votre travail, il nous serait particulièrement difficile d'améliorer et de personnaliser nos boutiques.

 

Merci à la communauté prestashop

 

Nicolas

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

  • 1 month later...

Bonjour

j'ais remplacé la ligne sur 1.5.6.1 mais cela ne change qu'une fois lorsque j'efface le cache smarty et que je force la recompilation, ensuite c'est les même.

 

quelqu'un d'autre a 't il testé sur 1.5.6.1 ou connais une solution

 

cdlt

Link to comment
Share on other sites

Bonjour

j'ais remplacé la ligne sur 1.5.6.1 mais cela ne change qu'une fois lorsque j'efface le cache smarty et que je force la recompilation, ensuite c'est les même.

 

quelqu'un d'autre a 't il testé sur 1.5.6.1 ou connais une solution

 

cdlt

regarde ça : http://www.prestashop.com/forums/topic/283055-r%C3%A9soluaffichage-al%C3%A9atoire-des-produits-page-daccueil-sur-1560/?do=findComment&comment=1424146

Link to comment
Share on other sites

Bonjour

j'ais remplacé la ligne sur 1.5.6.1 mais cela ne change qu'une fois lorsque j'efface le cache smarty et que je force la recompilation, ensuite c'est les même.

 

quelqu'un d'autre a 't il testé sur 1.5.6.1 ou connais une solution

 

cdlt

 

Bonjour,

 

Ça devrait fonctionner sur la 1.5.6.1 car chez moi c'est parfait. As-tu pensé à faire ctrl F5 sur ton navigateur ?

 

Autre point : Tu as peut-être oublié de cocher la case "accueil" pour tes produits et tes catégories car sans cela les produits nes'afficheront pas en page d'accueil. Vérifie ça dans ton backoffice sur les produits qui devraient se trouver dans les produits phares, idem pour les catégories.

 

homefe10.jpg

Link to comment
Share on other sites

  • 6 months later...

Je up le topic car y a t'il des changements pour la version 1,6 de presta ?

 

J'ai fait les corrections comme ceci :

 

    HomeFeatured::$cache_products = $category->getProducts((int)Context::getContext()->language->id, 1, ($nb ? $nb : 10), NULL, NULL, false, true, true, ($nb ? $nb : 50), 'position');

 

Mais l'aléatoire ne fonctionne que si on vide le cache, sinon il ne fonctionne qu'une seule fois puis se sont toujours les même produits qui s'affichent.

 

Une idée ?

Link to comment
Share on other sites

  • 1 month later...

Bonjour,

 

je suis en version 1.5.4.1 avec un thème acheté sur prestashop addons (newparure)

 

et je ne m'y retrouve pas dans le fichier homefeatured.tpl

voici mon code actuel,

quelle est la partie à modifier pour avoir un affichage aléatoire.?

 

Merci par avance

 

Philippe

 

 

<!-- MODULE Home Featured Products -->

 
 
 
<div id="featured-products_block_center" class="block products_block">
 
<h4>{l s='Featured products' mod='homefeatured'}</h4>
 
{if isset($products) AND $products}
 
<div class="block_content">
{assign var='liHeight' value=285}
{assign var='nbItemsPerLine' value=4}
{assign var='nbLi' value=$products|@count}
{math equation="nbLi/nbItemsPerLine" nbLi=$nbLi nbItemsPerLine=$nbItemsPerLine assign=nbLines}
{math equation="nbLines*liHeight" nbLines=$nbLines|ceil liHeight=$liHeight assign=ulHeight}
 
 
 
<ul style="height:{$ulHeight}px; width: 100%">
{foreach from=$products item=product name=homeFeaturedProducts}
{math equation="(total%perLine)" total=$smarty.foreach.homeFeaturedProducts.total perLine=$nbItemsPerLine assign=totModulo}
{if $totModulo == 0}{assign var='totModulo' value=$nbItemsPerLine}
{/if}
 
<li class="ajax_block_product {if $smarty.foreach.homeFeaturedProducts.first}first_item{elseif $smarty.foreach.homeFeaturedProducts.last}last_item{else}item{/if} {if $smarty.foreach.homeFeaturedProducts.iteration%$nbItemsPerLine == 0}last_item_of_line{elseif $smarty.foreach.homeFeaturedProducts.iteration%$nbItemsPerLine == 1} {/if} {if $smarty.foreach.homeFeaturedProducts.iteration > ($smarty.foreach.homeFeaturedProducts.total - $totModulo)}last_line{/if}">
 
 
 
<div class="view">                    
<img src="{$link->getImageLink($product.link_rewrite, $product.id_image, 'home')}" height="{$homeSize.height}" width="{$homeSize.width}" alt="{$product.name|escape:html:'UTF-8'}" />                    
<div class="mask">                        
<h2>{$product.name|truncate:17:'...'|escape:'htmlall':'UTF-8'}</h2>                        
<div id="desk">{$product.description_short|strip_tags|truncate:130:'...'}</div>                        
<a href="{$product.link}" class="info">{l s='View' mod='homefeatured'}</a>                    
</div>
</div>
 
<div>
<h5><a href="{$product.link}" title="{$product.name|truncate:32:'...'|escape:'htmlall':'UTF-8'}">{$product.name|truncate:17:'...'|escape:'htmlall':'UTF-8'}</a></h5>
{if $product.show_price AND !isset($restricted_country_mode) AND !$PS_CATALOG_MODE}
<p class="price_container"><span class="price">{if !$priceDisplay}{convertPrice price=$product.price}{else}{convertPrice price=$product.price_tax_exc}{/if}</span></p>
{else}
 
<div style="height:21px;"></div>
{/if}
<a class="button" href="{$product.link}" title="{l s='View' mod='homefeatured'}">{l s='View' mod='homefeatured'}</a>
{if ($product.id_product_attribute == 0 OR (isset($add_prod_display) AND ($add_prod_display == 1))) AND $product.available_for_order AND !isset($restricted_country_mode) AND $product.minimal_quantity == 1 AND $product.customizable != 2 AND !$PS_CATALOG_MODE}
{if ($product.quantity > 0 OR $product.allow_oosp)}
<a class="exclusive ajax_add_to_cart_button" rel="ajax_id_product_{$product.id_product}" href="{$link->getPageLink('cart.php')}?qty=1&id_product={$product.id_product}&token={$static_token}&add" title="{l s='Add to cart' mod='homefeatured'}">{l s='Add to cart' mod='homefeatured'}</a>
{else}
<span class="exclusive">{l s='Add to cart' mod='homefeatured'}</span>
{/if}
{else}
 
<div style="height:23px;"></div>
{/if}
</div>
</li>
 
{/foreach}
</ul>
</div>
 
{else}
<p>{l s='No featured products' mod='homefeatured'}</p>
{/if}
 
</div>
 
<!-- /MODULE Home Featured Products -->
Link to comment
Share on other sites

  • 4 weeks later...
Guest
This topic is now closed to further replies.
×
×
  • Create New...