diff --git a/ecrire/exec/menu_rubriques.php b/ecrire/exec/menu_rubriques.php index 42a1c8b8b5127b1b0dbc9b9a62c4a2a1c4d9273a..40c544bf6c5eac8436f3dc2aa343afac6e2019f5 100644 --- a/ecrire/exec/menu_rubriques.php +++ b/ecrire/exec/menu_rubriques.php @@ -23,46 +23,49 @@ function exec_menu_rubriques_dist() { if ($date = intval(_request('date'))) header("Last-Modified: ".gmdate("D, d M Y H:i:s", $date)." GMT"); - if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) + $r = gen_liste_rubriques(); + if (!$r + AND isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) AND !strstr($_SERVER['SERVER_SOFTWARE'],'IIS/')) { include_spip('inc/headers'); header('Content-Type: text/html; charset='. $GLOBALS['meta']['charset']); http_status(304); - } else { - - $largeur_t = ($spip_ecran == "large") ? 900 : 650; - gen_liste_rubriques(); - $arr_low = extraire_article(0); - - $total_lignes = $i = sizeof($arr_low); - $ret = ''; - - if ($i > 0) { - $nb_col = min(8,ceil($total_lignes / 30)); - if ($nb_col <= 1) $nb_col = ceil($total_lignes / 10); - $max_lignes = ceil($total_lignes / $nb_col); - $largeur = min(200, ceil($largeur_t / $nb_col)); - $count_lignes = 0; - $style = " style='z-index: 0; vertical-align: top;'"; - $image = " petit-secteur"; - foreach( $arr_low as $id_rubrique => $titre_rubrique) { - if ($count_lignes == $max_lignes) { - $count_lignes = 0; - $ret .= "</div></td>\n<td$style><div class='bandeau_rubriques'>"; + } else { + + $largeur_t = ($spip_ecran == "large") ? 900 : 650; + + $arr_low = extraire_article(0, $GLOBALS['db_art_cache']); + + $total_lignes = $i = sizeof($arr_low); + $ret = ''; + + if ($i > 0) { + $nb_col = min(8,ceil($total_lignes / 30)); + if ($nb_col <= 1) $nb_col = ceil($total_lignes / 10); + $max_lignes = ceil($total_lignes / $nb_col); + $largeur = min(200, ceil($largeur_t / $nb_col)); + $count_lignes = 0; + $style = " style='z-index: 0; vertical-align: top;'"; + $image = " petit-secteur"; + foreach( $arr_low as $id_rubrique => $titre_rubrique) { + if ($count_lignes == $max_lignes) { + $count_lignes = 0; + + $ret .= "</div></td>\n<td$style><div class='bandeau_rubriques'>"; + } + $count_lignes ++; + if (autoriser('voir','rubrique',$id_rubrique)){ + $ret .= bandeau_rubrique($id_rubrique, $titre_rubrique, $i, $largeur, $image); + $i--; + } } - $count_lignes ++; - if (autoriser('voir','rubrique',$id_rubrique)){ - $ret .= bandeau_rubrique($id_rubrique, $titre_rubrique, $i, $largeur, $image); - $i--; - } - } - $ret = "<table><tr>\n<td$style><div class='bandeau_rubriques'>" - . $ret - . "\n</div></td></tr></table>\n"; - } + $ret = "<table><tr>\n<td$style><div class='bandeau_rubriques'>" + . $ret + . "\n</div></td></tr></table>\n"; + } - ajax_retour("<div> </div>" . $ret); + ajax_retour("<div> </div>" . $ret); } } @@ -87,7 +90,7 @@ function bandeau_rubrique($id_rubrique, $titre_rubrique, $zdecal, $largeur, $ima return "\n<div>$nav</div>"; } - $arr_rub = extraire_article($id_rubrique); + $arr_rub = extraire_article($id_rubrique, $GLOBALS['db_art_cache']); $i = sizeof($arr_rub); if (!$i) { $zmax++; @@ -150,51 +153,50 @@ function bandeau_rubrique($id_rubrique, $titre_rubrique, $zdecal, $largeur, $ima } - // http://doc.spip.org/@extraire_article -function extraire_article($id_p) { - if (array_key_exists($id_p, $GLOBALS['db_art_cache'])) { - return $GLOBALS['db_art_cache'][$id_p]; - } else { - return array(); - } +function extraire_article($id_p, $t) { + return array_key_exists($id_p, $t) ? $t[$id_p]: array(); } // http://doc.spip.org/@gen_liste_rubriques function gen_liste_rubriques() { // ici, un petit fichier cache ne fait pas de mal - if (lire_fichier(_CACHE_RUBRIQUES, $cache) - AND list($date,$GLOBALS['db_art_cache']) = @unserialize($cache) - AND $date == $GLOBALS['meta']["date_calcul_rubriques"]) - return; // c'etait en cache :-) - + $last = $GLOBALS['meta']["date_calcul_rubriques"]; + if (lire_fichier(_CACHE_RUBRIQUES, $cache)) { + list($date,$GLOBALS['db_art_cache']) = @unserialize($cache); + if ($date == $last) return false; // c'etait en cache :-) + } // se restreindre aux rubriques utilisees recemment +secteurs - $liste=array(0); //$liste="0"; - $s = sql_select("id_rubrique", "spip_rubriques", "", "", "id_parent=0 DESC, date DESC", 500); - while ($t = sql_fetch($s)) - $liste[] = $t['id_rubrique']; //$liste .=",".$t['id_rubrique']; - $liste = join(',',$liste); - $res = sql_select("id_rubrique, titre, id_parent", "spip_rubriques", "id_rubrique IN ($liste)",'', 'id_parent,0+titre,titre'); - - // il ne faut pas filtrer le autoriser voir ici car on met le resultat en cache, commun a tout le monde + + $where = gen_sql_in("id_rubrique", "spip_rubriques", "", "", "id_parent=0 DESC, date DESC", _CACHE_RUBRIQUES_MAX); + + // puis refaire la requete pour avoir l'ordre alphabetique + + $res = sql_select("id_rubrique, titre, id_parent", "spip_rubriques", $where, '', 'id_parent, 0+titre, titre'); + + // il ne faut pas filtrer le autoriser voir ici + // car on met le resultat en cache, commun a tout le monde $GLOBALS['db_art_cache'] = array(); - if (sql_count($res) > 0) { - while ($row = sql_fetch($res)) { - $id = $row['id_rubrique']; - $parent = $row['id_parent']; - $GLOBALS['db_art_cache'][$parent][$id] = - supprimer_numero(typo(sinon($row['titre'], _T('ecrire:info_sans_titre')))); - } + while ($r = sql_fetch($res)) { + $t = sinon($r['titre'], _T('ecrire:info_sans_titre')); + $GLOBALS['db_art_cache'][$r['id_parent']][$r['id_rubrique']] = supprimer_numero(typo($t)); } - // ecrire dans le cache - ecrire_fichier(_CACHE_RUBRIQUES, - serialize(array( - $GLOBALS['meta']["date_calcul_rubriques"], - $GLOBALS['db_art_cache'] - )) - ); + $t = array($last, $GLOBALS['db_art_cache']); + ecrire_fichier(_CACHE_RUBRIQUES, serialize($t)); + return true; } +// Cette fonction devrait s'integrer dans base/abstract, +// car en fait elle palie l'absence de requete imbriquee dans certains SQL + +function gen_sql_in($select, $from = array(), $where = array(), + $groupby = array(), $orderby = array(), $limit = '', $having = array(), $serveur='') +{ + $liste = array(); + $res = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur); + while ($r = sql_fetch($res)) $liste[] = $r[$select]; + return !$liste ? '' : sql_in($select, $liste); +} ?> diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php index 80b95bd44afcfe9447c5960dfff990b8c2e2fe69..9ce924b7103b053f05a3b9474363d040e05708df 100644 --- a/ecrire/inc/utils.php +++ b/ecrire/inc/utils.php @@ -1087,6 +1087,7 @@ function spip_initialisation($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) { define('_AUTH_USER_FILE', '.htpasswd'); define('_SPIP_DUMP', 'dump@nom_site@@stamp@.xml'); define('_CACHE_RUBRIQUES', _DIR_TMP.'menu-rubriques-cache.txt'); + define('_CACHE_RUBRIQUES_MAX', 500); define('_DOCTYPE_ECRIRE', // "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>\n");