Fork me on GitHub

Rapport de message :*
 

Astuce : Gestion des url dans vos modules de contenu

Titre du sujet : Astuce : Gestion des url dans vos modules de contenu
par blueteen sur 04/06/2007 14:51:18

Bonjour,
vous l'avez peut-être remarqué sur vos sites : dans les modules de gestion de contenu (edito, news, les forums, etc...), lorsque vous rentrez des adresses de sites (url) trop longues, ça a tendance à défigurer vos présentations de page.

L'astuce était, en principe, d'utiliser les 'bbcode' pour écrire un mot ou bout de phrase, et placer le lien sur ce mot ou bout de phrase précisément, ce qui limitait la taille à l'écran.

C'est un coup de main à prendre, mais pour la majorité des internautes, il est quand même plus simple de juste coller son lien dans le message et de valider, et c'est normal.

Certains forums ont cette faculté de tronquer les adresses trop longues en ajoutant des ... au milieu de l'url, pour ne laisser que le début et la fin de l'adresse (tout en restant cliquable, et pointant vers la bonne destination).
Partant de ce constat, j'ai cherché à reproduire ce comportement sur nos sites xoopsés.

Au départ appliqué seulement à newbbex (1.4), je me suis dit : 'pourquoi ne pas l'appliquer à tout un site'.

Et je pense avoir régler mon souci.
Je vous soumets donc la modification, qui est simple à mettre en place, et me dire si ça vous pose des problèmes ou si au contraire c'est pratique.

Je modifie simplement une seule fonction, dans un seul fichier du core (fichier de xoops lui-même).
Dans le fichier /class/module.textsanitizer.php (pour xoops 2.0.16), je remplace la fonction makeClickable, commençant à la ligne 131 :
function makeClickable(&$text)
    {
        
$patterns = array("/(^|[^]_a-z0-9-="'/])([a-z]+?)://([^, rn"()'<>]+)/i", "/(^|[^]_a-z0-9-="'/])www.([a-z0-9-]+).([^, rn"()'<>]+)/i", "/(^|[^]_a-z0-9-="'/])ftp.([a-z0-9-]+).([^, rn"()'<>]+)/i""/(^|[^]_a-z0-9-="'/:.])([a-z0-9-_.]+?)@([^, rn"()'<>[]]+)/i");
        
$replacements = array("\1<a href="\2://\3" target="_blank">\2://\3</a>", "\1<a href="http://www.\2.\3" target="_blank">www.\2.\3</a>", "\1<a href="ftp://ftp.\2.\3" target="_blank">ftp.\2.\3</a>", "\1<a href="mailto:\2@\3">\2@\3</a>");
        
return preg_replace($patterns$replacements$text);
    }


par celle-ci :
function makeClickable(&$text)
{
$text ' '.$text;//ajoute un espace avant les données à traiter

//expressions à rechercher dans le contenu
$patterns = array("/(^|[^]_a-z0-9-="'/])([a-z]+?)://([^, rn"()'<>]+)/i", "/(^|[^]_a-z0-9-="'/])www.([a-z0-9-]+).([^, rn"()'<>]+)/i", "/(^|[^]_a-z0-9-="'/])ftp.([a-z0-9-]+).([^, rn"()'<>]+)/i""/(^|[^]_a-z0-9-="'/:.])([a-z0-9-_.]+?)@([^, rn"()'<>[]]+)/i");

//chaînes de remplacement, correspondant aux expressions trouvées ci-dessus
$replacements = array("\1<a href="\2://\3" target="_blank">\2://\3</a>", "\1<a href="http://www.\2.\3" target="_blank">www.\2.\3</a>", "\1<a href="ftp://ftp.\2.\3" target="_blank">ftp.\2.\3</a>", "\1<a href="mailto:\2@\3">\2@\3</a>");

//transforme tous les liens textuels du contenu en liens directement cliquables (http, https, ftp, mailto, www)
$text preg_replace($patterns$replacements$text);

//début du traitement des url trop longues
$links explode('<a'$text);//récupère ce qui correspond à des urls dans le contenu
$countlinks count($links);//effectue un décompte des urls pour la boucle à venir
   
for ($i 0$i $countlinks$i++)
   {
    
$link $links[$i];
    
$link = (preg_match('#(.*)(href=")#is'$link)) ? '<a' $link $link;
    
$begin strpos($link'>') + 1;
    
$end strpos($link'<'$begin);
    
$length $end $begin;
    
$urlname substr($link$begin$length);
    
/*
    * Si l'url fait plus de 50 caractères au total (http:// et autres débuts d'url, y compris).
    * L'url est tronquée à partir du 35ème caractère.
    * Et seuls les 10 derniers caractères sont conservés.
    * [...] est placé entre ces 2 parties d'url
    * S'applique seulement aux liens commençant par 'https://', http://', 'ftp://', 'www.'
    * Si l'url <= 50 caractères, elle est affichée en entier.
    */
    
$maxlength 50//longueur au-delà de laquelle une url sera tronquée
    
$cutlength 35//garde les 35 premiers caractères
    
$endlength = -10//garde les 10 derniers caractères de l'url
    
$middleurl "[...]"//symbole placé pour représenter la partie de l'url manquante
    // on garde donc 45 + [...] caractères pour l'affichage (50 en tout)
    
$chunked = (strlen($urlname) > $maxlength && preg_match('#^(https://|http://|ftp://|www.)#is'$urlname)) ? substr_replace($urlname$middleurl$cutlength$endlength) : $urlname;
    
$text str_replace('>' $urlname '<''>' $chunked '<'$text); 
   }
$text substr($text1);//supprime l'espace ajouté en début de script
return($text);
}


Ce code est largement commenté.
Vous n'aurez que 3 paramètres à changer éventuellement :
$maxlength = 50; //longueur au-delà de laquelle une url sera tronquée
$cutlength = 35; //garde les 35 premiers caractères
$endlength = -10; //garde les 10 derniers caractères de l'url
$middleurl = "[...]"; //symbole placé pour représenter la partie de l'url manquante

Que ce soit dans l'affichage normal, ou dans les citations, l'url devrait être tronquée.

Par contre, en mode édition, vous retrouverez l'url complète ce qui vous permettra de la corriger en cas de besoin.

Une fois ce fichier contenant la nouvelle fonction mis en place, l'affichage de vos urls devrait être pris en compte immédiatement (après un rafraîchissement de la page si vous faites des tests).

Les url ressembleront automatiquement à ceci : https://www.frxoops.org/modules/newb[...]32&forum=5
soit : 35 caractères[...]10 caractères

Je me suis basé sur un bout de code, tiré d'un hack pour wordpress. (je mettrai les crédits dès que j'aurais retrouvé les infos là-dessus).

Merci d'avance pour vos retours !
Propulsé avec XOOPS | Graphisme adapté par Tatane, Grosdunord, Montuy337513

15 Personne(s) en ligne (10 Personne(s) connectée(s) sur Forum) | Utilisateur(s): 0 | Invité(s): 15 | Plus ...