Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: pasek nawigacyjny
Forum PHP.pl > Forum > PHP
JimX
Witam,

chciałbym wiedzieć jak na php.pl jest zbudowany pasek nawigacyjny na górze, tzn. np. Portal > Aktualności > Tytul newsa..., i jak rozwiązaliście to strategicznie, bo jestem w trakcie budowy czegoś podobnego...
Osoby które też coś takiego mają w swoich systemach też prosiłbym o odpowiedź bo chciałbym stworzyć najbardziej wydajny ten pasek ...

Pozdrawiam,
JimX
Bora
drzewa, masz nawet artykuł o tym
php pro -> początkujący
rzseattle
http://forum.php.pl/viewtopic.php?t=6166&h...&highlight=menu

Przeniesione
rze-X-nik
Ja to rozwiązałem tak: jeżeli masz jakiś dział przekazywany przez pasek adresu, to robisz sobie w bazie czy pliku listę parametrów oraz oddzielasz jakimś separatorem tytuł danego działu. Wtedy przeszukujesz taki plik i znajdujesz odpowiedni id i wywalasz na topbara. Tak samo możesz zrobić dla innych podstron.
splatch
Jest to przykład działający na innej tabeli, ale myślę że może Ci pomóc.
  1. <?php
  2. error_reporting( E_ALL );
  3. $wynik = @mysql_connect('localhost', '****', '*******'); 
  4. if( !$wynik ) die( );
  5.  
  6. if( !@mysql_select_db( 'synergy' ) ) die( );
  7.  
  8.  
  9. function parse_block( $n )
  10. {
  11. return $n .'&nbsp;&gt;&gt;';
  12. }
  13.  
  14. $aNames = array();
  15.  
  16. function select_cat( $kid )
  17. {
  18. global $aNames;
  19.  
  20. $sql = &#092;"SELECT * FROM kategorie WHERE idkat = '$kid' LIMIT 1\";
  21. $res = mysql_query( $sql );
  22.  
  23. if( $row = mysql_fetch_array( $res ) )
  24. {
  25. if( $row['nadrzednakat'] != 0 ) // jesli nie jest nadrzedna szukaj dalej
  26. { //dodaj do stosu
  27. array_push( $aNames, array( $row['nadrzednakat'], select_cat( $row['nadrzednakat'] ) ) );
  28. return $row['nazwakat'];
  29. }
  30. else // kategoria nadrzedna
  31. {
  32. return $row['nazwakat']; // zwroc nazwe
  33. }
  34. }
  35. }
  36.  
  37. $x = select_cat( 136 );
  38.  
  39. echo '<div style=\"background-color: DCDCDC\">';
  40. for( $i = 0; $i < sizeof( $aNames ); $i++ )
  41. {
  42. $id = $aNames[ $i ][0];
  43. $name = $aNames[ $i ][1];
  44. echo &#092;"<a href='index.php?kategoria=$id'>$name</a>&nbsp;<b>-></b>\";
  45. }
  46. echo $x;
  47. ?>
e4you
splatch a jaka struktura tabeli ma byc ?
splatch
Hej odkopuję ten temat po pewnym czasie ponieważ wpadłem na lepsze rozwiązanie.

Oto kod:
  1. <?php
  2. //pobieram wszystkie kategorie dla jezyka polskiego
  3. $sql = &#092;"SELECT * FROM kategoria WHERE przedmiot_id = 1\";
  4. $res = mysql_query( $sql );
  5.  
  6. $t = array();
  7.  
  8. while( $row = mysql_fetch_assoc( $res )){
  9. if( $row['parent_id'] == 0 ) {
  10. $parent[] = $row;
  11. } else {
  12. if( isset( $t[ $row['parent_id'] ] ) ) {
  13. $t[ $row['parent_id'] ][] = $row;
  14. } else {
  15. $t[ $row['parent_id'] ][0] = $row;
  16. }
  17. }
  18. }
  19.  
  20. foreach( $parent as $val ){
  21. echo $val['nazwa'] .'<br />';
  22. if( $t[ $val['id_kategoria'] ] ) {
  23. show( $t[ $val['id_kategoria'] ] );
  24. }
  25. echo '<hr />';
  26. }
  27.  
  28. function show( $arr, $i = 1 ){
  29. global $t;
  30.  
  31. $pre = str_repeat( '+-------', $i );
  32. foreach( $arr as $parent => $val ) {
  33. if( $t[ $val['id_kategoria'] ] ) {
  34. echo $pre.$val['nazwa'] .'<br>';
  35. show( $t[ $val['id_kategoria'] ], ++$i );
  36. } else {
  37. echo $pre.$val['nazwa'] .'<br>';
  38. }
  39. }
  40. }
  41. ?>


