Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Mapa serwisu oparta na MySQL
Forum PHP.pl > Forum > Gotowe rozwiązania
ins@ne
No wiec usiluje zrobic mape strony opartej na MySQL. Moja baza wyglada tak:
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)

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 sad.gif 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 '&nbsp;&nbsp;';
}
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 '&nbsp;&nbsp;';
}
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).
spenalzo
Zobacz, może to Ci się przyda: http://forum.php.pl/viewtopic.php?t=6868
marcin96
[php:1:e78c3ebf81]<?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))
$TablicaStron['Nr'][]=$SQLRekord['Nr'];
$TablicaStron['Tytul'][]=$SQLRekord['Tytul'];
$TablicaStron['Poziom'][]=$SQLRekord['Poziom'];
$TablicaStron['Nadrzedna'][]=$SQLRekord['Nadrzedna'];

}

array_multisort(
$TablicaStron['Poziom'], SORT_NUMERIC, SORT_ASC,
$TablicaStron['Nr'], SORT_NUMERIC, SORT_ASC,
$TablicaStron['Nadrzedna'], SORT_NUMERIC, SORT_ASC,
$TablicaStron['Tytul'], SORT_STRING, SORT_ASC
);

/* dla kazdej strony nie będącej podrzędną zawartej w tablicy wywoluje funkcje WyswietlTytul */

$c = count($TablicaStron['Nr']);

for($i=0; $i<$c; $i++)
{
if(!$TablicaStron['Nadrzedna'][$i])
{
WyswietlTytul($TablicaStron, $i);
}
}

}

/* Funkcje pomocniczne dla funkcji MapaSerwisu */
function WyswietlTytul($TablicaStron, $ID)
{

for($i=0; $i<$TablicaStron['Poziom'][$ID]; $i++)
{
$prefix .= '&nbsp;&nbsp;';
}

echo $prefix.$TablicaStron['Tytul'][$ID].'<br />';

$c = count($TablicaStron['Tytul']);

for($i=$ID; $i<$c; $i++)
{
if($TablicaStron['Nadrzedna'][$i] == $TablicaStron['Nr'][$ID])
{
WyswietlTytul($TablicaStron, $i);
}
}
}
?>[/php:1:e78c3ebf81]

jeśli wystarczy Ci tylko wyświetlanie... to powinno chodzić :>) Możliwe, że zamiast tego array_multisort() szybciej będzie zrobić odpowiednie zapytanie do bazy.. ważne aby posortować przede wszystkim polem 'Nadrzedna' rosnąco i w drugiej kolejności wg 'Nr' :>)

//edit oczywiście przede wszystkim 'Poziom' rosnąco, a pozniej 'Nr' ..nie wiem skąd ta 'Nadrzedna' mi się tutaj w opisie wzięła ;>)
Bora
wydaje mi sie że problem jest z sortowaniem.
Ja bym to zrobił tak:


Kod
Strona główna(1)

  Klienci(2)

    Klient 1(201)

    Klient 2(202)

    Klient 3(203)

  Oferta(3)

    Wstep do oferty(4)

    Oferta szczegolowa(5)

      Zagadnienie 1(501)

      Zagadnienie 2(502)

    Zakonczenie oferty(7)

  Kontakt ze strony(6)

    Formularz pocztowy(8)

    Adresy firmowe(9)

      Sekretariat(11)

      Dzial handlowy(13)


musisz to zmeinić bo inaczej Sekretariat i Dzial handlowybędzie jako podkategoria do Strona główna.

Pobrał wszystkie rekordy, następnie zbudował z nich tablice o strukturze:

[php:1:53286d1f4c]<?php
$tabkat=array();
$tabpodkat=array();
$SQLQuery = mysql_query('select Nr,Tytul,Poziom,Nadrzedna from strony order by Nr desc');
while ($SQLRekord = mysql_fetch_array($SQLQuery))
$TablicaStron['Nr'][]=$SQLRekord['Nr'];
$TablicaStron['Tytul'][]=$SQLRekord['Tytul'];
$TablicaStron['Poziom'][]=$SQLRekord['Poziom'];
$TablicaStron['Nadrzedna'][]=$SQLRekord['Nadrzedna'];
if(strlen($SQLRekord['Nr'])<3)
{
$tabkat[]=$SQLRekord['Nr'];
}else{
$tabpodkat[]=$SQLRekord['Nr'];
}
}

$pokaz=array();
foreach ($tabkat as $kat)
{
$pokaz[]=$kat;
foreach ($tabpodkat as $podkat)
{
if (substr($tabpodkat, 0, 2)==$kat)
{
$pokaz[]=$podkat;
}
}
}
?>[/php:1:53286d1f4c]

co do sortowania nie wiem czy nie wystarczy zrobić pole Nr typu varchar i wówczas samo posortuje odpowiednio
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-2024 Invision Power Services, Inc.