Problème de rendu des url

GzygGzyg Membre
24 janv. 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 ?

  • GzygGzyg Membre

    @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 ?

  • P3terP3ter Responsable de PluXml

    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

    Site : p3ter.fr - Twitter : @P3terFr

  • zarkoxzarkox Membre

    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

  • 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) {
    ...
    }
    
  • @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.

  • 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

  • Récupérer le code du post précédent avec ce lien :

    https://gist.github.com/kazimentou/0d4345049ccbeb358a0d207c07ad4c72

  • Si vous savez utiliser git :


  • zarkoxzarkox Membre

    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.

  • P3terP3ter Responsable de PluXml

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

    Site : p3ter.fr - Twitter : @P3terFr

  • 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

  • P3terP3ter Responsable de PluXml

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

    Site : p3ter.fr - Twitter : @P3terFr

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