Mohl by mi někdo poradit jak bych mohl vytvořit strukturované komentáře pod články. Chtěl bych to vytvořit podobně jako je tomu u článků na tomto webu.
Fórum › PHP
Jak na strukturované komentáře
To Paja2 : strašně moc verzí. nejjednodušší je každému komentíři přidat sloupec s id komentare na ktery reagujes. to id pridas napr pomoci nejakehjo tlacitka do skryteho vstupniho pole...
Paja2
Google zase nefunguje? Počkat... Mě ano. Proč ho tedy nevyužít?
Hezké články o struktrované diskusi či diskusi s reakcemi jsou na intervalu (http://interval.cz) a php.vrana.cz (http://php.vrana.cz/). Stačí jen hledat.
PS. Když řešíš nějaký problém, řekni si: ,,Mohl to řešit již někdo přede mnou?`` Zní-li odpověď ano, pohledej Googlem.
To Paja2 :
Nakonec jsem se rozhodl, že ten článek nevydám.. Na netu toho je dost. Stručně tu popíšu snad tu nejjednodušší variantu, jak "strukturovanou diskuzi vytvořit.
Začnu strukturou db: tabulka 'diskuze' bude mít čtyři sloupce. První, 'id', bude sloužit jednak jako jedinečný identifikátor (PRIMARY KEY) a jednak bude určovat stáří příspěvku (AUTO_INCREMENT - příspěvky s nižším ID jsou starší). Dále tu budou celkem nedůležité sloupce 'name' (uchovávající titulek) a 'post' (samotný text příspěvku). Následně můžeš přidat jméno, kontaktní údaje apod. Nakonec ještě sloupec 're', do kterého se bude ukládat ID příspěvku, na který záznam reaguje.
CREATE TABLE `diskuze` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 300 ) NOT NULL ,
`post` TEXT NOT NULL ,
`re` TINYINT NOT NULL
)
Script se skládá ze tří souborů. První obsahuje funkce a konstanty - fce.php. Druhý, send.php ukládá příspěvky do databáze a třetí, index.php, se stará o samotné zobrazování příspěvků a formuláře.
fce.php
"konstanty" pro připojení k databázi:
$server = "localhost";
$login = "login";
$password = "heslo";
$database = "diskuze";
$encoding = "UTF-8";
$table = "diskuze";
hlášky oznamující uživateli úspěšnost akcí
$err[1] = "Příspěvek byl uložen!";
$err[2] = "Titulek je moc dlouhý!";
$err[3] = "Prázdný titulek!";
$err[4] = "Prázdný text!";
$err[5] = "Neznámá chyba!";
připojení k databázi: při úspěchu vrací spojení, při neúspěchu false:
function db_connect($server, $login, $password, $database, $encoding){
$connection = mysql_connect($server, $login, $password);
if(!$connection){
return false;
}
if(!mysql_select_db($database)){
return false;
}
mysql_query("SET CHARACTER SET ".$encoding);
mysql_query("SET NAMES ".$encoding);
return $connection;
}
Funkce pro převod uživatelem zadaného textu do formy použitelné v DB a naopak
function plain2db($str){
return mysql_real_escape_string(htmlspecialchars($str));
}
function db2plain($str){
return stripslashes($str);
}
set_error přesměruje script na index.php a předá číslo chyby (index pole $err). Funkce get_error vypíše chybu.
function set_error($num){
Header("Location: index.php?e=".$num);
}
function get_error($num){
global $err;
$num = intval($num);
return $err[$num];
}
Na konci souboru se bude nacházet ještě f-ce show_post - jak asi název napovídá, tato f-ce se bude starat o zobrazování příspěvků. Pro lepší pochopení si ji ovšem nechám až na konec.
index.php
<?
require("fce.php");
echo('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/2002/REC-xhtml1-20020801/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Strukturovaná diskuze</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
');
@db_connect($server, $login, $password, $database, $encoding) or die(" Nepodařilo se připojit k databázi!\n </body>\n</html>");
$error = get_error($_GET["e"]);
if($error){
echo(' <strong>'.$error.'</strong><hr />'."\n");
}
show_posts(0);
echo('
<hr />
<form action="send.php" method="post">
<strong>Titulek:</strong>
<input type="hidden" name="re" value="'.$_GET["re"].'" />
<input type="text" name="name" size="60" value="'.urldecode($_GET["title"]).'" />
<strong>Text:</strong>
<textarea name="post" cols="80" rows="10"></textarea>
<input type="submit" value="Odeslat" />
</form>
</body>
</html>
');
?>
Na začátku zaprvé "includneš" soubor fce.php. Po vypsání XHTML hlavičky se script pokusí navázat spojení s databází. Znak '@' (zavináč) potlačí případný chybový výstup. F-ce get_error získá "chybovou" hlášku obstaranou scriptem 'send.php' a následně ji také zobrazí. K show_post se, jak jsem psal před chvílí, vrátím až na konci. A konečně formulář - input 're' bude uchovávat ID příspěvku, na který bude uživatel reagovat. Ostatní součásti jsou doufám jasné.
Poslední (vlastně předposlední) script, který zbývá naprogramovat, je send.php, ukládájící příspěvky do databáze.
Includnutí souboru soubor 'fce.php' a připojení k databázi:
require("fce.php");
@db_connect($server, $login, $password, $database, $encoding) or die('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/2002/REC-xhtml1-20020801/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Strukturovaná diskuze</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
Nepodařilo se připojit k databázi!
</body>
</html>');
Zápis $_POST[...] je děsně zdlouhavý...
$name = $_POST["name"];
$post = $_POST["post"];
$re = $_POST["re"];
Vyplnil uživatel všechna políčka?
if(!$name){
set_error(3);
}
if(!$post){
set_error(4);
}
Převod proměnných do použitelné podoby. Je důležité si teď uvědomit, že pokud bude '$re' prázdná, intval vrátí '0'!
$name = plain2db($name);
$post = plain2db($post);
$re = intval($re);
Kontrola délky titulku:
if(strlen($name) > 300){
set_error(2);
}
Uložení dat:
$q = mysql_query("INSERT INTO ".$table."(name,post,re) VALUES('".$name."','".$post."',".$re.");");
if(!$q){
set_error(5);
}
set_error(1);
A teď konečně slibovaná funkce show_posts:
function show_posts($num, $odsazeni=0){
$q = mysql_query("SELECT id,name,post FROM diskuze WHERE re=".$num." ORDER BY id ASC;");
if(!$q){
return;
}
Mysql_query vybere všechny příspěvky, kde se 're' rovná prvnímu parametru f-ce. Příspěvky, které na nic NEreagují, mají v 're' uloženo '0'! Seřazené budou od nejstaršího po nejnovější (ORDER BY id ASC). Pokud je chceš mít seřazené naopak (tedy nejstarší dole a nejnovější nahoře), stačí pouze změnit "ASC" na "DESC".
Cyklus bude postupně procházet všechny příspěvky a rekurzivně volat 'show_post' - pokaždé s $odsazeni o jedna větší. První argument je ID příspěvku, takže show_post zobrazí všechny příspěvky, které na něj reagují. Takhle se to bude opakovat pořád dokola, dokud budou existovat nějaké reagující příspěvky.
while($res = mysql_fetch_array($q)){
$res["name"] = db2plain($res["name"]);
$res["post"] = db2plain($res["post"]);
echo(" <div style=\"margin-left: ".($odsazeni*20)."px; margin-bottom: 20px;\">\n <strong>");
echo($res["name"]."</strong> <a href=\"index.php?re=".$res["id"]."&title=".urlencode('Re: '.$res["name"])."\">reagovat</a><br />\n ".$res["post"]."\n </div>\n");
show_posts($res["id"], $odsazeni+1);
}
}
Pro rejpaly: to zaměňování skrytého inputu 're' by bylo samozřejmě lepší realizovat pomocí JavaScriptu, to teď ale není to hlavní ;-)
Zdrojáky si můžeš stáhnout na http://programujte.com/index.php?akce=download
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Moderátoři diskuze