Changeset 103909 in spip-zone


Ignore:
Timestamp:
Apr 11, 2017, 10:13:56 AM (2 years ago)
Author:
marcimat@…
Message:

On tente de corriger un problème de calcul de l'objet à afficher à partir d’une URL dans des cas où
une un article a la même URL (hors rubrique de langue) dans 2 langues différentes, par exemple lorsqu'on
a un article "contact" dans la rubrique FR et dans la rubrique EN. En URLs arborescentes standard, on obtient
les URLs 'fr/contact' et 'en/contact' et il est donc possible de discriminer l’article en fonction de sa rubrique
parente qui est présente dans l’URL. Avec ce plugin par contre, on a 'domaine.fr/contact' et 'domaine.en/contact',
et l'URL reçue à analyser est simplement 'contact' (avec l'environnement 'lang=fr' ou 'lang=en' renseigné).
Les URLs arbos ne sont pas capables de déduire quel article 'contact' est à utiliser car la rubrique n'est pas indiqué dans l’URL.

On modifie du coup, pour les cas où il n’y a aucun / dans l’URL (considérant que c'est un article ou une rubrique), l'appel
au calcul de l’objet par les urls arborescentes, en préfixant la langue fr/ ou en/ . Ce faisant, les urls arborestentes trouvent bien
l’article correct, mais veulent rediriger sur sa véritable URL du coup (ie: 'domaine.fr/contact' et pas 'fr/contact' qu'on lui envoie
grosso modo). On annule la redirection si cette redirection est l'URL sur laquelle on arrivait effectivement.

Il faudrait trouver mieux comme solution tout de même. En 3.2 il pourrait être sage, par exemple, d'utiliser le champ 'langue' de spip_urls,
et de générer des URLs de langue pour toute la branche article/rubrique d’une langue automatiquement par défaut. On pourrait
ainsi utiliser ce champ 'langue' pour départager 2 urls identiques lorsqu'on a la langue dans l'environnement comme ici.

Au passage, on corrige un autre bug : return urls_arbo_dist($i, $entite, $args = , $ancre = );
Ce return écrasait $args et $ancre (copié collé !). C'était pas malin.

Location:
_plugins_/domlang/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/domlang/trunk/domlang_options.php

    r103012 r103909  
    162162                if ($lang !== $GLOBALS['spip_lang']) {
    163163                        $url = generer_url_entite($id, $type, $args, $ancre . $marqueur_passage, true);
    164                         $url = str_replace($marqueur_passage, '', $url);
     164                        if ($ancre) {
     165                                $url = str_replace($marqueur_passage, '', $url);
     166                        } else {
     167                                $url = str_replace('#' . $marqueur_passage, '', $url);
     168                        }
    165169                        $url = url_absolue($url, domlang_url_langue($lang));
    166170                        return $url;
  • _plugins_/domlang/trunk/paquet.xml

    r103014 r103909  
    22        prefix="domlang"
    33        categorie="navigation"
    4         version="1.0.0"
     4        version="1.0.1"
    55        etat="test"
    66        compatibilite="[3.1.0;3.2.*]"
  • _plugins_/domlang/trunk/urls/arbodom.php

    r103013 r103909  
    4242                return _generer_url_arbodom($entite, $i, $args, $ancre);
    4343        }
    44         return urls_arbo_dist($i, $entite, $args = '', $ancre = '');
     44
     45        // HACK pour distinguer 2 urls qui collisionnent.
     46        // Normalement en url arborescentes, on aurait 'fr/contact' et 'en/contact'.
     47        // Avec ces urls arbodom on a 'domaine.fr/contact' et 'domaine.en/contact',
     48        // et ici le nom 'contact' n'a du coup pas de parent associé pour retrouver à quelle URL
     49        // il appartient. En 3.2 on pourra peut être tenter d'utiliser le champ 'langue' de spip_urls
     50        // pour retrouver le parent…
     51
     52        // Ici, on considère que si l'URL demandé n'a pas de / , c'est que c'est un article ou une rubrique
     53        // à la racine d'une rubrique de langue. On prefixe de la langue pour calculer l'URL normalement
     54        // par les urls arborescentes. Sauf que comme on envoie avec une url 'différente' de celle en cours,
     55        // les urls arbos considère que l'url envoyée n'est pas la plus à jour et demandent une redirection.
     56        // Il faut annuler la redirection dans ce cas.
     57
     58        // Y a encore quelques points à améliorer donc… car si on objet éditorial autre que rubrique / article
     59        // utilise des urls arborescentes sans le type en préfixe (ie: 'toto' à la place de 'mot/toto' par exemple)
     60        // alors ce hack plantera.
     61        $contexte = $args;
     62        $change = false;
     63        $i2 = $i;
     64        if (is_string($contexte)) {
     65                parse_str($contexte, $contexte);
     66        }
     67        if (!empty($args['lang']) and strpos($i, '/') === false) {
     68                $i2 = $args['lang'] . '/' . $i;
     69                $change = true;
     70        }
     71        $res = urls_arbo_dist($i2, $entite, $args, $ancre);
     72        // s'il y a une redirection vers nous-même (l'url en cours)
     73        // c'est que… bah c'était en fait la bonne url (sans le fr/ qu'on a ajouté)
     74        if ($change and !empty($res[2])) {
     75                $url_propre = preg_replace(',[?].*,', '', $i);
     76                if (url_de_base() . $url_propre == $res[2]) {
     77                        $res[2] = null;
     78                }
     79        }
     80        return $res;
    4581}
    4682
     
    215251                'id_objet' => $id_objet,
    216252                'id_parent' => $urls[$type][$id_objet]['parent'],
    217                 'perma' => intval($urls[$type][$id_objet]['perma'])
     253                'perma' => intval($urls[$type][$id_objet]['perma']),
    218254        );
    219255        include_spip('action/editer_url');
Note: See TracChangeset for help on using the changeset viewer.