Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Viestien järjestäminen

tso [08.12.2004 16:59:11]

#

Moi! Tuossa alla todella pieni messageboard-tyylinen kyhäelmä. Tarkoitus tuolla olisi se että ihmiset voisivat yksinkertaisesti kommentoida haluttua aihetta weppisivuilla. Tällähetkellä tuo proto toimii ihan ok, ongelmana on vain se etten oikein keksi mitään, ainakaan helppoa, tapaa saada noita viestejä järjestykseen "uusin ensin". Ongelma aiheutuu siitä että viestit sisentyvät ja järjestyvät aiheittain - eli johonkin säikeeseen vastaminen menee ko. säikeen alle. Jos joku keksii tavan jolla jokaisen säikeet saisi järjestykseen "uusin ensin", niin kerro! Koodin laatu ja kommentointi vähintäänkin kyseenalaista ;)

<?php
//muuttujat
$msg_polku = "/home/msg/"; //polku kansioon johon talletetaan
$id = "test"; //millä nimellä viestit tallennetaan (+.txt)

function jarjesta($a, $b) { //järjestää arrayn jnro:n mukaan
       return strnatcmp($a["jnro"], $b["jnro"]);
}

function new_order($nro,$timeord){ //luodaan jnro
   $l = count($nro); //kuinka monta äitiä viestillä

      for($i=$l; $i > -1; $i--){
         $temp_nro .= $nro[$i]."."; //äidit nuorimmasta vanhimaan
	}
	$temp_nro .= $timeord;
	$rootmama = array_reverse($nro); //haetaan kantaäiti pääjärjestysnumeroksi
	$rootmama = $rootmama[0]; //käännön jälkeen kantaäiti on järjestyksessä ensimmäinen
	$rvalue = $rootmama.$temp_nro; //luodaan itse järjestysnumero

	return $rvalue;
}

function checkmoma($needle,$stack){ //tarkistetaan onko linkitetty toiseen viestiin
	while($needle["mama"]){ //jos on,
		$jnro[] = $needle["mama"]; //lisätään äiti jnro muuttujaan
		$needle = $stack[$needle["mama"]]; //haetaan äidin-äiti jos löytyy jne.
	}
	return $jnro;
}

function open_msgs($tiedosto){	//luetaan tiedot tekstitiedostosta
	if(!$tiedosto){die("ei tietoa");};
	global $msg_polku;
	$file = $msg_polku.$tiedosto;

	if(!file_exists($file)){ //ei tiedostoa vielä olemassa -> luodaan se
		$fp = fopen($file,"w");
		fclose($fp);
		chmod($file, 0777);
	}
	$viesti = Array();
	$file = file($file);
	$i=0;
	foreach ($file as $row){
		$i++;
		$temp = explode("&", $row);
		$viesti[$i] = Array(nro=>$i,teksti=>$temp[0], mama=>$temp[1], aika=>$temp[2], otsikko=>$temp[3]);
	}
	return $viesti;
}

function add_msg($otsikko,$teksti,$mama){
	$aika = urlencode(date(d.".".m.".".Y.", ".G.":".i.":".s));
	$otsikko = urlencode(strip_tags($otsikko,'<b><i><u>'));
	$teksti = urlencode(strip_tags(nl2br($teksti),'<b><i><u><br>'));
	global $msg_polku;
	global $id;
	$file = $msg_polku.$id.".txt";
	if(file_exists($file)){
		$nl = $teksti."&".$mama."&".$aika."&".$otsikko."&\n";
		$fp = fopen($file,"a");
		fwrite($fp, $nl);
		fclose($fp);
	}
}

function sort_msgs($viesti){
	for($i=0,$j=count($viesti);$i < count($viesti); $i++,$j--){
		$viesti[$i]["tord"] = $i;
	}
	for($i=0; $i< count($viesti); $i++){
	   $viesti[$i]["jnro"] = checkmoma($viesti[$i],$viesti);
	   if(!$viesti[$i]["jnro"]){
	   	$viesti[$i]["jnro"] = $viesti[$i]["nro"];
	   	$viesti[$i]["intendent"] = 0;
	   }else{
	   	$viesti[$i]["intendent"] = count($viesti[$i]["jnro"]);
	   	$viesti[$i]["jnro"] = new_order($viesti[$i]["jnro"],$viesti[$i]["tord"]);
	   }
	}
	usort($viesti, "jarjesta");
	return $viesti;
}