Wynik:
Kod
romantyzm
+-------twórczość mickiewicza
+-------+-------Dziady
+-------+-------+-------Nie wiem co tu wpisac
+-------+-------+-------Dramat Konrada;)
+-------+-------Liryki Lozańskie
+-------Słowacki


Struktóra bazy danych opiera się tylko na parent_id. Pole te zawiera numer id kategori nadrzędnej lub 0, gdy kategoria jest na samym wierzchołku.

Struktóra bazy danych i same kategorie:
Kod
DROP TABLE IF EXISTS `kategoria`;
CREATE TABLE `kategoria` (
  `id_kategoria` int(11) NOT NULL auto_increment,
  `nazwa` varchar(100) NOT NULL default '',
  `plik` varchar(100) NOT NULL default '',
  `parent_id` int(11) NOT NULL default '0',
  `przedmiot_id` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id_kategoria`)
) TYPE=MyISAM AUTO_INCREMENT=15;

#
# Zrzut danych tabeli `kategoria`
#

INSERT INTO `kategoria` VALUES (1, 'romantyzm', 'romantyzm', 0, 1, '');
INSERT INTO `kategoria` VALUES (2, 'oświecenie', 'oswiecenie', 0, 1, '');
INSERT INTO `kategoria` VALUES (3, 'twórczość mickiewicza', 'tfur-mickiewicz-mickiewicza', 1, 1, '');
INSERT INTO `kategoria` VALUES (4, 'Dziady', '2', 3, 1, '');
INSERT INTO `kategoria` VALUES (5, 'Liryki Lozańskie', 'mickiewicz-liryki-lozanskie', 3, 1, '');
INSERT INTO `kategoria` VALUES (6, 'Nie wiem co tu wpisac', 'nie-wiem-co.wpisac', 4, 1, '');
INSERT INTO `kategoria` VALUES (7, 'Słowacki', 'slowacki-juliusz', 1, 1, '');
INSERT INTO `kategoria` VALUES (8, 'Całki', 'calki', 0, 2, '');
INSERT INTO `kategoria` VALUES (9, 'Rozniczki', 'rozniczki-pochodne', 0, 2, '');
INSERT INTO `kategoria` VALUES (10, 'Wiecej o pochodnych', 'rozniczki-pochodne-wiecej-ekstra', 9, 0, '');
INSERT INTO `kategoria` VALUES (13, 'Funkcje', 'funkcje-matematyczne', 0, 2, '');
INSERT INTO `kategoria` VALUES (14, 'Dramat Konrada;)', 'dramat-konrada-dziady-mickiewicz', 4, 1, '');


Myślę, że przenoszenie takich kategori będzie o wiele łatwiejsze, ponieważ wystarczy zmienić parent_id i mamy już przeniesioną całą kategorię razem z jej dziećmi.

//PS. budowa bazy jest taka a nie inna ponieważ była to modyfikacja istniejącej...
lemming
Ostatnio bawiac sie osCommerce znalazlem tam:

  1. <?php
  2. class navigation {
  3. var $_trail;
  4.  
  5. function navigation() {
  6. $this->reset();
  7. }
  8.  
  9. function reset() {
  10. $this->_trail = array();
  11. }
  12.  
  13. function add($title, $link = '') {
  14. $this->_trail[] = array('title' => $title, 'link' => $link);
  15. }
  16.  
  17. function trail($separator = ' - ') {
  18. $trail_string = '';
  19.  
  20. for ($i=0, $n=sizeof($this->_trail); $i<$n; $i++) {
  21. if (isset($this->_trail[$i]['link']) && !empty($this->_trail[$i]['link'])) {
  22. $trail_string .= '<a href=\"' . $this->_trail[$i]['link'] . '\">' . $this->_trail[$i]['title'] . '</a>';
  23. } else {
  24. $trail_string .= $this->_trail[$i]['title'];
  25. }
  26.  
  27. if (($i+1) < $n) $trail_string .= $separator;
  28. }
  29.  
  30. return $trail_string;
  31. }
  32. }
  33. ?>

A wykorzystanie:
include("plik.z.klasa.php");
$cos = new navigation;
$cos->add("1");
$cos->add("2");
$cos->add("3");
$cos->trail(' > ')

albo
$cos->add("1","http://ja.pl");
$cos->add("2","http://ja.pl");
$cos->add("3","http://ja.pl");
$cos->trail(' > ')

proste ale czasami przydatne
splatch
Funkcja do pobierania w góre
  1. <?php
  2. function tree( $kid ) {
  3. global $tablica_z_danymi, $tree, $arr;
  4. $kat = $tablica_z_danymi[ $kid ];
  5. if( $tree[ $kat['parent_id'] ] ) {//ma cos nadrzednego
  6. $arr[] = tree( $kat['parent_id'] );
  7. return $kat;
  8. }
  9. return $kat;
  10. }
  11. ?>

potem wystarczy dać tylko to w pętle i ma się po kolei elemnty drzewa.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.