Jump to content

Chargement des pages lent


Recommended Posts

Bonjour,

Sur Prestashop 1.7.8.7, je souhaite afficher toutes les sous-catégories actives d'une catégorie d'ID 22 et tous les produits associés à chacune de ces sous-catégories sur toutes les pages du site.

Mon problème :
Les pages sont très longues à charger en faisant cela.

 

> Dans l'override de FrontController.php j'ai écrit ce code :
 

public function initContent()
    {
        parent::initContent();

        $context = Context::getContext();

        // Subcategories
        $subcategoriesNature = Category::getChildren(22, $context->language->id, true);

        $context->smarty->assign('subcategoriesNature', $subcategoriesNature);

        // Products by category
        $productsbyCategNature = array();
        if( is_array($subcategoriesNature) && !empty($subcategoriesNature) ) {
            foreach( $subcategoriesNature as $categ ) {
                $productsbyCategNature[] = Product::getProducts($context->language->id, 0, 0, 'position', 'ASC', $categ['id_category'], true);
            }
        }

        $context->smarty->assign('productsbyCategNature', $productsbyCategNature);

    }

 

> Et dans le header.tpl de mon thème :
 

{if isset($subcategoriesNature) && is_array($subcategoriesNature)}
  {foreach from=$subcategoriesNature item=categ name=categs}

        <ul>
          {if isset($productsbyCategNature[$smarty.foreach.categs.index]) && is_array($productsbyCategNature[$smarty.foreach.categs.index])}
            {foreach from=$productsbyCategNature[$smarty.foreach.categs.index] item=prod name=products}
              <li><a href="{$link->getProductLink($prod.id_product, null, null, null, null, null, $prod.cache_default_attribute)}">{$prod.name|truncate:35:'...'}</a></li>
            {/foreach}
          {/if}

        </ul>

  {/foreach}
{/if}

 

Informations complémentaires :

  • Mode debug désactivé
  • Cache Smarty activé (système de fichier)
  • Smart cache (CSS + JS) activé
  • Optimisation Apache : activé
  • Serveur mutualisé (sur SSD)
  • PHP 7.4
  • Je n'ai pas d'erreur dans le code, tout fonctionne.

 

