Comment Truncate proprement une chaine HTML

Limité simplement sous PrestaShop ou thirtybees la longueur d'un texte HTML

Voici une petite astuce pour faire revenir des fonctions oubliées présentes depuis toujours dans PrestaShop.

Elles sont oubliées car PrestaShop ne les intègre plus de base dans son code et donc il faut se souvenir qu'on les a déjà utilisées pour savoir qu'elles existent.

Contexte

Il peut nous arriver de devoir couper un texte si celui-ci est trop long car il n'est pas toujours pertinent là où il est affiché.

Pour ce faire, comme beaucoup, nous avons recours à la fonction Truncate présente dans Smarty.

{$name|truncate:25:'...'|escape:'html':'UTF-8'}

Dans cet exemple nous limitons la longueur du texte affiché à 25 caractères et rajoutons ... à la fin.

Cette fonction est très pratique mais rencontre deux soucis majeurs.

  1. Elle gère très mal les accents et le calcul du nombre de caractères peut être faussé
  2. Elle ne sait pas travailler sur un texte html

La solution

Pour le premier souci, il suffit de bien encoder en UTF-8 avant d'utiliser la fonction Truncate.

je vous laisse expérimenter sur un texte accentué le fait de passer escape avant truncate, car là n'est pas le propos de mon astuce du jour.

Revenons à nous moutons et étudions la solution ultime pour limiter la taille d'un texte full HTML.

Pour retrouver cette fonction oubliée je me suis replongé dans le code de la version 1.6 où la description des catégories est limitée de base à 350 caractères et on peut afficher le reste du texte simplement en cliquant sur un bouton.

Donc dans le TPL correspondant, j'ai trouvé que la version courte de la description était issue directement du controller.

Donc en ouvrant le controller correspondant, j'ai trouvé ce code.

'description_short'    => Tools::truncateString($this->category->description, 350),

Il existe donc simplement une fonction truncateString() pour limiter la longueur d'un texte dans un code html.

L'avantage de la Classe Tools c'est que toutes ses fonctions peuvent être appelées de n'importe où et même directement dans un fichier template.

Typiquement, au lieu d'afficher {$description_short} on peut traiter la variable principale ainsi :

{Tools::truncateString($category->description, 350)}

l'appel de cette fonction est ainsi fait :

public static function truncateString($text, $length = 120, $options = [])
  • $text : la chaine de caractère à traiter
  • $length : la longueur finale désirée
  • $options : un tableaux d'options pour personnaliser la sortie
    • 'ellipsis' => '...',
    • 'exact' => true,
    • 'html' => true

Cette fonction provient du framework CakePHP, je ne sais pas si elle fût suivie des évolutions possibles de CakePHP, mais en tout cas elle va sauver beaucoup de designers pour leurs prochaines créations.

Conclusion

Il n'est pas toujours nécessaire de connaître le code par coeur, mais il est indispensable de savoir ce que l'on peut en faire.

La compétence des freelances et développeur sur des solutions comme Prestashop tient grandement à cette accumulation d'expérience pour répondre sans réinventer la roue au risque de casser le fonctionnement de base de PRestaShop et d'ouvrir la porte à des mises à jour ou maintenance impossible.