Ignore:
Timestamp:
Jun 21, 2011, 9:49:59 PM (10 years ago)
Author:
cedric@…
Message:

optimiser le code :

  • eviter 2 requetes sur la meme rubrique quand on s'apprete a appeler l'heritage
  • remplacer une recursivite par un while dans la recherche d'heritage
  • eviter de recalculer la liste de toutes les compos a chaque remontee d'heritage
  • une static pour ne pas recalculer une meme compo deux fois dans le hit
File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/compositions/compositions_fonctions.php

    r48979 r48981  
    173173 */
    174174function compositions_determiner($type, $id, $serveur='', $etoile = false){
     175        static $composition = array();
     176
     177        if (isset($composition[$etoile][$serveur][$type][$id]))
     178                return $composition[$etoile][$serveur][$type][$id];
     179
    175180        include_spip('base/abstract_sql');
    176181        $table = table_objet($type);
     
    183188        $desc = $trouver_table($table,$serveur);
    184189        if (isset($desc['field']['composition']) AND $id){
    185                 $composition = sql_getfetsel('composition', $table_sql, "$_id_table=".intval($id), '', '', '', '', $serveur);
    186                 if ($composition != '')
    187                         $retour = $composition;
    188                 elseif (!$etoile AND isset($desc['field']['id_rubrique'])) {
    189                         $_id_rubrique = ($type == 'rubrique') ? 'id_parent' : 'id_rubrique';
    190                         $id_rubrique = sql_getfetsel($_id_rubrique,$table_sql,"$_id_table=".intval($id),'','','','',$serveur);
    191                         $retour = compositions_heriter($type, $id_rubrique, $serveur);
    192                 }
    193                 else
    194                         $retour = '';
    195         }
    196         return ($retour == '-') ? '' : $retour;
     190                $select = "composition";
     191                if (isset($desc['field']['id_rubrique']))
     192                        $select .= "," . (($type == 'rubrique') ? 'id_parent' : 'id_rubrique as id_parent');
     193                $row = sql_fetsel($select, $table_sql, "$_id_table=".intval($id), '', '', '', '', $serveur);
     194                if ($row['composition'] != '')
     195                        $retour = $row['composition'];
     196                elseif (!$etoile
     197                  AND isset($row['id_parent'])
     198                  AND $row['id_parent'])
     199                        $retour = compositions_heriter($type, $row['id_parent'], $serveur);
     200        }
     201        return $composition[$etoile][$serveur][$type][$id] = (($retour == '-') ? '' : $retour);
    197202}
    198203
     
    208213        if ($type=='syndic') $type='site'; //grml
    209214        if (intval($id_rubrique) < 1) return '';
    210         if($infos_rubrique = sql_fetsel(array('id_parent','composition'),'spip_rubriques','id_rubrique='.intval($id_rubrique),'','','','',$serveur)) {
    211                 if (
    212                         $infos_rubrique['composition'] != ''
    213                         AND $infos = compositions_lister_disponibles('rubrique')
    214                         AND isset($infos['rubrique'][$infos_rubrique['composition']])
    215                         AND isset($infos['rubrique'][$infos_rubrique['composition']]['branche'])
    216                         AND isset($infos['rubrique'][$infos_rubrique['composition']]['branche'][$type])
    217                         )
    218                         return $infos['rubrique'][$infos_rubrique['composition']]['branche'][$type];
    219                 else
    220                         return compositions_heriter($type, $infos_rubrique['id_parent'],$serveur);
    221         }
     215        $infos = null;
     216        $id_parent = $id_rubrique;
     217        do {
     218                $row = sql_fetsel(array('id_parent','composition'),'spip_rubriques','id_rubrique='.intval($id_parent),'','','','',$serveur);
     219                if (strlen($row['composition']) AND is_null($infos))
     220                        $infos = compositions_lister_disponibles('rubrique');
     221        }
     222        while ($id_parent = $row['id_parent']
     223                AND
     224                (!strlen($row['composition']) OR !isset($infos['rubrique'][$row['composition']]['branche'][$type])));
     225
     226        if (strlen($row['composition']) AND isset($infos['rubrique'][$row['composition']]['branche'][$type]))
     227                return $infos['rubrique'][$row['composition']]['branche'][$type];
     228
    222229        return '';
    223230}
     
    255262                // ne declencher l'usine a gaz que si composition est vide ...
    256263                if ($_composition)
    257                         $p->code = "((\$zc=$_composition)?\$zc:".$p->code.")";
     264                        $p->code = "((\$zc=$_composition)?(\$zc=='-'?'':\$zc):".$p->code.")";
    258265        }
    259266        return $p;
Note: See TracChangeset for help on using the changeset viewer.