Ma question :
Existe-t-il une meilleure façon de coder ou autre pour gagner en temps de chargement (car là il faut plus de 4 secondes de chargement total au lieu d'environ 2 secondes) ?

 

Merci

Link to comment
Share on other sites

On 8/14/2023 at 1:52 PM, thibaut123456 said:

Bonjour,

Sur Prestashop 1.7.8.7, je souhaite afficher toutes les sous-catégories actives d'une catégorie d'ID 22 et tous les produits associés à chacune de ces sous-catégories sur toutes les pages du site.

Mon problème :
Les pages sont très longues à charger en faisant cela.

 

> Dans l'override de FrontController.php j'ai écrit ce code :
 

public function initContent()
    {
        parent::initContent();

        $context = Context::getContext();

        // Subcategories
        $subcategoriesNature = Category::getChildren(22, $context->language->id, true);

        $context->smarty->assign('subcategoriesNature', $subcategoriesNature);

        // Products by category
        $productsbyCategNature = array();
        if( is_array($subcategoriesNature) && !empty($subcategoriesNature) ) {
            foreach( $subcategoriesNature as $categ ) {
                $productsbyCategNature[] = Product::getProducts($context->language->id, 0, 0, 'position', 'ASC', $categ['id_category'], true);
            }
        }

        $context->smarty->assign('productsbyCategNature', $productsbyCategNature);

    }

 

> Et dans le header.tpl de mon thème :
 

{if isset($subcategoriesNature) && is_array($subcategoriesNature)}
  {foreach from=$subcategoriesNature item=categ name=categs}

        <ul>
          {if isset($productsbyCategNature[$smarty.foreach.categs.index]) && is_array($productsbyCategNature[$smarty.foreach.categs.index])}
            {foreach from=$productsbyCategNature[$smarty.foreach.categs.index] item=prod name=products}
              <li><a href="{$link->getProductLink($prod.id_product, null, null, null, null, null, $prod.cache_default_attribute)}">{$prod.name|truncate:35:'...'}</a></li>
            {/foreach}
          {/if}

        </ul>

  {/foreach}
{/if}

 

Informations complémentaires :

  • Mode debug désactivé
  • Cache Smarty activé (système de fichier)
  • Smart cache (CSS + JS) activé
  • Optimisation Apache : activé
  • Serveur mutualisé (sur SSD)
  • PHP 7.4
  • Je n'ai pas d'erreur dans le code, tout fonctionne.

 

Ma question :
Existe-t-il une meilleure façon de coder ou autre pour gagner en temps de chargement (car là il faut plus de 4 secondes de chargement total au lieu d'environ 2 secondes) ?

 

Merci

Il y a plusieurs points à améliorer... Pour commencer, il serait judicieux d'effectuer une mise en cache. ;) 

Link to comment
Share on other sites

Bonjour,

Vous souhaitez ce comportement pour une seule catégorie et seulement cette catégorie ?

Car de base, le module de navigation à facette permet d'afficher tous les produits des sous-catégories, puis pour afficher l'intégralité de tous les produits, il suffit de définir le nombre de produits par page à un niveau très élevé.

Après, comme souligné précédemment, il faut un serveur qui tienne la route et qui soit bien configuré pour afficher beaucoup de produits sur un page, car cela demande plus de ressources d'afficher 500 produits par page que 8.

Link to comment
Share on other sites

il y a 28 minutes, wepresta a dit :

Il y a plusieurs points à améliorer... Pour commencer, il serait judicieux d'effectuer une mise en cache. ;) 

Merci pour votre réponse et à quel niveau vous pensez que je dois appliquer un cache ? Dans le PHP ?

 

il y a 11 minutes, Mediacom87 a dit :

Bonjour,

Vous souhaitez ce comportement pour une seule catégorie et seulement cette catégorie ?

Car de base, le module de navigation à facette permet d'afficher tous les produits des sous-catégories, puis pour afficher l'intégralité de tous les produits, il suffit de définir le nombre de produits par page à un niveau très élevé.

Après, comme souligné précédemment, il faut un serveur qui tienne la route et qui soit bien configuré pour afficher beaucoup de produits sur un page, car cela demande plus de ressources d'afficher 500 produits par page que 8.

En réalité je veux récupérer les sous-catégories et produits de 2 catégories principales mais pour l'exemple j'ai mis que la catégorie principale d'ID 22.

Tout ce que j'ai besoin dans header.tpl est de récupérer le nom & le lien de chaque catégorie et de chaque produit sans question de pagination (je ne veux pas afficher de "bloc produit").

Link to comment
Share on other sites

6 hours ago, thibaut123456 said:

Merci pour votre réponse et à quel niveau vous pensez que je dois appliquer un cache ? Dans le PHP ?

 

En réalité je veux récupérer les sous-catégories et produits de 2 catégories principales mais pour l'exemple j'ai mis que la catégorie principale d'ID 22.

Tout ce que j'ai besoin dans header.tpl est de récupérer le nom & le lien de chaque catégorie et de chaque produit sans question de pagination (je ne veux pas afficher de "bloc produit").

Toute cette partie 

     $productsbyCategNature = array();
        if( is_array($subcategoriesNature) && !empty($subcategoriesNature) ) {
            foreach( $subcategoriesNature as $categ ) {
                $productsbyCategNature[] = Product::getProducts($context->language->id, 0, 0, 'position', 'ASC', $categ['id_category'], true);
            }
        }

        $context->smarty->assign('productsbyCategNature', $productsbyCategNature);

 

  • Like 1
Link to comment
Share on other sites

Le 17/08/2023 à 5:07 PM, wepresta a dit :

Toute cette partie 

     $productsbyCategNature = array();
        if( is_array($subcategoriesNature) && !empty($subcategoriesNature) ) {
            foreach( $subcategoriesNature as $categ ) {
                $productsbyCategNature[] = Product::getProducts($context->language->id, 0, 0, 'position', 'ASC', $categ['id_category'], true);
            }
        }

        $context->smarty->assign('productsbyCategNature', $productsbyCategNature);

 

Merci pour votre réponse, pourriez-vous m'indiquer la marche à suivre pour mettre en cache cette portion de code PHP ? Et s'il existe une fonction Prestashop pour cela ?

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