Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Tworzenie menu z drzewa katalogów
Forum PHP.pl > Forum > Przedszkole
wyrdhamster
Witam! Piszę sobie skrypt generujace menu serwisu na podstawie struktury katalogów na serwerze, no i mam lekki problem - php krzyczy mi że mam błędne dane do foreach przesyłane. Oto skrypt:

  1. <?php
  2. echo "menu";
  3.  
  4. function listdirs($dir) {
  5. static $alldirs = array();
  6. $dirs = glob($dir.'/<katalog_strony>/*', GLOB_ONLYDIR);
  7. if (count($dirs) > 0) {
  8.  
  9. foreach ($dirs as $d) array_push($alldirs,$d);
  10. }
  11. return $alldirs;
  12. }
  13. $kat=listdirs($_SERVER['DOCUMENT_ROOT']);
  14.  
  15. foreach ($kat as $k){
  16. $pliki=glob($k.'/*', "*.php");
  17. $root=$_SERVER['DOCUMENT_ROOT']."/adkl.eu/";
  18. $nazwa=str_replace ("$root",'',$k);
  19. echo '<ul><li>'."$nazwa"."</li> \n";
  20. foreach ( $pliki as $plik) {
  21. echo '<li><a href='.'"'."index.php?page=$plik".'>'."$plik"."</a></li> \n";
  22. }
  23. echo '</ul>';
  24. }
  25. ?>


Warning: glob() expects parameter 2 to be long, string given in/menu.php on line 16

Warning: Invalid argument supplied for foreach() in menu.php on line 20


Ktoś wie może o co tu może chodzić? wstydnis.gif

nospor
Czego nie rozumiesz w tym komunikacie:
Cytat
Warning: glob() expects parameter 2 to be long, string given in/menu.php on line 16

?
wyrdhamster
Cytat(nospor @ 4.12.2009, 12:41:50 ) *
Czego nie rozumiesz w tym komunikacie?


Proste - dlaczego w manualu jest to samo użycie glob z stringiem "*.txt", a tu nie chodzi dla "*.php"? worriedsmiley.gif
nospor
blinksmiley.gif
Skoro juz sie powolujesz na manual to do jasnej ciasnej przeczytaj dokladnie 10 razy co tam masz napisane.....
*.php podaje się jako pierwszy argument a nie jak u ciebie w kodzie jako drugi...

Masz o tym wyrażnie jak wół napisane w komunikacie błedu na który kazałem ci zwrócić uwagę
wyrdhamster
Okej, przetrawiłem jeszcze raz manuala i poprawiłem wpis na:

  1. $pliki=glob("$k./*.php");


I chyba coś już znajduje, bo nie wyświetla komunikatu o błędnie zadanym ciągu.

Pozostaje jednak problem tego niby źle zadeklarowanego foreach'a... worriedsmiley.gif
nospor
Cytat
Pozostaje jednak problem tego niby źle zadeklarowanego foreach'a

glob zwraca ci false. Pewnie dlatego ze podales mu złą sciezkę.
Co robi ta kropka po $k ? Widziales kiedys taką sciezke?


Jak sam nie wpadniesz na poprawe to pokaz co zwraca ci tekst:
  1. echo "$k./*.php";


edit:
patrzac na twoj poprzedni kod to chyba chciales napisac:
  1. $pliki=glob("$k/*.php");
wyrdhamster
Cytat
patrzac na twoj poprzedni kod to chyba chciales napisac:
  1. $pliki=glob("$k/*.php");


Tak, o to mi chodziło, zapomniałem że . trzeba rozdzielić zamkniętymi "". Skrypt się już wykonuj, chociaż nie robi dokładnie tego co bym chciał, ale to inna sprawa. Dziękuje za pomoc. party.gif

Edit: A może jednak będziesz w stanie mi pomóc? Tak wygląda menu jakie się generuje z tego skryptu - nie mam bladego pojęcia czemu tworzy link do co drugiego znalezienia, albo czemu nie tworzy podlist <ul>, jak ma rozpisane w skrypcie, tylko wszystko wwala do głównej. W każdym z katalogów jest plik php który powinien być wczytany, cześć jest taka jak nazwa katalogów część jest inna.

Obecna część skryptu odpowiedzialna za generowanie listy:
  1. foreach ($kat as $k){
  2. $pliki=glob("$k/*.php");
  3. $root=$_SERVER['DOCUMENT_ROOT']."/adkl.eu/";
  4. $nazwa=str_replace ("$root",'',$k);
  5. echo '<ul><li>'."$nazwa"."</li> \n";
  6. if (count ($pliki) > 0){
  7. foreach ( $pliki as $plik) {
  8. echo '<li><a href='.'"'."index.php?page=$plik".'>'."$plik"."</a></li> \n";
  9. }
  10. }
  11. echo '</ul>';

skowron-line
Mistrzu najedz myszką na link na stronie którą podałeś i zobacz jaki się adres na pasku pojawi na dole, wtedy odpowiedz przyjdzie sama .
wyrdhamster
Cytat(skowron-line @ 4.12.2009, 15:20:06 ) *
Mistrzu najedz myszką na link na stronie którą podałeś i zobacz jaki się adres na pasku pojawi na dole, wtedy odpowiedz przyjdzie sama .


Przepraszam, może głupoty teraz mówię, ale to że link zewnętrzny jest na adresie "test.adkl.eu", a wewnętrzny jest na serwerze dhosting NIJAK powinno się mieć do samego wyświetlania linka, a nie zwykłego tekstu w elemencie listy. Czyli to że adres jest zły, nijak się ma do tego że powinny powstawać jakiekolwiek link, no nie? A tu powstaje w co drugim wpisie link, w co drugim nie. blinksmiley.gif
Blame
Nie oto chodzi -.-
Tak wygląda jeden z twoich linków:
  1. <a index.php?page="/home/klient.dhosting.pl/adkl/test.adkl.eu/adkl.eu/kontakt/kontakt.php" href="index.php?page=/home/klient.dhosting.pl/adkl/test.adkl.eu/adkl.eu/kariera/poszukiwani.php>/home/klient.dhosting.pl/adkl/test.adkl.eu/adkl.eu/kariera/poszukiwani.php</a></li> </ul><ul><li>kontakt</li> <li><a href=">/home/klient.dhosting.pl/adkl/test.adkl.eu/adkl.eu/kontakt/kontakt.php</a>

Przeanalizuj, kombinuj, popraw błędy.
wyrdhamster
Odpoczołem, zastanowiłem się i dziś po porawiałem skrypt. happy.gif Obecna wersja jest taka:
  1. <div id='list'>
  2. <ul>
  3. <?php
  4. echo "menu";
  5.  
  6. function listdirs($dir) {
  7. static $alldirs = array();
  8. $dirs = glob($dir.'/<katalog portalu >/*', GLOB_ONLYDIR);
  9. if (count($dirs) > 0) {
  10.  
  11. foreach ($dirs as $d) array_push($alldirs,$d);
  12. }
  13. return $alldirs;
  14. }
  15. $kat=listdirs($_SERVER['DOCUMENT_ROOT']);
  16.  
  17. foreach ($kat as $k){
  18.  
  19. $pliki=glob("$k/*.php");
  20. $root=$_SERVER['DOCUMENT_ROOT']."/<katalog portalu >/";// nazwa katalogu portalu
  21. $nazwa=ucfirst(str_replace("$root",'',$k));
  22. $nazwa=str_replace('_',' ',$nazwa);
  23. echo '<ul>';
  24. if (count ($pliki) == 1){// Spradzam czy jest tylko jeden plik i czy nazwa katalogu nie jest taka sama jak pliku
  25. $skrot=str_replace ("$root",'/',$pliki[0]);
  26. $moze=ucfirst(str_replace("$k/",'',$pliki[0]));
  27. $moze=str_replace(".php",'',$moze);
  28. if(strcasecmp($moze,$nazwa)){
  29. echo '<li><a href='.'"'."index.php?page=$skrot".'">'."$nazwa"."</a></li>\n";
  30. }
  31. }
  32. else{
  33. echo '<ul><li>'."$nazwa"."</li> \n";
  34. }
  35.  
  36. if (count ($pliki) > 0){
  37.  
  38. echo '<ul>';
  39.  
  40. foreach ( $pliki as $plik) {
  41. $skrot=str_replace ("$root",'/',$plik);
  42. $stronka=ucfirst(str_replace("$k/",'',$plik));
  43. $stronka=str_replace(".php",'',$stronka);
  44. echo '<li><a href='.'"'."index.php?page=$skrot".'">'."$stronka"."</a></li>";
  45. echo '</ul></br>';
  46. }
  47. }
  48.  
  49. echo '</ul></br>';
  50.  
  51. }
  52. ?>
  53. </ul>
  54. </div>


Działa niemal dokładnie tak jak powienien, ale jest leciutki problem z kolejnością elementów na listach generowanych. Otóż jak wskazuje zastosowanie praktyczne tutaj, zarówno link Kontakt, jak i Oferta powinny być na głównej liście, nie jako elementy podlist Kariera i O firmie. Ktoś może z tym pomóc mi? dry.gif
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.