Changeset 100814 in spip-zone


Ignore:
Timestamp:
Dec 3, 2016, 3:25:46 PM (2 years ago)
Author:
cedric@…
Message:

Les URLs arbos sont maintenant capable de gerer plusieurs chemins d'arborescence pour un meme objet

  • lors de la generation en passant un parent dans le $args de l'url (ex id_rubrique=XX pour un article)
  • lors du decodage en acceptant des URLs legitimes sans rediriger en 301 vers l'URL principale

Le code est issu du travail sur le plugin polyhierarchie (r100551 r100811 r100812) mais est ici generique et repose simplement sur l'existence d'une fonction
$url_verifier_parent_objet($type, $id_objet, $type_parent, $id_parent)
chargee de verifier la legitimite d'un parent, sans presuposer de l'implementation
En l'absence de cette fonction, tout fonctionne comme avant, seul le parent direct est accepte et pris en compte dans le calcul des urls arbo

Location:
_core_/plugins/urls_etendues
Files:
2 edited

Legend:

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

    r96023 r100814  
    22        prefix="urls"
    33        categorie="statistique"
    4         version="1.5.9"
     4        version="1.6.0"
    55        etat="stable"
    66        compatibilite="[3.1.0;3.1.*]"
  • _core_/plugins/urls_etendues/urls/arbo.php

    r100813 r100814  
    264264 * @param string $type
    265265 * @param int $id_objet
     266 * @param array $contexte
     267 *   id_parent : rubrique parent
    266268 * @return bool|null|array
    267269 */
    268 function renseigner_url_arbo($type, $id_objet) {
     270function renseigner_url_arbo($type, $id_objet, $contexte = array()) {
    269271        $urls = array();
    270272        $trouver_table = charger_fonction('trouver_table', 'base');
     
    277279        $id_objet = intval($id_objet);
    278280
     281        $id_parent = (isset($contexte['id_parent'])?$contexte['id_parent']:null);
     282
    279283        $champ_titre = $desc['titre'] ? $desc['titre'] : 'titre';
    280284
     
    284288        $order_by_parent = "";
    285289        if ($champ_parent) {
    286                 $sel_parent = ", O." . reset($champ_parent) . ' as parent';
    287                 // trouver l'url qui matche le parent en premier
    288                 $order_by_parent = "O." . reset($champ_parent) . "=U.id_parent DESC, ";
     290                // si un parent est fourni est qu'il est legitime, on recherche une URL pour ce parent
     291                if ($id_parent
     292                        and $type_parent = end($champ_parent)
     293                        and $url_verifier_parent_objet = charger_fonction('url_verifier_parent_objet', 'inc', true)
     294                        and $url_verifier_parent_objet($type, $id_objet, $type_parent, $id_parent)) {
     295                        $sel_parent = ", ".intval($id_parent) . ' as parent';
     296                        // trouver l'url qui matche le parent en premier
     297                        $order_by_parent = "U.id_parent=".intval($id_parent)." DESC, ";
     298                }
     299                // sinon on prend son parent direct fourni par $champ_parent
     300                else {
     301                        $sel_parent = ", O." . reset($champ_parent) . ' as parent';
     302                        // trouver l'url qui matche le parent en premier
     303                        $order_by_parent = "O." . reset($champ_parent) . "=U.id_parent DESC, ";
     304                }
    289305        }
    290306        //  Recuperer une URL propre correspondant a l'objet.
     
    309325 * @param string $type
    310326 * @param int $id_objet
     327 * @param array $contexte
     328 *   id_parent : rubrique parent
    311329 * @return string
    312330 */
    313 function declarer_url_arbo($type, $id_objet) {
     331function declarer_url_arbo($type, $id_objet, $contexte = array()) {
    314332        static $urls = array();
    315333        // utiliser un cache memoire pour aller plus vite
     
    317335                return $C;
    318336        }
     337        ksort($contexte);
     338        $hash = json_encode($contexte);
    319339
    320340        // Se contenter de cette URL si elle existe ;
     
    326346        $modifier_url = (defined('_VAR_URLS') and _VAR_URLS);
    327347
    328         if (!isset($urls[$type][$id_objet]) or $modifier_url) {
    329                 $r = renseigner_url_arbo($type, $id_objet);
     348        if (!isset($urls[$type][$id_objet][$hash]) or $modifier_url) {
     349                $r = renseigner_url_arbo($type, $id_objet, $contexte);
    330350                // Quand $type ne reference pas une table
    331351                if ($r === false) {
     
    334354
    335355                if (!is_null($r)) {
    336                         $urls[$type][$id_objet] = $r;
    337                 }
    338         }
    339 
    340         if (!isset($urls[$type][$id_objet])) {
     356                        $urls[$type][$id_objet][$hash] = $r;
     357                }
     358        }
     359
     360        if (!isset($urls[$type][$id_objet][$hash])) {
    341361                return "";
    342362        } # objet inexistant
    343363
    344         $u = &$urls[$type][$id_objet];
     364        $u = &$urls[$type][$id_objet][$hash];
    345365        $url_propre = $u['url'];
    346366
     
    449469
    450470        // Mode propre
    451         $propre = declarer_url_arbo($type, $id);
     471        $c = array();
     472        $propre = declarer_url_arbo($type, $id, $c);
     473
     474        // si le parent est fourni en contexte dans le $args, verifier si l'URL relative a ce parent est la meme ou non
     475        parse_str($args, $contexte);
     476        $champ_parent = url_arbo_parent($type);
     477        if ($champ_parent
     478          and $champ_parent = reset($champ_parent)
     479          and isset($contexte[$champ_parent]) and $contexte[$champ_parent]) {
     480                $c['id_parent'] = $contexte[$champ_parent];
     481                $propre_contexte = declarer_url_arbo($type, $id, $c);
     482                // si l'URL est differente on la prend et on enleve l'argument de l'URL (redondance puisque parent defini par l'URL elle meme)
     483                if ($propre_contexte !== $propre) {
     484                        $propre = $propre_contexte;
     485                        unset($contexte[$champ_parent]);
     486                        $args = http_build_query($contexte);
     487                }
     488        }
     489
    452490
    453491        if ($propre === false) {
     
    680718                        } else {
    681719                                foreach ($url_arbo_new as $k => $o) {
    682                                         if ($s = declarer_url_arbo($o['objet'], $o['id_objet'])) {
     720                                        // tenir compte de l'eventuel parent vu quand on verifie l'URL, car il peut influer
     721                                        $c = array();
     722                                        if (isset($parents_vus['rubrique'])) {
     723                                                $c['id_parent'] = $parents_vus['rubrique'];
     724                                        }
     725                                        if ($s = declarer_url_arbo($o['objet'], $o['id_objet'], $c)) {
    683726                                                $url_arbo_new[$k] = $s;
    684727                                        } else {
Note: See TracChangeset for help on using the changeset viewer.