Kod
Nr | Tytul | Data | Poziom | Nadrzedna | Zawartosc
Nr - klucz glowny
Tytul - tytul kazdej strony
Data - data utworzenia/aktualizacji strony (nieistotne w tym zadaniu)
Poziom - "glebokosc" strony (dziala to analogicznie do tego jak jest zbudowane forum - strona dzieli sie na dzialy, poddzialy itd.) - im mniejsza liczba tym wyzej jest strona w "hierarchii"
Nadrzedna - kazda strona poza strona glowna ma strone nadrzedna (czyli strone, z ktorej "wchodzi sie" na dana strone)
Zawartosc - zawartosc strony (zupelnie nieistotne w naszym przypadku)
Generalnie zalezy mi na tym zeby mapa serwisu budowala sie automatycznie na podstawie danych pobieranych z bazy danych.
Zalozenia:
Strony sa wyswietlane w nastepujacy sposob:
- kazda strona jest wyswietlana z wszystkimi podrzednymi jej stronami (te strony wyswietlane sa pod nia z odpowiednim wcieciem zaleznym od poziomu strony)
- strony na tym samym poziomie segregowane sa wg. klucza glownego
Wygladac to powinno mniej wiecej tak (w nawiasie jest podany Nr - klucz glowny):
Kod
Strona główna(1)
Klienci(2)
Klient 1(21)
Klient 2(22)
Klient 3(23)
Oferta(3)
Wstep do oferty(4)
Oferta szczegolowa(5)
Zagadnienie 1(10)
Zagadnienie 2(12)
Zakonczenie oferty(7)
Kontakt ze strony(6)
Formularz pocztowy(8)
Adresy firmowe(9)
Sekretariat(11)
Dzial handlowy(13)
Klienci(2)
Klient 1(21)
Klient 2(22)
Klient 3(23)
Oferta(3)
Wstep do oferty(4)
Oferta szczegolowa(5)
Zagadnienie 1(10)
Zagadnienie 2(12)
Zakonczenie oferty(7)
Kontakt ze strony(6)
Formularz pocztowy(8)
Adresy firmowe(9)
Sekretariat(11)
Dzial handlowy(13)
Mam nadzieje, ze jest jasne o co mi chodzi.
Myslalem nad tym jak to mozna rozwiazac i najbardziej naturalna mi sie wydala rekurencja. Niestety, jak to z rekurencja zwykle bywa pojawil sie problem "nadpisywania" zmiennych i sie pogubilem.
Tak wygladaja funkcje obslugujace zagadnienie:
[php:1:d603b90248]<?php
function MapaSerwisu()
{
global $SQLHost,$SQLUser,$SQLPass,$SQLDBName;
@mysql_connect($SQLHost,$SQLUser,$SQLPass) or die ("Nie można połączyć z MySQL");
mysql_select_db($SQLDBName) or die ("Nie można połączyć z bazą danych");
/* zeby "nie babrac sie" z ciaglym odwolywaniem do bd, tworze tablice zawierajaca elementy bazy, ktore sa mi potrzebne */
$SQLQuery = mysql_query('select Nr,Tytul,Poziom,Nadrzedna from strony');
while ($SQLRekord = mysql_fetch_array($SQLQuery))
{
if (!(isset($i)))
{
$i = 0;
}
$TablicaStron[$i]['Nr']=$SQLRekord['Nr'];
$TablicaStron[$i]['Tytul']=$SQLRekord['Tytul'];
$TablicaStron[$i]['Poziom']=$SQLRekord['Poziom'];
$TablicaStron[$i]['Nadrzedna']=$SQLRekord['Nadrzedna'];
$i++;
}
/* dla kazdej strony zawartej w tablicy wywoluje funkcje WyswietlTytul */
for ($i=0; $i<sizeof($TablicaStron); $i++)
{
WyswietlTytul($TablicaStron[$i]['Nr'],$TablicaStron[$i]['Tytul'],$TablicaStron[$i]['Poziom']);
}
}
/* Funkcje pomocniczne dla funkcji MapaSerwisu */
function WyswietlTytul($Nr,$Tytul,$Poziom)
{
if (WolnyNumer($Nr))
{
if (Nadrzedna($Nr))
{
for ($i=0; $i<$Poziom; $i++) // formatowanie wciecia - 2 spacje na kazdy poziom
{
print ' ';
}
print ''.$Tytul.'<br>';
ListaPodrzednych($Nr); // tu sie pojawiaja schody wlasnie... teoretycznie tworze tablice stron podrzednych dla aktualnie "obrabianej"
for ($j=0; $j<sizeof($StronyPodrzedne); $j++)
{
WyswietlTytul($StronyPodrzedne[$j]['Nr'],$StronyPodrzedne[$j]['Tytul'],$StronyPodrzedne[$j]['Poziom']); // tu podejrzewam jest jakis glowny byk bo nie wiem czy do konca dobrze ta rekurencje rozwiazalem
}
}
else
{
for ($i=0; $i<$Poziom; $i++)
{
print ' ';
}
print ''.$Tytul.'<br>';
}
}
}
function WolnyNumer($Nr) // sprawdza czy strona o podanych numerze nie zostala jeszcze wypisana
{
for ($i=0; $i<sizeof($ZajeteNumery); $i++)
{
if ($Nr == $ZajeteNumery[$i])
{
return false;
}
}
return true;
}
function Nadrzedna($Nr) // sprawdza czy strona jest strona nadrzedna
{
$Query = mysql_query('select Tytul from strony where Nr='.$Nr.'');
$Rekord = mysql_fetch_array($Query);
$Tytul = $Rekord['Tytul'];
$Query = mysql_query('select Nadrzedna from strony');
while ($Rekord = mysql_fetch_array($Query))
{
if ($Rekord['Nadrzedna'] == $Tytul)
{
return true;
}
}
return false;
}
function ListaPodrzednych($Nr) // zwraca tablice z numerami, tytulami i poziomami stron podrzednych dla strony podanej w wywolaniu
{
$Query = mysql_query('select Tytul from strony where Nr='.$Nr.'');
$Rekord = mysql_fetch_array($Query);
$Tytul = $Rekord['Tytul'];
$Query = mysql_query('select Nr,Tytul,Poziom from strony where Nadrzedna="'.$Tytul.'"');
while ($Rekord = mysql_fetch_array($Query))
{
if (!(isset($i)))
{
$i = 0;
}
else
{
$StronyPodrzedne[$i]['Nr'] = $Rekord['Nr'];
$StronyPodrzedne[$i]['Tytul'] = $Rekord['Tytul'];
$StronyPodrzedne[$i]['Poziom'] = $Rekord['Poziom'];
$i++;
}
}
return $StronyPodrzedne;
}
?>[/php:1:d603b90248]
Nie wiem czy jeszcze jakies informacje sa potrzebne. Staralem sie w miare czytelnie opisac kod.
Licze na pomoc w rozwiazaniu tego problemu. Albo poprzez poprawienie moich funkcji, albo poprzez zaproponowanie jakiegos alternatywnego rozwiazania (myslalem jeszcze nad tym zeby calosc rozwiazac zapytaniem SQL, ale jakos nie doszedlem do niczego konstruktywnego).