Problème de rendu des url

GzygGzyg Member
janvier 2020 modifié dans Bogues

PluXml 5.8.1 tout neuf sans modification.

Titre de catégorie, titre d'article ou titre de page : les urls manifestent une mauvaise volonté à s'afficher correctement (à savoir, comme avant) dans certains cas.

Les apostrophes et les lettres accentuées (notamment les accents circonflexes) sont parfois zappées, parfois remplacées par leur équivalent non accentué, parfois (plus bizarre), il manque la lettre suivante !

Les titres longs sont parfois arbitrairement amputés des mots courts : le la un de, etc.

ex1 : "Drôle d'article" devient "dro-darticle" (bizarre)

ex2: "ôôôô ââ îî" devient "ooo aa ii" (correct)

ex3: "Cette île est frêle mais drôle" devient "cette-i-est-fre-mais-dro-" (drôle mais bizarre)

ex4 : "Cet article n'a ni être ni âme" devient "cet-article-n-ni-etre-ni-ame". (presque correct)

Le tout étant parfaitement aléatoire et même changeant en cours d'essais : la page "À propos" a une url qui oscille entre "a-propos" et "-propos"...

Si personne d'autre n'a ce problème, c'est que ça coince sur ma configuration. :)

Réponses

  • Problème d'encodage ?

  • @kowalsky

    Peut-être ? Je suis en utf-8. Clavier fr_FR.

    Mais si c'était le cas, l'erreur serait-elle aléatoire pour les mots manquants et présente pour les seuls accents circonflexes ?

  • HarukaHaruka PluXml Project Manager

    Peut-être un bug au niveau des nouvelles méthodes de plxUtils (v5.8) : transliterrate() et urlify().

    Issue créée : https://github.com/pluxml/PluXml/issues/378

  • Bonjour, je confirme avoir exactement le même problème.

    "Les titres longs sont parfois arbitrairement amputés des mots courts : le la un de, etc."

    Je suis concerné même sur des titres courts.

    je me suis aperçu de ça suite à la mise à jour de PLUXML. D'ailleurs, très bon boulot ! j'adore !!!! et merci pour votre boulot les gars

  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    la, de, le et du sont des articles pour la langue française.

    Comme il en existe pour l'allemand ou l'anglais.

    Par défaut, la fonction plxUtils::urify(..) les supprime pour avoir une url plus simple.

    Si tu veux absolument les conserver, vas dans le fichier core/lib/class.plx.utils.php et vers la ligne n°522, modifie la déclaration de la fonction comme suit pour le paramètre $remove :

    public static function urlify($str, $remove=false, $replace='-', $lower=true) {
    ...
    }
    
  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    @gzyg,

    Dans Ex3 : "Cette île est frêle mais drôle"

    Les lettres accentuées sont interdites dans les urls et remplacées par leurs équivalentes en us-ascii

    Puis les suites de caractères "le" sont considérés comme l'article "le" et sont supprimés par la fonction plxUtils::urify(..).

    C'est vrai que cela parait bizarre mais les expressions régulières (regex) n'ont jamais été bien considérées dans PluXml.

    Le plus simple est de faire le correctif comme dans le post précèdent.

    jpierre@smartteck:~$ php -r '$a="Cette île est frêle mais drôle"; echo preg_replace("@\ble\b@u","", $a) . PHP_EOL;' 
    Cette île est frêle mais drôle
    jpierre@smartteck:~$ php -r '$a="Cette île est frêle mais drôle"; echo preg_replace("@le@u","", $a) . PHP_EOL;' 
    Cette î est frê mais drô
    jpierre@smartteck:~$
    

    En regex \b définit une bordure de mot. \u permet de considérer l'expression en UTF-8.

  • @bazooka07

    "Puis les suites de caractères "le" sont considérés comme l'article "le" et sont supprimés par la fonction plxUtils::urify(..)."

    Que l'article "le" (ou autres) disparaisse de l'url et que les accents soient convertis, c'est courant, mais il m'apparait quand même étrange que des mots entiers soient tronqués si la chaine de caractere est présente, rendant ceux-ci incompréhensible.

  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    Effectivement, il y a quelques bugs.

    Modifier les fonctions suivantes dans le fichier core/admin/class.plx.utils.php, à partir de la ligne 461 comme suit :

       public static function translitterate($str, $reverse=false) {
    
          $alphabets = array(
             'de' => array(
                   'Ä' => 'Ae', 'Ö' => 'Oe', 'Ü' => 'Ue', 'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue',
                   'ß' => 'ss', 'ẞ' => 'SS'
             ),
             'ro' => array(
                   'ă'=> 'a', 'î'=> 'i', 'ș'=> 's', 'ț'=> 't', 'â'=> 'a',
                   'Ă'=> 'A', 'Î'=> 'I', 'Ș'=> 'S', 'Ț'=> 'T', 'Â'=> 'A'
             ),
             'pl' => array(
                   'ą'=> 'a', 'ć'=> 'c', 'ę'=> 'e', 'ł'=> 'l', 'ń'=> 'n', 'ó'=> 'o', 'ś'=> 's',
                   'ź'=> 'z', 'ż'=> 'z',
                   'Ą'=> 'A', 'Ć'=> 'C', 'Ę'=> 'E', 'Ł'=> 'L', 'Ń'=> 'N', 'Ó'=> 'O', 'Ś'=> 'S',
                   'Ź'=> 'Z', 'Ż'=> 'Z'
             ),
             'ru' => array(
                   'а'=> 'a', 'б'=> 'b', 'в'=> 'v', 'г'=> 'g', 'д'=> 'd', 'е'=> 'e', 'ё'=> 'yo',
                   'ж'=> 'zh', 'з'=> 'z', 'и'=> 'i', 'й'=> 'j', 'к'=> 'k', 'л'=> 'l', 'м'=> 'm',
                   'н'=> 'n', 'о'=> 'o', 'п'=> 'p', 'р'=> 'r', 'с'=> 's', 'т'=> 't', 'у'=> 'u',
                   'ф'=> 'f', 'х'=> 'h', 'ц'=> 'c', 'ч'=> 'ch', 'ш'=> 'sh', 'щ'=> 'sh', 'ъ'=> '',
                   'ы'=> 'y', 'ь'=> '', 'э'=> 'e', 'ю'=> 'yu', 'я'=> 'ya',
                   'А'=> 'A', 'Б'=> 'B', 'В'=> 'V', 'Г'=> 'G', 'Д'=> 'D', 'Е'=> 'E', 'Ё'=> 'Yo',
                   'Ж'=> 'Zh', 'З'=> 'Z', 'И'=> 'I', 'Й'=> 'J', 'К'=> 'K', 'Л'=> 'L', 'М'=> 'M',
                   'Н'=> 'N', 'О'=> 'O', 'П'=> 'P', 'Р'=> 'R', 'С'=> 'S', 'Т'=> 'T', 'У'=> 'U',
                   'Ф'=> 'F', 'Х'=> 'H', 'Ц'=> 'C', 'Ч'=> 'Ch', 'Ш'=> 'Sh', 'Щ'=> 'Sh', 'Ъ'=> '',
                   'Ы'=> 'Y', 'Ь'=> '', 'Э'=> 'E', 'Ю'=> 'Yu', 'Я'=> 'Ya'
             )
          );
    
          if(!(defined('PLX_SITE_LANG')) or !array_key_exists(PLX_SITE_LANG, $alphabets)) {
             return $str;
          }
    
          if (!$reverse) {
             return strtr($str, $alphabets[PLX_SITE_LANG]);
          }
    
          arsort($alphabets[PLX_SITE_LANG]); // Hack against str_replace
          return str_replace(
             array_values($alphabets[PLX_SITE_LANG]),
             array_keys($alphabets[PLX_SITE_LANG]),
             $str
          );
       }
    
       /**
       * Method to transform a string in a valid URL using translitteration
       * @param   string   $str      chaine de caractères à contrôler
       * @param   boolean   $remove      retire les mots sans valeur sémantique
       * @param   string   $replace
       * @param   boolean   $lower
       * @return   string            valid URL
       * @author J.P. Pourrez (bazooka07)
       * */
       public static function urlify($str, $remove=true, $replace='-', $lower=true) {
    
          $remove_words = array(
                'en' => 'a|an|as|at|before|but|by|for|from|is|into|in|like|off?|on|onto|per|since|than|the|this|that|to|up|via|with',
                'de' => 'das|der|die|fur|am',
                'fr' => 'a|de?|des|du|en|la|le|une?|vers'
          );
          $clean_str = plxUtils::translitterate(trim(html_entity_decode($str)));
          if($remove && defined('PLX_SITE_LANG') && array_key_exists(PLX_SITE_LANG, $remove_words)) {
             $tmpstr = preg_replace('@\b('.$remove_words[PLX_SITE_LANG].')\b@u', $replace, $clean_str);
             $clean_str = preg_replace('@\s*'.$replace.'(\s*'.$replace.')*\s*@', $replace, $tmpstr);
          }
          # remove accents
          $clean_str = plxUtils::removeAccents($clean_str,PLX_CHARSET);
          # remove whitespace
          $clean_str = preg_replace(
             '@\s+@',
             $replace,
             $clean_str
          );
          # remove non-alphanumeric character
          $clean_str = trim(preg_replace(
             '@[^\w-]@',
             '',
             $clean_str
          ), '-');
          return ($lower) ? strtolower($clean_str) : $clean_str;
       }
    


    Principalement, il manquait un "u" dans l'expression :

    $tmpstr = preg_replace('@\b('.$remove_words[PLX_SITE_LANG].')\b@u', $replace, $clean_str);
    

    Cela donne :

    Drôle d'article => drole-article

    Cette île est frêle mais drôle => cette-ile-est-frele-mais-drole

    Cet article n'a ni être ni âme => cet-article--ni-etre-ni-ame

  • Bonsoir à toutes et tous.

    Merci bazooka07 d'avoir proposé une solution qui fonctionne à merveille ! C'est nickel, j'ai modifié le fichier comme expliqué plus haut et ça fonctionne nickel.


    Encore merci pour ces bons conseils et la rapidité de réponse.

  • HarukaHaruka PluXml Project Manager

    Merci @bazooka07 pour la correction. Je l'ai intégrée à PluXml 6.

  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    Bonjour,

    Le souci est que tout le monde utilise la dernière release 5.8.1.

    Et que d'après les expériences vécues, la prochaine version 6.0 ne sortira pas avant un an.

    C'est pour cela que j'ai fait le pull request sur la version 5.8.1.

    Il aurait mieux valu faire le commit avec cela et publier la version 5.8.2 et rebaser ensuite dessus la version 6.0

  • @P3ter je plussoie la demande de bazooka07

  • HarukaHaruka PluXml Project Manager

    Oui je suis d'accord, je prépare ça ce weekend.

Connectez-vous ou Inscrivez-vous pour répondre.