Forum CMS Made Simple FR

Version complète : (résolu) Ré-écriture URL des catégories du module news : pb d'accents
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.

vincentj

Citation :#~~~~~ DEBUT BLOC A NE PAS SUPPRIMER ~~~~~
#~ Version du CMS: -1.9.4.3
#~ Url du site :
#~ Hébergeur / Soft : OVH mutualisé
#~ Informations Système :
#~~~~~ FIN BLOC A NE PAS SUPPRIMER ~~~~~



Bonjour à tous,


J'ai suivi un post du forum anglais concernant la ré-écriture des catégories des news : lien.

Le principe est de créer une balise utilisateur : news_category_url, puis de modifier le template d'affichage et le htacces.


Cela fonctionne super bien à l'exception de la gestion des accents dans les URL's, ils sont systématiquement retiré.

N'étant pas spécialiste de php je pense que le soucis vient de la balise utilisateur :

$name = preg_replace(array("/ /", "/[^A-Za-z0-9-\-]/", "/--/"),array("-", "", "-"),$params['name']);
$id = $params['id'];
echo '/conseils/categorie/'.$id.'/'.$name';


Je précise que la réécriture des titres des news fonctionne sans problème.

Je vous remercie d'avance pour vos lumières.
Bonjour,

Une url ne peut pas contenir de caractères spéciaux comme des accents.

Si tu parles du sujet de Viebig (le forum anglais est out pour l'instant) et du post spécifique de Jeremy Bass, ce problème avait été évoqué. Jeremy est anglophone...

Tu pourrais également lire ce post : http://www.cmsmadesimple.fr/forum/viewtopic.php?id=1457

Si tu désires absolument conserver ta méthode, tu peux ajouter une ligne de code avec strtr(), ce qui remplacera le caractère accentué par son correspondant non accentué :
Code :
$name = strtr($params['name'],'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ',
'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY');
$name = preg_replace(array("/ /", "/[^A-Za-z0-9-\-]/", "/--/"),array("-", "", "-"),$name);
$id = $params['id'];
echo '/conseils/categorie/'.$id.'/'.$name';
je confirme : pas d'accent dans les urls, c'est moche, c'est inutile et c'est foireux (exemple : copies une url avec des accents, colles la ligne dans un notepad++ , regardes le résultat, pleures)

vincentj

Merci pour ta réponse cela m'a indiqué la direction à suivre et après quelques recherches il apparait que strtr() n'est pas le plus approprié avec UTF-8 il vaut mieux utiliser utiliser str_replace() ce qui donne pour mon cas (uniquement le remplacement de minuscules) :


Code :
$name = str_replace(
        array(
            'à', 'â', 'ä', 'á', 'ã', 'å',
            'î', 'ï', 'ì', 'í',
            'ô', 'ö', 'ò', 'ó', 'õ', 'ø',
            'ù', 'û', 'ü', 'ú',
            'é', 'è', 'ê', 'ë',
            'ç', 'ÿ', 'ñ',
        ),
        array(
            'a', 'a', 'a', 'a', 'a', 'a',
            'i', 'i', 'i', 'i',
            'o', 'o', 'o', 'o', 'o', 'o',
            'u', 'u', 'u', 'u',
            'e', 'e', 'e', 'e',
            'c', 'y', 'n',
        ),
      $params['name']
    );
$name = preg_replace(array("/ /", "/[^A-Za-z0-9-\-]/", "/--/"),array("-", "", "-"),$name);
$id = $params['id'];
echo '/conseils/categorie/'.$id.'/'.$name';
Si tu mets la version de ton cmsms à jour, il y a un champ url dans la page de création de l'article.
Le rédacteur devra cependant utiliser des caractères non interdits en attendant un update : http://dev.cmsmadesimple.org/bug/view/2391
Sinon, et à tes risques et périls (il n'est pas recommandé de modifier un fichier core), tu peux ajouter ces deux lignes de code dans les fichiers modules/News/action.addarticle.php et action.editarticle.php (lignes 111 et 121) :
Code :
if( empty($error) && $news_url != '' )
      {
    //Attention lors de l'update
    //suppression des espaces en début et fin de chaîne de caractères
        //conversion des espaces internes en tiret
        //conversion des caractères interdits dans l'url
    $news_url = iconv('UTF-8', 'ASCII//TRANSLIT', trim($news_url));
    $news_url = preg_replace(array("/ /", "/[^A-Za-z0-9-\-]/", "/--/"),array("-", "", "-"),$news_url);
        // check for starting or ending slashes
    if( startswith($news_url,'/') || endswith($news_url,'/') )
      {
        $error = $this->Lang('error_invalidurl');
      }