Changeset 100844 in spip-zone


Ignore:
Timestamp:
Dec 4, 2016, 12:12:16 PM (3 years ago)
Author:
cedric@…
Message:

Les URLs arbos savent gerer le multilinguisme avec le parametre de configuration _url_arbo_multilang

peut prendre plusieurs valeurs :

  • false pour ne pas gerer le multilinguisme => fonctionnement historique par defaut

define('_url_arbo_multilang',false);

  • la valeur d'une langue pour forcer le calcul des URLs dans une langue donnee

define('_url_arbo_multilang','en');

  • true pour forcer la gestion complete du multilinguisme : calcul des URLs dans toutes les langues utilisees par le site, ajout d'un premier segment dans les URLs pour definir la langue (ex : fr/) prise en compte de l'argument lang=xx dans $args au moment de generer l'URL

define('_url_arbo_multilang',true);

Il me semble que ca marche dans tous les cas, mais ca merite du test intensif

Location:
_core_/plugins/urls_etendues
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _core_/plugins/urls_etendues/paquet.xml

    r100835 r100844  
    22        prefix="urls"
    33        categorie="statistique"
    4         version="2.0.0"
     4        version="2.1.0"
    55        etat="stable"
    66        compatibilite="[3.1.0;3.1.*]"
  • _core_/plugins/urls_etendues/urls/arbo.php

    r100837 r100844  
    110110        define('_url_sep_id', _url_arbo_sep_id);
    111111}
     112
     113// peut prendre plusieurs valeurs :
     114// - false pour ne pas gerer le multilinguisme => fonctionnement historique
     115//    define('_url_arbo_multilang',false);
     116// - la valeur d'une langue pour forcer le calcul des URLs dans une langue donnee
     117//    define('_url_arbo_multilang','en');
     118// - true pour forcer la gestion complete du multilinguisme :
     119//   calcul des URLs dans toutes les langues possibles,
     120//   ajout d'un premier segment fr/ dans les URLs pour definir la langue
     121//   prise en compte de l'argument lang=xx dans $args au moment de generer l'URL
     122//    define('_url_arbo_multilang',true);
     123
     124if (!defined('_url_arbo_multilang')) {
     125        define('_url_arbo_multilang',false);
     126}
     127
    112128
    113129// Ces chaines servaient de marqueurs a l'epoque ou les URL propres devaient
     
    342358 * @param array $contexte
    343359 *   id_parent : rubrique parent
     360 *   langue : langue courante pour laquelle on veut l'URL
    344361 * @return string
    345362 */
     
    349366        if (!is_null($C = Cache())) {
    350367                return $C;
     368        }
     369        // contexte de langue si pas defini, en fonction de la configuration
     370        if (!isset($contexte['langue'])) {
     371                if (!_url_arbo_multilang) {
     372                        $contexte['langue'] = '';
     373                }
     374                elseif (_url_arbo_multilang === true) {
     375                        $contexte['langue'] = $GLOBALS['spip_lang'];
     376                }
     377                else {
     378                        $contexte['langue'] = _url_arbo_multilang;
     379                }
    351380        }
    352381        ksort($contexte);
     
    395424        $url = $url_propre;
    396425        if (is_null($url_propre) or ($modifier_url and !$u['perma'])) {
    397                 $url = pipeline('arbo_creer_chaine_url',
    398                         array(
    399                                 'data' => $url_propre,  // le vieux url_propre
    400                                 'objet' => array_merge($u, array('type' => $type, 'id_objet' => $id_objet)
    401                                 )
    402                         )
    403                 );
    404 
    405                 // Eviter de tamponner les URLs a l'ancienne (cas d'un article
    406                 // intitule "auteur2")
     426
     427                $langues = array();
     428                if (_url_arbo_multilang === true) {
     429                        include_spip('inc/lang');
     430                        $langues = (isset($GLOBALS['meta']['langues_utilisees'])?$GLOBALS['meta']['langues_utilisees']:'');
     431                        $langues = explode(',',$langues);
     432                        if ($k = array_search(_LANGUE_PAR_DEFAUT, $langues)) {
     433                                unset($langues[$k]);
     434                                array_unshift($langues, _LANGUE_PAR_DEFAUT);
     435                        }
     436                }
     437                if (!in_array($contexte['langue'], $langues)) {
     438                        $langues[] = $contexte['langue'];
     439                }
     440
     441                // on calcule l'URL de chaque langue utile (langue courante, langue forcee ou toutes les langues utilises)
     442                $urls = array();
     443                $langue_courante = $GLOBALS['spip_lang'];
     444
    407445                include_spip('inc/urls');
    408446                $objets = urls_liste_objets();
    409                 if (preg_match(',^(' . $objets . ')[0-9]*$,', $url, $r)
    410                         and $r[1] != $type
    411                 ) {
    412                         $url = $url . _url_arbo_sep_id . $id_objet;
    413                 }
     447
     448                foreach($langues as $l) {
     449                        if ($l) {
     450                                changer_langue($l);
     451                        }
     452                        $urls[$l] = pipeline('arbo_creer_chaine_url',
     453                                array(
     454                                        'data' => $url_propre,  // le vieux url_propre
     455                                        'objet' => array_merge($u, array('type' => $type, 'id_objet' => $id_objet))
     456                                )
     457                        );
     458
     459                        // Eviter de tamponner les URLs a l'ancienne (cas d'un article
     460                        // intitule "auteur2")
     461                        if (preg_match(',^(' . $objets . ')[0-9]*$,', $urls[$l], $r)
     462                                and $r[1] != $type
     463                        ) {
     464                                $urls[$l] = $urls[$l] . _url_arbo_sep_id . $id_objet;
     465                        }
     466
     467                }
     468                // retablir la $langue_courante par securite, au cas ou on a change de langue
     469                changer_langue($langue_courante);
     470
     471                $url = $urls[$contexte['langue']];
    414472        }
    415473
     
    443501        }
    444502
    445         $set = array(
    446                 'url' => $url,
    447                 'type' => $type,
    448                 'id_objet' => $id_objet,
    449                 'id_parent' => $u['parent'],
    450                 'perma' => intval($u['perma'])
    451         );
     503        // on enregistre toutes les langues
    452504        include_spip('action/editer_url');
    453         if (url_insert($set, $confirmer, _url_arbo_sep_id)) {
    454                 $u['url'] = $set['url'];
    455                 $u['id_parent'] = $set['id_parent'];
    456         } else {
    457                 // l'insertion a echoue,
    458                 //serveur out ? retourner au mieux
    459                 $u['url'] = $url_propre;
     505        foreach($urls as $langue => $url) {
     506                $set = array(
     507                        'url' => $url,
     508                        'type' => $type,
     509                        'id_objet' => $id_objet,
     510                        'id_parent' => $u['parent'],
     511                        'langue' => $langue,
     512                        'perma' => intval($u['perma'])
     513                );
     514                $res = url_insert($set, $confirmer, _url_arbo_sep_id);
     515                if ($langue == $contexte['langue']) {
     516                        if ($res) {
     517                                $u['url'] = $set['url'];
     518                                $u['id_parent'] = $set['id_parent'];
     519                        } else {
     520                                // l'insertion a echoue,
     521                                //serveur out ? retourner au mieux
     522                                $u['url'] = $url_propre;
     523                        }
     524                }
    460525        }
    461526
     
    483548        }
    484549
     550        $debut_langue = '';
     551
    485552        // Mode propre
    486553        $c = array();
     554
     555        parse_str($args, $contexte);
     556        // choisir le contexte de langue en fonction de la configuration
     557        $c['langue'] = '';
     558        if (_url_arbo_multilang === true) {
     559                if (isset($contexte['lang']) and $contexte['lang']) {
     560                        $c['langue'] = $contexte['lang'];
     561                        $debut_langue = $c['langue'] .'/';
     562                        unset($contexte['lang']);
     563                        $args = http_build_query($contexte);
     564                }
     565                elseif(isset($GLOBALS['spip_lang']) and $GLOBALS['spip_lang']) {
     566                        $c['langue'] = $GLOBALS['spip_lang'];
     567                        $debut_langue = $c['langue'] .'/';
     568                }
     569        }
     570        elseif (_url_arbo_multilang){
     571                $c['langue'] = _url_arbo_multilang;
     572        }
    487573        $propre = declarer_url_arbo($type, $id, $c);
    488574
    489575        // si le parent est fourni en contexte dans le $args, verifier si l'URL relative a ce parent est la meme ou non
    490         parse_str($args, $contexte);
    491576        $champ_parent = url_arbo_parent($type);
    492577        if ($champ_parent
     
    510595        if ($propre) {
    511596                $url = _debut_urls_arbo
     597                        . $debut_langue
    512598                        . rtrim($propre, '/')
    513599                        . url_arbo_terminaison($type);
     
    560646        if (is_array($args)) {
    561647                $contexte = $args;
     648                $args = http_build_query($contexte);
    562649        } else {
    563650                parse_str($args, $contexte);
     
    638725                $dernier_parent_vu = false;
    639726                $objet_segments = 0;
     727
     728                $langue = '';
     729                if (_url_arbo_multilang === true) {
     730                        // la langue : si fourni en QS prioritaire car vient du skel ou de forcer_lang
     731                        if (isset($contexte['lang'])) {
     732                                $langue = $contexte['lang'];
     733                        }
     734                        // le premier segment peut etre la langue : l'extraire
     735                        // on le prend en compte si lang non fournie par la QS sinon on l'ignore
     736                        include_spip('action/editer_url'); // pour url_verifier_langue
     737                        if (count($url_arbo) > 1
     738                                and $first = reset($url_arbo)
     739                          and url_verifier_langue($first)) {
     740                                array_shift($url_arbo);
     741                                if (!$langue) {
     742                                        $contexte['lang'] = $langue = $first;
     743                                }
     744                        }
     745                }
     746                elseif(_url_arbo_multilang) {
     747                        $langue = _url_arbo_multilang;
     748                }
     749
    640750                while (count($url_arbo) > 0) {
    641751                        $type = null;
     
    658768                                        : sql_in('url', array("$type/$url_segment", $type)),
    659769                                '',
    660                                 // en priorite celui qui a le bon parent et les deux segments
    661                                 // puis le bon parent avec 1 segment
    662                                 // puis un parent indefini (le 0 de preference) et les deux segments
    663                                 // puis un parent indefini (le 0 de preference) et 1 segment
    664                                 (intval($cp) ? "id_parent=" . intval($cp) . " DESC, " : "id_parent>=0 DESC, ") . "segments DESC, id_parent"
     770                                // en priorite celui qui a le bon parent
     771                                // puis la bonne langue puis la langue ''
     772                                // puis les deux segments puis 1 seul segment
     773                          //
     774                                // si parent indefini on privilegie id_parent=0 avec la derniere clause du order
     775                                (intval($cp) ? "id_parent=" . intval($cp) . " DESC, " : "id_parent>=0 DESC, ")
     776                                . ($langue?'langue='.sql_quote($langue).' DESC, ':'') ."langue='' DESC,"
     777                                . "segments DESC, id_parent"
    665778                        );
    666779                        if ($row) {
     
    724837                                include_spip('inc/filtres_mini');
    725838                                $col_id = id_table_objet($entite);
    726                                 $url_new = generer_url_entite($contexte[$col_id], $entite);
     839                                $url_new = generer_url_entite($contexte[$col_id], $entite, $args);
    727840                                // securite contre redirection infinie
    728841                                if ($url_new !== $url_propre
     
    733846                        } else {
    734847                                foreach ($url_arbo_new as $k => $o) {
    735                                         // tenir compte de l'eventuel parent vu quand on verifie l'URL, car il peut influer
    736                                         $c = array();
     848                                        $c = array( 'langue' => $langue );
    737849                                        if (isset($parents_vus['rubrique'])) {
    738850                                                $c['id_parent'] = $parents_vus['rubrique'];
     
    745857                                }
    746858                                $url_arbo_new = ltrim(implode('/', $url_arbo_new), '/');
    747 
     859                                if ($langue and _url_arbo_multilang === true) {
     860                                        $url_arbo_new = "$langue/" . $url_arbo_new;
     861                                        if (strpos($args,'lang=') !== false) {
     862                                                parse_str($args, $cl);
     863                                                unset($cl['lang']);
     864                                                $args = http_build_query($cl);
     865                                        }
     866                                }
    748867                                if ($url_arbo_new !== $url_propre) {
    749                                         $url_redirect = $url_arbo_new;
     868                                        //var_dump($url_arbo_new,$url_propre);
     869                                        $url_redirect = _debut_urls_arbo
     870                                                . $url_arbo_new
     871                                                . url_arbo_terminaison($entite)
     872                                                . ($args?"?$args":'');
    750873                                        // en absolue, car assembler ne gere pas ce cas particulier
    751874                                        include_spip('inc/filtres_mini');
Note: See TracChangeset for help on using the changeset viewer.