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:
<?php
$tablica=array("Temat"=>"", "Przodek1_temat"=>"0",
"Przodek2_temat"=>"0",
"Przodek1_Przodek2_temat"=>"1",
"Temat2"=>"",
"Przodek1_Przodek2_temat"=>"2");
drzewo($tablica,"",0);
?>
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
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=windows-1250"> <script TYPE="text/javascript" LANGUAGE="JavaScript">
function ukryj()
{
var i=0;
while(document.getElementById(i))
{
document.getElementById(i).style.display='none';
zmiana=eval('document.formatka.node'+i+'');
zmiana.value='+';
Tablica_node[i]=0;
i++;
}
}
function odkryj()
{
var i=0;
while(document.getElementById(i))
{
document.getElementById(i).style.display='block';
zmiana=eval('document.formatka.node'+i+'');
zmiana.value='-';
Tablica_node[i]=1;
i++;
}
}
var Tablica_node;
Tablica_node=new Array(0);
function inode(value1)
{
if(!Tablica_node[value1])Tablica_node[value1]=0;
zmiana_znaczka=eval('document.formatka.node'+value1+'');
wezel=eval('document.getElementById('+value1+')');
Tablica=new Array('+','-');
if(Tablica_node[value1]==0){
zmiana_znaczka.value=Tablica[1];
wezel.style.display='block';
Tablica_node[value1]=1;
}
else{
zmiana_znaczka.value=Tablica[0];
wezel.style.display='none';
Tablica_node[value1]=0;
}
}
A skrypt działa tak:
<li>Korzeń drzewa tworzą osobniki nie posiadające przodków
<li>ID osobnika jest równe jego pozycji w tablicy
<li>Każdy osobnik tworzy tabele o ID=id_siebie
<li>Każda kolejna tabela ma funkcje inode(x) gdzie x to ID odkrywanej tabeli
<li>W ten sposób po ukryciu tabeli przodka, potomkowie nie ukryci wciąż
pozostają odkryci (jak w systemie drzewiastym katalogów)
<li>Skrypt niezwykle łatwo jest przystosować do wszystkiego
<!-- może być display=block i display=none -->
<input onclick=odkryj() type=button value='Odkryj wszystko'> <input onclick=ukryj() type=button value='Ukryj wszystko'> [php]
<?php
include('drzewo.php');
=array("Temat"=>"",
"Przodek1_temat"=>"0",
"Przodek2_temat"=>"0",
"Przodek1_Przodek2_temat"=>"1",
"Temat2"=>"",
"Przodek1_Przodek2_temat"=>"2");
drzewo(,"",0);
?>[/php]
<script TYPE="text/javascript" LANGUAGE="JavaScript"> ukryj();
plik drzewo.php
<?php
/*
@Autor: Marcin Makowski
Skrypt generujący drzewo, z możliwością dynamicznego
odkrywania i ukrywania potomków
*/
/*
Funkcja drzewo
@arg Tablica - tablica asocjacyjna z przyporządkowanymi przodkami
@arg Przodek - zawiera w sobie indeks tablicy przodka do wyswietlenia
@arg Potomek - zawiera ilość potomków danego przodka, pomocny przy
wyświetlaniu drzewa
*/
function drzewo($tablica,$przodek,$potomek)
{
//$i - to indeks elementu tablicy
$i=0;
foreach($tablica as $tytul=>$pr)
{
//Wyświetlamy z tablicy tylko danych przodków
if($pr==$przodek)
{
echo '<table border=0 height=20><tr><td width='.($potomek*10).'></td><td width=30>'; /*szukanie potomków
W tym celu kopiujemy tablice aby móc na niej operować
*/
$tablica2=$tablica;
foreach($tablica2 as $tytul2=>$pr2)
{
if($pr2==$i)
{
echo'<input onclick=inode('.$i.') type=button name="node'.$i.'" value="+">'; break; //Jeżeli znaleziony to wyskakujemy
}
}
echo'</td><td>'.$tytul."</td></tr></table>"; $potomek++;
echo'<table id='.$i.'><tr><td>'; //otwieramy tabele dla potomków o ID=indeks bieżącego osobnika drzewo($tablica,"".$i."",$potomek); //rekurencyjnie, szukamy potomków aktualnego osobnika
echo'</td></tr></table>'; $potomek--;
}
$i++;
}
}
?>
Przykład :
DRZEWO-DZIAŁANIE
Ten post edytował Marcin_m 10.08.2005, 08:43:33