Здравствуйте! Сделал у себя на сайте древовидные коментарии по уроку Попова, смог связать с профилем пользователя, сделать цитирование.
Вид комментириев.
http://hostingkartinok.com/show-imag...c5516405b4896a
Но из-за плохих знаний php не знаю, как можно ограничить вложенность комментариев. К примеру, если вложенных комментариев больше 3, уже дальше не добавлять вложенный ul, уходящий дальше вправо и ломать сайт, а добавлять ответ в тег li, который будет находиться на одном уровне от предыдущего комментария.
Что бы получилось что то типа такого:
http://hostingkartinok.com/show-imag...8b436ff386f16d
Вот шаблон вывода комментариев comment_template.php:
<li id="comment<?php echo $comment[id]?>">
<div class="commentContent">
<h6><?php echo $comment[name]?>(тут выведется имя) <span><?php echo $comment[date_add]?>(дата)</span> </h6>
<div class="comment">(сам комментрий)
<?php echo $comment[comment]?>
</div>
<?php if($_SESSION['login']) {echo "<a class='reply' href='#comment$comment[id]'>ответить</a>";} ?> (это не берите в голову)
</div>
<?php if($comment[childs]) { ?> (если есть потомки)
<ul id="commentsRoot<?php echo $comment[id]?>">
<?php echo commentsString($comment[childs]) ?>(выводим потомки)
</ul>
<?php } ?>
</li>
Его подключаю к главной странице
<?php echo $comments; ?>
Сам php обработчик comments.php
<?php
require_once 'database.php';
$sql = "
SELECT id, parent_id, name, comment,
DATE_FORMAT(date_add, '%d %M %Y %H:%i') as date_add
FROM comments WHERE news_id='$id'
";
$query = mysql_query($sql);
while($row = mysql_fetch_assoc($query))
{
$data[$row[id]] = $row;
}
//превращаем в иерархию
function mapTree($dataset) {
$tree = array(); // Создаем новый массив
/*
Проходим в цикле по массиву $dataset, который был передан в качестве аргумента.
в $id будет попадать уникальный id комментария,
&$node - обратите внимание, работаем со значением по ссылке!
*/
if ($dataset>0) {
foreach ($dataset as $id=>&$node) {
if (!$node['parent_id']) { // не имеет родителя, т.е. корневой элемент
$tree[$id] = &$node;
} else {
/*
Иначе это чей-то потомок
этого потомка переносим в родительский элемент,
при этом у родителя внутри элемента создастся массив childs, в котором и будут вложены его потомки
*/
$dataset[$node['parent_id']]['childs'][$id] = &$node; //
}
}
}
return $tree;
}
function commentsToTemplate($comment)
{
/* $comment - массив комментария - имя, дата, коммент, потомки (если есть) */
/* Включаем буферизацию вывода, чтобы шаблон не вывелся в месте вызова функции.
*/
ob_start();
// Подключаем шаблон comment_template.php, который просто таки ждет наш массив $comment ))
include 'comment_template.php';
$comments_string = ob_get_contents(); // Получаем содержимое буфера в виде строки
ob_end_clean(); // очищаем буфер
return $comments_string;
// Можно применить более короткую запись - return ob_get_clean(); вместо $comments_string = ob_get_contents(); ob_end_clean(); return $comments_string;
}
function commentsString($data)
{
foreach($data as $w)
{
$string .= commentsToTemplate($w);
}
return $string;
}
$data = mapTree($data);
$comments = commentsString($data);
$data = null;
?>
Как я понимаю, нужно как то прописать, если у потомка больше 3-х родителей ul, не добавляй вложенность <ul></ul> а добавь на одном уровне <li></li>
Помогите пожалуйста, осталась самая сложная для меня задача, буду очень благодарен за помощь))
Пытался что нибудь сделать, допер только до этого count($comment[childs]), ну это я всего лишь считаю потомков(