Changeset 112017 in spip-zone for _plugins_/polyhierarchie


Ignore:
Timestamp:
Oct 17, 2018, 12:32:02 PM (4 months ago)
Author:
cedric@…
Message:

Report de r112016 : Grosse optimisation de la fonction generer_url_polyhier_entite qui parcourait les memes branches encore et encore a chaque appel, d'autant plus qu'un oubli dans r100658 avait fait sauter le test sur id_rubrique non nul, et du coup on parcourait les rubriques depuis la racine a n'en plus finir

Location:
_plugins_/polyhierarchie/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/polyhierarchie/trunk

  • _plugins_/polyhierarchie/trunk/paquet.xml

    r107574 r112017  
    22        prefix="polyhier"
    33        categorie="navigation"
    4         version="3.6.9"
     4        version="3.6.10"
    55        etat="test"
    66        compatibilite="[3.0.0;3.2.*]"
  • _plugins_/polyhierarchie/trunk/polyhier_fonctions.php

    r111845 r112017  
    398398 */
    399399function generer_url_polyhier_entite($id_objet, $objet, $id_rubrique=null, $args='', $ancre='') {
    400 
     400        static $branches = array();
    401401        // si id_rubrique contextuel passe en argument et si c'est bien un parent polyhierarchique
    402         $parents_poly = sql_allfetsel('id_parent','spip_rubriques_liens', 'objet='.sql_quote($objet). ' AND id_objet='.intval($id_objet));
    403         $parents_poly = array_map('reset',$parents_poly);
    404 
    405         $maxiter = 100;
    406         $branche = $r = array($id_rubrique);
    407         while (!($id_parent = array_intersect($parents_poly, $r))
    408           and $maxiter--
    409           and $filles = sql_allfetsel('id_rubrique','spip_rubriques',sql_in('id_parent', $r) . " AND " . sql_in('id_rubrique', $branche, 'NOT'))) {
    410                 $r = array_map('reset', $filles);
    411                 $branche = array_merge($branche, $r);
    412         }
    413 
    414         if ($id_parent = reset($id_parent)) {
    415                 // le vrai parent
    416                 $champ_parent = ($objet == 'rubrique' ? 'id_parent' : 'id_rubrique');
    417                 $args .= ($args?'&':'')."$champ_parent=$id_parent";
     402        if ($id_rubrique = intval($id_rubrique)
     403          and $parents_poly = sql_allfetsel('id_parent','spip_rubriques_liens', 'objet='.sql_quote($objet). ' AND id_objet='.intval($id_objet))){
     404
     405                $parents_poly = array_map('reset', $parents_poly);
     406
     407                $maxiter = 100;
     408                $id_rubrique = intval($id_rubrique);
     409                if (!isset($branches[$id_rubrique])){
     410                        $branches[$id_rubrique] = $id_rubrique;
     411                }
     412                $branche = $branches[$id_rubrique];
     413                $r = explode(',', $branche);
     414                while (!($id_parent = array_intersect($parents_poly, $r))
     415                        and $maxiter--
     416                        and $filles = sql_allfetsel('id_rubrique', 'spip_rubriques', 'id_parent IN (' . implode(',', $r) . ") AND id_rubrique NOT IN ($branche)")){
     417                        $r = array_map('reset', $filles);
     418                        $branche .= ',' . implode(',', $r);
     419                }
     420                $branches[$id_rubrique] = $branche;
     421
     422                if ($id_parent and $id_parent = reset($id_parent)){
     423                        // le vrai parent
     424                        $champ_parent = ($objet=='rubrique' ? 'id_parent' : 'id_rubrique');
     425                        $args .= ($args ? '&' : '') . "$champ_parent=$id_parent";
     426                }
    418427        }
    419428        $url = generer_url_entite($id_objet, $objet, $args, $ancre, true);
Note: See TracChangeset for help on using the changeset viewer.