Ограничение вложенности древовидных комментариев
Здравствуйте! Сделал у себя на сайте древовидные коментарии по уроку Попова, смог связать с профилем пользователя, сделать цитирование.
Вид комментириев. 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]), ну это я всего лишь считаю потомков( |
Цитата:
Можешь проставить классы типа comment-level-1, comment-level-2. А можешь через селекторы типа: .comments .comment .comment .comment .comment{ padding-left: 0; } Классы наверно лучше ) |
Кстати, посмотрел - на habr.ru именно так и сделано. А ограничивающий селектор там такой:
.comments_list .comment_item .reply_comments .comment_item .comment_item .comment_item .comment_item .comment_item .comment_item .comment_item .comment_item .comment_item .comment_item .comment_item .comment_item .comment_item{} |
Не совсем понял, если я напишу на подобии этого
#commentRoot .comment .comment Ничего не выйдет. У меня структура такая <ul id="commentsRoot32"> Общий ul <li id="comment74"> Корневой <div class="commentContent"> <h6> <div class="comment"> ываыва </div>Текст корневого </div> <ul id="commentsRoot74">Уже начало вложенного комментария <li id="comment89">... И т.д. </ul> </li>... Получается, что .comment не лежит внутри .comment. И почему ваша строчка должна сдвигать все последующие, разве она не ориентирована лишь к одному определенному комментарию? Ну или я просто нубски туплю и ничего не понимаю(( |
Цитата:
У тя же коммент лежит внутри другого коммента, так? Просто мож класс другой (или не проставлен вообще). Цитата:
|
Ну у меня что то типа такого
<ul> <li> <ul> <li> <ul> <li> <li> и т.д. |
Спасибо Вам!! кажись получилось, прописал
#commentRoot li ul li ul li ul { padding-left: 0; } |
Часовой пояс GMT +3, время: 03:05. |