if($sendmsg && $teksti){
	add_msg($otsikko,$teksti,$mama);
	print "<i>lisätty</i><br>";
	unset($sendmsg);
	unset($teksti);
}

$viesti = sort_msgs(open_msgs($id.".txt")); //haetaan viestit

//tulostetaan
for($i=0; $i< count($viesti); $i++){
	if($viesti[$i]["aika"]){
	print "<div style='margin-left:".($viesti[$i]["intendent"]*15)."px'>"
	."<table border='0' cellpadding='2' cellspacing='0' width='100%'>"
	."<tr bgcolor='#CCCCCC'><td><b>"
	.urldecode($viesti[$i]["otsikko"])
	."</b> <font size='1' color='090909'>"
	.urldecode($viesti[$i]["aika"])
	."</font>"
	."</td>"
	."<td align='right'>"
	."<a href='$PHP_SELF?reply="
	.$i
	."&#vastaa"
	."'>vastaa</a>"
	."</td>"
	."</tr>"
	."<tr bgcolor='#EFEFFF'><td colspan='2'>"
	.urldecode($viesti[$i]["teksti"])
	."</td></tr></table>"
	."</div>"
	."<br>";
	}
}

?>
<a name="vastaa"></a>
<FORM METHOD="post" ACTION="<?php print $PHP_SELF;?>" ENCTYPE="multipart/form-data" id="thread">
kirjoita:<br>
<input type="text" name="otsikko" <?php if($reply){ print "value='RE: ".urldecode($viesti[$reply]["otsikko"])."'";}?> size="40">
<?php if($reply){ print "<input type='hidden' name='mama' value='".$viesti[$reply]["nro"]."'>";}?>
<br>
<textarea name="teksti" cols="40" rows="5"></textarea><br>
<input type="submit" name="sendmsg" value="lähetä">

Antti Laaksonen [10.12.2004 23:48:30]

#

Järjestäminen kyllä onnistuu tavalla tai toisella. En jaksa perehtyä koodiin tarkemmin, mutta kun viestit on järjestelty aiheiden mukaan, voinet vielä järjestellä aiheet ajan mukaan. Olisi hyvä, jos yksi kokonainen viestiketju olisi yksi suuremman taulukon alkio. Silloin järjestäminen ja alkioiden siirtely kävisi helposti. Jos jokin yksittäinen juttu ei meinaa onnistua, niin kysy toki lisää.

tso [13.12.2004 09:45:24]

#

Hmm, nyt kun palasin tuohon, niin en ole enää itsekään ihan 100 varma miten tuossa toimitaan (pitäisi varmaan kommentoida vähän enemmän silloin kun asiat ovat mukamas itsestäänselviä).

Käsittääkseni :) tuossa systeemissä viestit järjestetään luomalla viestikohtainen numerointi jonka ensimmäinen numero on ketjun "äiti" -> esim. jos viesti on "vastauksen-vastaus", niin viestin ensimmäinen numero on viestin numero johon ensimmäinen vastaus on vastaus. Todella sekavan kuuloista kirjoitettuna. Viimeinen numero on viestin rivinumero tekstitiedostossa. Tällä viimeisellä numerolla saadaan järjestettyä viestit aikajärjestykseen. Uusin viesti on tekstitiedostossa viimeisellä rivillä.

Näin jälkeenpäin tuo aikajärjestys tuntuu menevän enemmän oikein juuri noin että uudempi viesti menee hierarkiassa alaspäin. Siis luettavuuden kannalta. Ehkäpä paras olisi tuo nykyinen systeemi ja vain alimmalla tasolla olevat ketjujen aloitukset menisivät päinvastaisessa aikajärjestyksessä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta