Ajouter une fonction de tri d’un tableau directement dans Smarty sous Prestashop 1.7

Il faut ajouter ce code dans : “/config/smarty.config.inc.php”.

Ce code provient du forum Smarty : http://www.smarty.net/forums/viewtopic.php?p=23628#23628

Le code récupéré sur le forum provoquait une erreur car la fonction split() est dépréciée depuis php 7. Je l’ai simplement remplacé par explode()

# 
# sorts an array of named arrays by the supplied fields 
#   code by dholmes at jccc d0t net 
#   taken from http://au.php.net/function.uasort 
# modified by cablehead, messju and pscs at http://www.phpinsider.com/smarty-forum 

function array_sort_by_fields(&$data, $sortby){ 
      static $sort_funcs = array(); 
      
    if (empty($sort_funcs[$sortby])) 
    { 
        $code = "\$c=0;"; 
        foreach (explode(',', $sortby) as $key) 
        { 
           $d = '1'; 
              if (substr($key, 0, 1) == '-') 
              { 
                 $d = '-1'; 
                 $key = substr($key, 1); 
              } 
              if (substr($key, 0, 1) == '#') 
              { 
                 $key = substr($key, 1); 
               $code .= "if ( ( \$c = (\$a['$key'] - \$b['$key'])) != 0 ) return $d * \$c;\n"; 
              } 
              else 
              { 
               $code .= "if ( (\$c = strcasecmp(\$a['$key'],\$b['$key'])) != 0 ) return $d * \$c;\n"; 
            } 
        } 
        $code .= 'return $c;'; 
        $sort_func = $sort_funcs[$sortby] = create_function('$a, $b', $code); 
    } 
    else 
    { 
        $sort_func = $sort_funcs[$sortby]; 
    }    
    uasort($data, $sort_func);    
} 

# 
# Modifier: sortby - allows arrays of named arrays to be sorted by a given field 
# 
function smarty_modifier_sortby($arrData,$sortfields) { 
   array_sort_by_fields($arrData,$sortfields); 
   return $arrData; 
}

Ensuite, dans le fichier de template .tpl, on peut ajouter @sortby comme ceci :

{foreach from=$listing.products|@sortby:"#id_category_default" key=k  item="product"}
    //
{/foreach}

Ici, les produits sont triés par ID de la catégorie par défaut (colonne id_category_default dans la table product de la base de données prestashop)

Il faut préciser que les puristes considèrent que le tri devrait se faire dans le controller (en pure PHP) et ne devrait pas être géré dans le Template compilé par Smarty.

Parfois, quand on travaille sur un Template, cela paraît plus simple à gérer dans le Template car c’est aussi une question de mise en forme.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *