Jak na strukturované komentáře – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak na strukturované komentáře – PHP – Fórum – Programujte.comJak na strukturované komentáře – PHP – Fórum – Programujte.com

 

Paja2
~ Moderátor
+2
Věrný člen
18. 11. 2007   #1
-
0
-

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.

Nahlásit jako SPAM
IP: 88.146.215.–
hrach
~ Redaktor
+1
Boss
18. 11. 2007   #2
-
0
-

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...

Nahlásit jako SPAM
IP: 193.179.169.–
http://jan.skrasek.com@hrachcz – webdeveloper
Paja2
~ Moderátor
+2
Věrný člen
18. 11. 2007   #3
-
0
-

To hrach :
Nejlepší by bylo kdyby mi někdo, kdo to má vytvořené třeba nějak podrobně popsal. Slyšel jsem, že by se při tom měla používata rekurze...tak nevím..

Nahlásit jako SPAM
IP: 88.146.215.–
bukaj0
Věrný člen
18. 11. 2007   #4
-
0
-

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.

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
Zelenáč0
Posthunter
20. 11. 2007   #5
-
0
-

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

Nahlásit jako SPAM
IP: 89.176.254.–
Paja2
~ Moderátor
+2
Věrný člen
21. 11. 2007   #6
-
0
-

To Zelenáč : Díky

Nahlásit jako SPAM
IP: 88.146.215.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 27 hostů

Podobná vlákna

Komentare — založil chape

Komentare.. — založil mORb

Komentare — založil cp.Hook

Komentáře — založil Jakub1

Komentare — založil Earl Cash

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý