Napisałem dla swoich potrzeb funkcję wyświetlającą menu o głębokości dwóch pozycji (kategoria + podkategoria).
Struktura bazy danych wygląda tak:
id (INT)
super (INT)
label (VARCHAR)
przy czym kategorie nadrzędne mają
id = 0.
Funkcja generuje listę
<ul><li></li></ul>:
<?php
function menu () {
// POBRANIE IDENTYFIKATORA KATEGORII NADRZEDNEJ
$query = "SELECT super FROM categories WHERE id = " . $_GET['cat'];
$super = $row['super'];
}
// POBRANIE WSZYSTKICH NADRZEDNYCH KATEGORII
$query = 'SELECT id, super, label FROM categories WHERE super = 0 ORDER BY label ASC';
// UTWORZENIE LISTY KATEGORII NADRZEDNYCH
$output = '<ul>';
// WYSWIETLENIE PODKATEGORII
if ( ( isset( $_GET['cat'] ) ) && ( is_numeric( $_GET['cat'] ) ) && ( ( $row['id'] == $_GET['cat'] ) || ( $row['id'] == $super ) ) ) { $output .= '<li><a href="?cat=' . $row['id'] . '" class="redb">' . $row['label'] . '</a>';
$query2 = "SELECT COUNT(id) FROM categories WHERE super = " . $row['id'];
if ( $count[0] > 0 ) {
$query2 = 'SELECT id, super, label FROM categories WHERE super = ' . $row['id'] . ' ORDER BY label ASC';
$output .= '<ul>';
$output .= '<li><a href="?cat=' . $row2['id'] . '" class="red">' . $row2['label'] . '</a></li>';
$output .= '</ul>';
}
$output .= '</li>';
} else
$output .= '<li><a href="?cat=' . $row['id'] . '">' . $row['label'] . '</a></li>';
}
$output .= '</ul>';
return $output;
}
?>
Aktualnie wybrana kategoria jest przekazywana poprzez
<?php
$_GET['cat']
?>
.
Macie jakieś pomysły na optymalizację lub zabezpieczenie tej funkcji?W przypadku wyświetlanie podkategorii myślałem o rekurencji, ale odstąpiłem od tego pomysłu z tego względu, że dla potrzeb dwupoziomowego menu tak jest chyba prościej.
Ten post edytował nexis 9.07.2007, 12:38:51