Prakticky s MySQL - 10. díl

Abychom mohli odpovídat v naší diskusi na příspěvky, upravíme si dnes i její základní strukturu.

Odpovídání na příspěvky

Již z úvodního popisu systémů diskusí vyplynulo, že jednou z klíčových vlastností diskusí je možnost odpovídání na příspěvky. To může být opět provedeno několika způsoby, jedním z těch jednodušších je využívání titulkování RE: a kopírování zprávy, na níž odpovídáme, do té aktuální. Tento způsob není na realizaci příliš náročný a proto si jej dnes také předvedeme.

Další možností pak při odpovídání na příspěvky je indexování odsazení příspěvku – představme si, že příspěvky vypisujeme coby tabulky do polí základní tabulky systému. Základní tabulka systému má 20 sloupců o šířce x pixelů. My tedy měníme počtem sjednocených buněk, do kterých zasahuje příspěvek jeho pomyslné odsazení od okraje a tak i graficky můžeme až do určité úrovně vidět systém odpovědí na příspěvky. V lepší verzi tohoto případu dokonce příspěvky řadíme pod ty, na něž odpovídají a tvoříme tak strom odpovědí.

A právě zmíněný strom odpovědí je pak ve své „ořezané“ podobě základem dalšího z typů odpovědí schopných diskusních fór, kdy se uživateli nabídne nejprve seznam všech takto setříděných příspěvků a možnost vypsat jen některé, odpovědi na daný příspěvek či vše. My se tedy na takovéto odpovídání podíváme pěkně popořadě.

RE: Odpovídání na příspěvky

Při prvním jednoduchém odpovídání na příspěvky není ani třeba upravovat SQL tabulku, stačí pomocí javascriptu ošetřit odpovídání na příspěvky. My si tedy představíme ukázkovou možnost využití odpovědi pomocí jména a kopie stávajícího příspěvku pouhým přesunem textu s možností editace, ale šlo by to řešit i načtením textu, na který odpovídáme, v nezměněné podobě z databáze – to už bychom se ale sloupci navíc v tabulce SQL nevyhnuli – pokud bychom nevkládali do příspěvku nějaký speciální kód, ze kterého bychom poté ID potřebného příspěvku získali.

Základním kamenem odpovídání je tato funkce:

<script>
function ok(Name,In)
{
var id;
var obsah;   
id = "RE: "+ Name;
obsah = "<cite>" + In +"</cite><br><br>";
form.Jmeno.value=id;
form.Obsah.focus();
form.Obsah.value=obsah;
}
</script>

Jejími parametry jsou jméno a obsah minulého příspěvku. Nejprve v ní vytvoříme nový název příspěvku a poté i nástin nové hlavičky odpovědi na příspěvek, všechny tyto údaje má uživatel ještě možnost editovat.

Dalším krokem je přiřadit na tuto funkci odpovídající navázání v kódu spolu s možností odpovědi u každého příspěvku dle tohoto modelu:

<a href="javascript:ok(`<?echo $Jmeno;?>`,`<?echo $Obsah;?>`)" name=“<?echo $Jmeno;?>“>Odpovědět</a>

Celý proces odpovídání pak vyústí podobně jako níže předvedený systém naší diskuse (prozatím bez jména příspěvku):

Aby se naše příspěvky správně zobrazovaly, povolíme některé HTML tagy při přispívání:

//if(Ereg("<br>",$Obsah)):
$Obsah=EReg_Replace("<br>","..maskovanebr..",$Obsah);
//endif;

//if(Ereg("<cite>",$Obsah)):
$Obsah=EReg_Replace("<cite>","..maskovanecite..",$Obsah);
//endif;

//if(Ereg("</cite>",$Obsah)):
$Obsah=EReg_Replace("</cite>","..maskovanecite2..",$Obsah);
//endif;

$Obsah=HTMLSpecialChars($Obsah);

//if(Ereg("..maskovanebr..",$Obsah)):
$Obsah=EReg_Replace("..maskovanebr..","<br>",$Obsah);
//endif;

//if(Ereg("..maskovanecite..",$Obsah)):
$Obsah=EReg_Replace("..maskovanecite..","<cite>",$Obsah);
//endif;

//if(Ereg("..maskovanecite2..",$Obsah)):
$Obsah=EReg_Replace("..maskovanecite2..","</cite>",$Obsah);
//endif;

A zdrojový kód odkazu je generovaný potom třeba takovýto:

<a href="javascript:ok(`<cite>ff</cite>.<br><br>ll`)">Odpovědět</a>

Jméno příspěvku

Dalším upgradem naší diskuse bude přidání položky jména příspěvku. Nebude to nic těžkého, stačí přidat jeden sloupec do tabulky diskusních příspěvků:

