Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Generator drzewek (PHP+JS), Funkcja, PHP 4 i 5
Marcin_m
post 7.06.2005, 17:26:10
Post #1





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 1.06.2005

Ostrzeżenie: (0%)
-----


Oto prosta funkcja generująca dynamiczne drzewo w oparciu o java script. W łatwy sposób można ją przerobić także dla rekordów pobieranych z bazy danych. Jeżeli ktoś chce sobie tylko wygenerować drzewo np. linków, wystarczy że odpowiednio umieści linki w tablicy i przypisze im przodków. Wkrótce napisze klasę, która pozwoli obługiwać takie drzewo (zarówno dla rekordów z bazy danych, jak i dla statycznych celów).

Fragment html:
  1. <META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=windows-1250">
  2. </head>
  3. <script TYPE="text/javascript" LANGUAGE="JavaScript">
  4.  
  5. function ukryj()
  6. {
  7. var i=0;
  8. while(document.getElementById(i))
  9. {
  10. document.getElementById(i).style.display='none';
  11. zmiana=eval('document.formatka.node'+i+'');
  12. zmiana.value='+';
  13. Tablica_node[i]=0;
  14. i++;
  15. }
  16. }
  17.  
  18. function odkryj()
  19. {
  20. var i=0;
  21. while(document.getElementById(i))
  22. {
  23. document.getElementById(i).style.display='block';
  24. zmiana=eval('document.formatka.node'+i+'');
  25. zmiana.value='-';
  26. Tablica_node[i]=1;
  27. i++;
  28. }
  29. }
  30.  
  31.  
  32. var Tablica_node;
  33. Tablica_node=new Array(0);
  34.  
  35. function inode(value1)
  36. {
  37. if(!Tablica_node[value1])Tablica_node[value1]=0;
  38.  
  39. zmiana_znaczka=eval('document.formatka.node'+value1+'');
  40. wezel=eval('document.getElementById('+value1+')');
  41.  
  42. Tablica=new Array('+','-');
  43.  
  44. if(Tablica_node[value1]==0){
  45. zmiana_znaczka.value=Tablica[1];
  46.  
  47. wezel.style.display='block';
  48.  
  49. Tablica_node[value1]=1;
  50. }
  51. else{
  52. zmiana_znaczka.value=Tablica[0];
  53.  
  54. wezel.style.display='none';
  55.  
  56. Tablica_node[value1]=0;
  57.  
  58. }
  59. }
  60.  
  61. A skrypt działa tak:
  62.  
  63. <li>Korzeń drzewa tworzą osobniki nie posiadające przodków
  64. <li>ID osobnika jest równe jego pozycji w tablicy
  65. <li>Każdy osobnik tworzy tabele o ID=id_siebie
  66. <li>Każda kolejna tabela ma funkcje inode(x) gdzie x to ID odkrywanej tabeli
  67. <li>W ten sposób po ukryciu tabeli przodka, potomkowie nie ukryci wciąż
  68. pozostają odkryci (jak w systemie drzewiastym katalogów)
  69. <li>Skrypt niezwykle łatwo jest przystosować do wszystkiego
  70. <form name="formatka">
  71.  
  72. <!-- może być display=block i display=none -->
  73. <input onclick=odkryj() type=button value='Odkryj wszystko'>
  74. <input onclick=ukryj() type=button value='Ukryj wszystko'>
  75. <br>


