Скрипт древовидных комментариев PHP
index.php
<?
$conf['db'] = array(
"server"=>"localhost",
"user"=>"root",
"pass"=>"",
"base"=>"superbase"
);
mysql_connect($conf['db']['server'], $conf['db']['user'], $conf['db']['pass'])or die("Could not connect: ".mysql_error());
mysql_select_db($conf['db']['base'])or die("Could not select: ".mysql_error());
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");
if($_GET['op'] === 'clear-all'){
mysql_query("DELETE FROM les_comments");
header("Location: index.php");
}
$time = time();
if(isset($_POST['uname'])){
$uname = mysql_real_escape_string($_POST['uname']);
setcookie("unamecom", $uname, $time + 1209600); // время существования куки две недели
}elseif(isset($_COOKIE["unamecom"])){
$uname = mysql_real_escape_string($_COOKIE["unamecom"]);
}else{
$uname = "Аноним";
}
if(!empty($_POST['uname']) && !empty($_POST['message']) && $_POST['op'] == 'add-comment') {
$comment = mysql_real_escape_string(strip_tags($_POST['message'], "<p><b><i><font><img>")); // удалим левые теги
$ip = $_SERVER['REMOTE_ADDR'];
$client = $_SERVER['HTTP_USER_AGENT'];
$content_id = intval($_POST['content']);
$parent_id = intval($_POST['parent']);
mysql_query("INSERT INTO les_comments (`id`, `name`, `ip`, `client`, `comment`, `content_id`, `parent_id`, `time`) VALUES (NULL, '$uname', '$ip', '$client', '$comment', '$content_id', '$parent_id', '$time')");
}
/*
*/
$content_id = 0; // это ключевой идентификатор от конкретной статьи(комменты то разные в каждой статье, помним?)
// выводим комменты
$msg = array();
$result = mysql_query("SELECT * FROM les_comments WHERE content_id='$id'");
while($row = mysql_fetch_assoc($result)){
$msg[] = $row;
}
$count = count($msg);
$parent = 0;
$form = "<div class='editor'>
<form id='comment-form' autocomplete='off' method='post'>
<input type='hidden' name='op' value='add-comment'>
<input type='hidden' name='content' value='{$id}'>
<input type='hidden' name='parent' value='{$parent}'>
<table border='0'><tr><td><input id='uname' name='uname' type='text' value='{$uname}' maxlength='20' size='25' /></td><td>Ваше имя*</td></tr></table>
<textarea name='message' rows='5' cols='65'></textarea><br><input id='submit' name='signup' type='submit' value='Добавить' /></div>
</form>";
$i = 0;
if($count){
$comments = "<div class='comments-all'><span style='float:left'>Всего комментариев: {$count}</span><span class='add-comment'>Написать комментарий</span></div>".$form;
$msg = crazysort($msg);
while($i<$count){
$margin = $msg[$i]['level'] * 20;
$date = date("d.m.Y в H:i",$msg[$i]['time']);
$comments .= "<div id='msg{$msg[$i]['id']}' style='margin-left: {$margin}px'><div class='comment-title'><span style='float:left'><b>{$msg[$i]['name']}</b> <small>({$date})</small></span><span class='comment-ans' id={$msg[$i]['id']}>ответить</span></div><div class='comment-message'>{$msg[$i]['comment']}</div></div>";
$i++;
}
}else{
$comments = "<div class='comments-all'><span style='float:left'>Эту новость ещё не комментировали</span><span class='add-comment'>Написать комментарий</span></div>".$form;
}
// функция сортирует массив по деревьям
function crazysort(&$comments, $parentComment = 0, $level = 0, $count = null){
if (is_array($comments) && count($comments)){
$return = array();
if (is_null($count)){
$c = count($comments);
}else{
$c = $count;
}
for($i=0;$i<$c;$i++){
if (!isset($comments[$i])) continue;
$comment = $comments[$i];
$parentId = $comment['parent_id'];
if ($parentId == $parentComment){
$comment['level'] = $level;
$commentId = $comment['id'];
$return[] = $comment;
unset($comments[$i]);
while ($nextReturn = crazysort($comments, $commentId, $level+1, $c)){
$return = array_merge($return, $nextReturn);
}
}
}
return $return;
}
return false;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.7.0/build/reset/reset-min.css"/>
<title>Древовидные комментарии для Вашего сайта</title>
<meta name="keywords" content="http://amatar.by комменты"/>
<link rel='stylesheet' type='text/css' href='css/style.css'/>
<script type='text/javascript' src='js/jquery-1.5.2.min.js'></script>
<body>
<div style='margin:0 auto; width:780px'>
<?
echo $comments;
echo "<center><a href='?op=clear-all'>очистить все комменты</a></center>";
?>
</div>
<script>
$(function () {
$('.add-comment').click(function(){
var editor = $('.editor');
if (editor.is(":hidden")){
editor.slideDown();
}else{
editor.slideUp();
}
return false;
});
$('.comment-ans').click(function(){
var $editor = $('.editor');
$editor.hide();
var mid = $(this).attr("id");
var clone = $editor.clone();
$editor.remove();
setTimeout(function(){
$(clone).css("margin", "5px 0 5px 20px");
$(clone).insertAfter("div#msg"+mid).slideDown();
$("input[name=parent]").val(mid);
}, 200);
});
});
</script>
</body>
</html>
sql
CREATE TABLE IF NOT EXISTS `les_comments` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
`ip` VARCHAR(15) NOT NULL,
`client` VARCHAR(250) NOT NULL,
`comment` TEXT NOT NULL,
`content_id` INT(11) NOT NULL DEFAULT '0',
`parent_id` INT(11) NOT NULL DEFAULT '0',
`time` INT(10) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
style.css
html,body{background-color:#C9CCCD;color:#000000;height:100%;font:normal 14px/20px arial}
.clear{clear:both}
.comments-all{font-size:12px;background-color:#E4E6E6; background-image:url('/images/h-rule.gif');background-repeat:no-repeat;margin-top:30px;margin-bottom:20px;padding:10px 20px; height:20px}
.add-comment{border-bottom:1px dashed #000; cursor:pointer; float:right}
.comment-title{font-size:12px; background-color:#EAEBEB; margin-top:20px; padding:5px 20px;height:20px}
.comment-message{font-size:12px; background-color:#F1F2F2; padding:5px 20px}
.comment{padding:40px 50px}
.editor{display:none; margin-top:1px;padding-top:20px; padding-left:20px;background-color:#F3F5F5}
.comment-ans{float:right; border-bottom:1px dashed #444; cursor:pointer}
#uname{font-size:16px; font-weight:bold;padding:5px;margin:10px 10px 10px 0}
#submit{padding:10px;margin:15px 0;font-weight:bold}