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.

Etendre les fonctionnalités (ajouter les options manquantes) de l’éditeur tinymce sous Prestashop 1.7

Par défaut sur Prestashop 1.7, l’éditeur de texte ne propose que peu d’option. Il manque notamment un menu pour insérer une vidéo, une date, une ancre html, etc.

Prestashop 1.7 tinymce

Voilà l’éditeur complet :

Prestashop 1.7 tinymce extended
Prestashop 1.7 tinymce extended

Voilà le code qui permet de faire apparaitre toutes ces options et ainsi étendre l’éditeur de texte tinymce.

Il faut remplacer le contenu du fichier /js/admin/tinymce.inc.js


/**
 * Change default icons to marerial icons
 */
function changeToMaterial() {
  var materialIconAssoc = {
    'mce-i-code': '<i class="material-icons">code</i>',
    'mce-i-visualblocks': '<i class="material-icons">dashboard</i>',
    'mce-i-charmap': '<i class="material-icons">grade</i>',
    'mce-i-hr': '<i class="material-icons">remove</i>',
    'mce-i-searchreplace': '<i class="material-icons">find_replace</i>',
    'mce-i-none': '<i class="material-icons">format_color_text</i>',
    'mce-i-bold': '<i class="material-icons">format_bold</i>',
    'mce-i-italic': '<i class="material-icons">format_italic</i>',
    'mce-i-underline': '<i class="material-icons">format_underlined</i>',
    'mce-i-strikethrough': '<i class="material-icons">format_strikethrough</i>',
    'mce-i-blockquote': '<i class="material-icons">format_quote</i>',
    'mce-i-link': '<i class="material-icons">link</i>',
    'mce-i-alignleft': '<i class="material-icons">format_align_left</i>',
    'mce-i-aligncenter': '<i class="material-icons">format_align_center</i>',
    'mce-i-alignright': '<i class="material-icons">format_align_right</i>',
    'mce-i-alignjustify': '<i class="material-icons">format_align_justify</i>',
    'mce-i-bullist': '<i class="material-icons">format_list_bulleted</i>',
    'mce-i-numlist': '<i class="material-icons">format_list_numbered</i>',
    'mce-i-image': '<i class="material-icons">image</i>',
    'mce-i-table': '<i class="material-icons">grid_on</i>',
    'mce-i-media': '<i class="material-icons">video_library</i>',
    'mce-i-browse': '<i class="material-icons">attachment</i>',
    'mce-i-checkbox': '<i class="mce-ico mce-i-checkbox"></i>',
  };
 
  $.each(materialIconAssoc, function (index, value) {
    $('.' + index).replaceWith(value);
  });
}
 
function tinySetup(config) {
 
  if (typeof tinyMCE === 'undefined') {
    setTimeout(function () {
      tinySetup(config);
    }, 100);
    return;
  }  
  if (!config) {
    config = {};
  }
 
  if (typeof config.editor_selector != 'undefined') {
    config.selector = '.' + config.editor_selector;
  }
 
  var default_config = {
    selector: ".rte",
    browser_spellcheck: true,
    plugins : "visualblocks, preview searchreplace print insertdatetime, hr charmap colorpicker anchor code link image paste pagebreak table contextmenu filemanager table code media autoresize textcolor emoticons",
    toolbar2 : "newdocument,print,|,bold,italic,underline,|,strikethrough,superscript,subscript,|,forecolor,colorpicker,backcolor,|,bullist,numlist,outdent,indent",
    toolbar1 : "styleselect,|,formatselect,|,fontselect,|,fontsizeselect,", 
    toolbar3 : "code,|,table,|,cut,copy,paste,searchreplace,|,blockquote,|,undo,redo,|,link,unlink,anchor,|,image,emoticons,media,|,inserttime,|,preview ",
    toolbar4 : "visualblocks,|,charmap,|,hr,",
    external_filemanager_path: baseAdminDir + "filemanager/",
    filemanager_title: "File manager",
    external_plugins: {"filemanager": baseAdminDir + "filemanager/plugin.min.js"},
    language: iso_user,
    skin: "prestashop",
    menubar: false,
    statusbar: false,
    relative_urls: false,
    convert_urls: false,
    entity_encoding: "raw",
    valid_children: "+body[style|script|iframe|section],pre[iframe|section|script|div|p|br|span|img|style|h1|h2|h3|h4|h5],*[*]",
    valid_elements : '*[*]', 
    force_p_newlines : false, 
    cleanup: false,
    forced_root_block : false, 
    force_br_newlines : true,  
    convert_urls:true,
    relative_urls:false,
    remove_script_host:false,
    init_instance_callback: "changeToMaterial"
  };
 
  $.each(default_config, function (index, el) {
    if (config[index] === undefined)
      config[index] = el;
  });
 
  // Change icons in popups
  $('body').on('click', '.mce-btn, .mce-open, .mce-menu-item', function () {
    changeToMaterial();
  });
 
  tinyMCE.init(config);
}