PHPMyAdmin je užitečný pomocník:)

Dalším krokem je úprava položek při vkládání příspěvků jak ve formuláři, tak v následujícím skriptu. Formulář tedy bude vypadat třeba takto (použitím metody POST při odeslání dat se data nebudou odesílat přes příkazový řádek, ale v těle dokumentu a při nechtěném návratu na takto volaný skript bude uživatel upozorněn na nutnost znovu odeslat data):

<form action="pridejprispevek.php" name=form id=form onsubmit="return validate(this)" method=“POST“>
<table align=center>
<tr align=center>
<td>Jméno příspěvku</td>
<td>Autor</td>
<td>Email</td>
</tr>
<tr>
<td><input name=Jmeno></td>
<td><input name=Autor value=Anonym></td>
<td><input name=Email></td>
</tr>
<tr>
<td colspan=3><textarea name=Obsah cols=56 rows=10></textarea></td>
</tr>
<tr align=center>
<td align=center colspan=3><input type="submit" value="Šup tam s tím" class=input></td>
</tr>
</table>
</form>

Poslední úpravy bude tvořit skript pro zápis dat do tabulky:

$query=MySQL_Query("Insert into Diskuse values(null,`$Jmeno`,`$Obsah`,`$Autor`,`$Email`,`$Datum`)");

a výpis příspěvků (tentokrát si uvedeme celý dokument bez nutnosti logování):

diskuse.php

<?
include("in.php");

if($chyba!=0):

if($chyba==1):
$text="Bohužel se nepovedlo přispět do diskuse chybou serveru.";
else:
$text="Neoprávněný příspěvěk.";
endif;

echo"<script>alert(`$text`);</script>";

include("login.htm");
else:

?>
<LINK href="main.css" rel=StyleSheet type=text/css>
<center>
<h3>Diskuse</h3>
<?
include("pridatprispevek.php");

$x=10;
$queries=MySQL_Query("Select ID from Diskuse");
$test=MySQL_Num_Rows($queries);

if($test>0):


$stranek=Ceil($test/$x);

if($ak==0):
$ak=1;
endif;

$xy=(($ak*$x)-$x);
$query=MySQL_Query("Select * from Diskuse order by ID DESC limit $xy,$x");?>
<script>
function ok(In)
{
var obsah;   
obsah = "<cite>" + In +"</cite><br><br>";
form.Obsah.focus();
form.Obsah.value=obsah;
}
</script>

<?
while($fetch=MySQL_Fetch_Array($query)):

$ID=$fetch["ID"];
$Obsah=$fetch["Obsah"];
$Autor=$fetch["Autor"];
$Email=$fetch["Email"];
$Datum=$fetch["Datum"];
$Jmeno=$fetch["Jmeno"];

echo "<table width=550 border=1 style=`border-width:1;border-color:maroon;font-size:12`><tr><td align=center colspan=2 style=`border-width:0;border-color:maroon;background-color:maroon;color:white`>$Jmeno</td></tr><tr><td align=left valign=center style=`border-width:0;border-color:maroon;`>";

if($Email!=""):
echo"<a href=`mailto:".$Email."`>".$Autor."</a>";
else:
echo "<b>".$Autor."</b>";
endif;

echo "</td><td align=right><small>".$Datum."</small>";?>  <a href="javascript:ok(`<?echo $Obsah;?>`)">Odpovědět</a></td></tr><?
echo"<tr><td colspan=2 align=center valign=center style=`border-width:0;border-color:maroon;`>".$Obsah."</td></tr></table><br>";

endwhile;
?>
Stránka:
<?
if(($ak!=1)and($stranek>1)):
$aka=$ak-1;
echo"<a href=`diskuse.php?ak=$aka&Login=$Login&Heslo=$Heslo`><<</a>";
endif;

$s=1;
while($s<=($stranek)):

$ted=($s*$x);
$pak=$ted-$x;

if($s!=$ak):
echo " <a href=`diskuse.php?ak=$s&Login=$Login&Heslo=$Heslo`>".$s."</a>";
else:
echo " ".$s;
endif;

$s+=1;
endwhile;

$akaa=$ak+1;
if($akaa<=$stranek):
echo" <a href=`diskuse.php?ak=$akaa&Login=$Login&Heslo=$Heslo`>>></a>";
endif;

else:
echo"Zatím v naší diskusi nejsou žádné příspěvky.";
endif;

endif;

?>

Všechny možné varianty příspěvků v diskusi.

Dodělávky

V následujícím pokračování našeho seriálu si již doděláme slíbené vypisování příspěvků pomocí jejich hierarchie.

Váš názor Další článek: RivaTuner v2.0 Release Candidate 11.1

Témata článku: , , , , , , , , , , , , , , , , ,