Fragment php:
  1. <?php
  2. /*
  3. @Autor: Marcin Makowski
  4. Skrypt generujący drzewo, z możliwością dynamicznego
  5. odkrywania i ukrywania potomków
  6.  
  7.   */
  8.  
  9. /*
  10. Funkcja drzewo
  11. @arg Tablica - tablica asocjacyjna z przyporządkowanymi przodkami
  12. @arg Przodek - zawiera w sobie indeks tablicy przodka do wyswietlenia
  13. @arg Potomek - zawiera ilość potomków danego przodka, pomocny przy
  14.  wyświetlaniu drzewa
  15.   */
  16. function drzewo($tablica,$przodek,$potomek)
  17. {
  18. //$i - to indeks elementu tablicy
  19. $i=0;
  20. foreach($tablica as $tytul=>$pr)
  21. {
  22.  //Wyświetlamy z tablicy tylko danych przodków
  23.  if($pr==$przodek)
  24. {
  25.  echo '<table border=0 height=20><tr><td width='.($potomek*10).'></td><td width=30>';
  26.  /*szukanie potomków
  27.  W tym celu kopiujemy tablice aby móc na niej operować
  28. */
  29. $tablica2=$tablica;
  30. reset($tablica2);
  31. foreach($tablica2 as $tytul2=>$pr2)
  32. {
  33. if($pr2==$i)
  34. {
  35. echo'<input onclick=inode('.$i.') type=button name=\"node'.$i.'\" value=\"+\">';
  36. break; //Jeżeli znaleziony to wyskakujemy
  37. }
  38. }
  39.  echo'</td><td>'.$tytul.&#092;"</td></tr></table>\";
  40.  $potomek++;
  41.  echo'<table id='.$i.'><tr><td>'; //otwieramy tabele dla potomków o ID=indeks bieżącego osobnika
  42.  drzewo($tablica,&#092;"\".$i.\"\",$potomek); //rekurencyjnie, szukamy potomków aktualnego osobnika
  43.  echo'</td></tr></table>';
  44.  $potomek--;
  45. }
  46.  $i++;
  47. }
  48. }
  49. //Indeks elemntu w tablicy to ID osobnika, druga wartość to jego przodek
  50. $tablica=array(&#092;"Temat\"=>\"\",
  51.  &#092;"Sie wyswietli\"=>\"0\",
  52.  &#092;"Sie2\"=>\"0\",
  53.  &#092;"Przodek wyswietli\"=>\"1\",
  54.  &#092;"Temat2\"=>\"\",
  55.  &#092;"Przodek sie2\"=>\"2\");
  56.  drzewo($tablica,&#092;"\",0);
  57.  
  58. ?>


I zakończenie html:
  1. <br>
  2. <script TYPE="text/javascript" LANGUAGE="JavaScript">
  3. ukryj();
  4. </body>
  5. </html>


Skrypt ten (ale oczywiście zmodyfikowany) będe używał w pisanym przez siebie forum wątkowym
Go to the top of the page
+Quote Post
pwa
post 24.07.2005, 14:07:54
Post #2





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 9.07.2003
Skąd: krakow

Ostrzeżenie: (0%)
-----


ciekawe rozwiazanie musze to przetrawic jakos biggrin.gif
Go to the top of the page
+Quote Post
FiDO
post 24.07.2005, 16:04:56
Post #3





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

Ostrzeżenie: (0%)
-----


Moglbys jeszcze wystawic jakis przyklad jak to wyglada w akcji.. nie kazdemu chce sie przekopiowywac kod i sprawdzac smile.gif


--------------------
Brak czasu :/
Go to the top of the page
+Quote Post
Marcin_m
post 10.08.2005, 08:41:47
Post #4





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 1.06.2005

Ostrzeżenie: (0%)
-----


Miałem ten skrypt ulepszyć... ale wiecie jak to jest, robota wre a czasu na zabawy mało. W każdym razie w tym skrypcie najbardziej chciałem zwrócić uwagę na wykorzystanie java-script do generowania drzew, które można ładnie wykorzystać np. w wątkowych forach (jak swoje forum dokończe to wam pokaże). Tym czasem trzeba zrobić tak:

1). Wszystkie części java script i html złączyć w jeden plik i zainkludować gdzieś wewnątrz funkcje

2). Pod tą funkcją trzeba umieścić kod generujący drzewo który wygląda tak:
  1. <?php
  2.  $tablica=array("Temat"=>"",
  3.  "Przodek1_temat"=>"0",
  4.  "Przodek2_temat"=>"0",
  5.  "Przodek1_Przodek2_temat"=>"1",
  6.  "Temat2"=>"",
  7.  "Przodek1_Przodek2_temat"=>"2");
  8.  drzewo($tablica,"",0);
  9. ?>


Robimy tak że Główne węzły drzewa nie mają wartości, natomiast liście mają wartość równą indeksowi w tablicy. Niestety powoduje to że tak skonstruowana funkcja nie może pobrać po prostu rekordów z bazy, no ale przecież można troche sie pobawić i to zmienić. Obiecuje że jak tylko ukończe forum, ta funkcja sie zmieni.

3). Stworzyć plik np. drzewo.php i wrzucić tam funkcje

plik index.php
  1. <META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=windows-1250">
  2. </head>
  3. <script TYPE="text/javascript" LANGUAGE="JavaScript">
  4.  
  5. function ukryj()
  6. {
  7. var i=0;
  8. while(document.getElementById(i))
  9. {
  10. document.getElementById(i).style.display='none';
  11. zmiana=eval('document.formatka.node'+i+'');
  12. zmiana.value='+';
  13. Tablica_node[i]=0;
  14. i++;
  15. }
  16. }
  17.  
  18. function odkryj()
  19. {
  20. var i=0;
  21. while(document.getElementById(i))
  22. {
  23. document.getElementById(i).style.display='block';
  24. zmiana=eval('document.formatka.node'+i+'');
  25. zmiana.value='-';
  26. Tablica_node[i]=1;
  27. i++;
  28. }
  29. }
  30.  
  31.  
  32. var Tablica_node;
  33. Tablica_node=new Array(0);
  34.  
  35. function inode(value1)
  36. {
  37. if(!Tablica_node[value1])Tablica_node[value1]=0;
  38.  
  39. zmiana_znaczka=eval('document.formatka.node'+value1+'');
  40. wezel=eval('document.getElementById('+value1+')');
  41.  
  42. Tablica=new Array('+','-');
  43.  
  44. if(Tablica_node[value1]==0){
  45. zmiana_znaczka.value=Tablica[1];
  46.  
  47. wezel.style.display='block';
  48.  
  49. Tablica_node[value1]=1;
  50. }
  51. else{
  52. zmiana_znaczka.value=Tablica[0];
  53.  
  54. wezel.style.display='none';
  55.  
  56. Tablica_node[value1]=0;
  57.  
  58. }
  59. }
  60.  
  61. A skrypt działa tak:
  62.  
  63. <li>Korzeń drzewa tworzą osobniki nie posiadające przodków
  64. <li>ID osobnika jest równe jego pozycji w tablicy
  65. <li>Każdy osobnik tworzy tabele o ID=id_siebie
  66. <li>Każda kolejna tabela ma funkcje inode(x) gdzie x to ID odkrywanej tabeli
  67. <li>W ten sposób po ukryciu tabeli przodka, potomkowie nie ukryci wciąż
  68. pozostają odkryci (jak w systemie drzewiastym katalogów)
  69. <li>Skrypt niezwykle łatwo jest przystosować do wszystkiego
  70. <form name="formatka">
  71.  
  72. <!-- może być display=block i display=none -->
  73. <input onclick=odkryj() type=button value='Odkryj wszystko'>
  74. <input onclick=ukryj() type=button value='Ukryj wszystko'>
  75. <br>
  76. [php]
  77. <?php
  78. include('drzewo.php');
  79.  =array("Temat"=>"",
  80.  "Przodek1_temat"=>"0",
  81.  "Przodek2_temat"=>"0",
  82.  "Przodek1_Przodek2_temat"=>"1",
  83.  "Temat2"=>"",
  84.  "Przodek1_Przodek2_temat"=>"2");
  85.  drzewo(,"",0);
  86. ?>[/php]
  87. <br>
  88. <script TYPE="text/javascript" LANGUAGE="JavaScript">
  89. ukryj();
  90. </body>
  91. </html>

plik drzewo.php
  1. <?php
  2. /*
  3. @Autor: Marcin Makowski
  4. Skrypt generujący drzewo, z możliwością dynamicznego
  5. odkrywania i ukrywania potomków
  6.  
  7.   */
  8.  
  9. /*
  10. Funkcja drzewo
  11. @arg Tablica - tablica asocjacyjna z przyporządkowanymi przodkami
  12. @arg Przodek - zawiera w sobie indeks tablicy przodka do wyswietlenia
  13. @arg Potomek - zawiera ilość potomków danego przodka, pomocny przy
  14.  wyświetlaniu drzewa
  15.   */
  16. function drzewo($tablica,$przodek,$potomek)
  17. {
  18. //$i - to indeks elementu tablicy
  19. $i=0;
  20. foreach($tablica as $tytul=>$pr)
  21. {
  22.  //Wyświetlamy z tablicy tylko danych przodków
  23.  if($pr==$przodek)
  24. {
  25.  echo '<table border=0 height=20><tr><td width='.($potomek*10).'></td><td width=30>';
  26.  /*szukanie potomków
  27.  W tym celu kopiujemy tablice aby móc na niej operować
  28. */
  29. $tablica2=$tablica;
  30. reset($tablica2);
  31. foreach($tablica2 as $tytul2=>$pr2)
  32. {
  33. if($pr2==$i)
  34. {
  35. echo'<input onclick=inode('.$i.') type=button name="node'.$i.'" value="+">';
  36. break; //Jeżeli znaleziony to wyskakujemy
  37. }
  38. }
  39.  echo'</td><td>'.$tytul."</td></tr></table>";
  40.  $potomek++;
  41.  echo'<table id='.$i.'><tr><td>'; //otwieramy tabele dla potomków o ID=indeks bieżącego osobnika
  42.  drzewo($tablica,"".$i."",$potomek); //rekurencyjnie, szukamy potomków aktualnego osobnika
  43.  echo'</td></tr></table>';
  44.  $potomek--;
  45. }
  46.  $i++;
  47. }
  48. }
  49. ?>

Przykład : DRZEWO-DZIAŁANIE

Ten post edytował Marcin_m 10.08.2005, 08:43:33
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 16.04.2024 - 23:06