Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.10.2014, 22:13
Интересующийся
Отправить личное сообщение для TheDude Посмотреть профиль Найти все сообщения от TheDude
 
Регистрация: 24.05.2014
Сообщений: 25

Ограничение вложенности древовидных комментариев
Здравствуйте! Сделал у себя на сайте древовидные коментарии по уроку Попова, смог связать с профилем пользователя, сделать цитирование.
Вид комментириев.
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]), ну это я всего лишь считаю потомков(
Ответить с цитированием
  #2 (permalink)  
Старый 13.10.2014, 08:16
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от TheDude
а добавлять ответ в тег li, который будет находиться на одном уровне от предыдущего комментария.
Я думаю тебе нужно убрать иерархию чисто визуально, через CSS. Тогда, можно, в зависимости от ширины экрана изменять максимальную глубину комментариев.
Можешь проставить классы типа comment-level-1, comment-level-2.
А можешь через селекторы типа:

.comments .comment .comment .comment .comment{
    padding-left: 0;
}


Классы наверно лучше )
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #3 (permalink)  
Старый 13.10.2014, 08:23
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Кстати, посмотрел - на 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{}
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #4 (permalink)  
Старый 13.10.2014, 10:09
Интересующийся
Отправить личное сообщение для TheDude Посмотреть профиль Найти все сообщения от TheDude
 
Регистрация: 24.05.2014
Сообщений: 25

Не совсем понял, если я напишу на подобии этого
#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.
И почему ваша строчка должна сдвигать все последующие, разве она не ориентирована лишь к одному определенному комментарию?
Ну или я просто нубски туплю и ничего не понимаю((
Ответить с цитированием
  #5 (permalink)  
Старый 13.10.2014, 10:28
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от TheDude
Получается, что .comment не лежит внутри .comment.
Ну я абстрактно класс на писал. Я даже не смотрел на твой код.
У тя же коммент лежит внутри другого коммента, так? Просто мож класс другой (или не проставлен вообще).
Сообщение от TheDude
И почему ваша строчка должна сдвигать все последующие
Она не сдвигает, а наоборот, убирает сдвиг у слишком глубоких комментов. Предпологается что у тебя уже прописан сдвиг через padding-left
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #6 (permalink)  
Старый 13.10.2014, 10:51
Интересующийся
Отправить личное сообщение для TheDude Посмотреть профиль Найти все сообщения от TheDude
 
Регистрация: 24.05.2014
Сообщений: 25

Ну у меня что то типа такого
<ul> 
    <li>
        <ul>
               <li>
                      <ul>
                             <li>
                             <li>

и т.д.
Ответить с цитированием
  #7 (permalink)  
Старый 13.10.2014, 10:56
Интересующийся
Отправить личное сообщение для TheDude Посмотреть профиль Найти все сообщения от TheDude
 
Регистрация: 24.05.2014
Сообщений: 25

Спасибо Вам!! кажись получилось, прописал
#commentRoot li ul li ul li ul {
    padding-left: 0;

}
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
скрипт разворачивающегося блока для комментариев — 10$ wlad2 Работа 2 13.02.2014 19:01
Загрузка блока комментариев facebook Mateus Элементы интерфейса 1 14.11.2013 13:26
Получение количества комментариев из сервиса cackle.ru iskiz Общие вопросы Javascript 6 13.03.2012 18:14
Система Комментариев на yTube JAScript AJAX и COMET 2 03.02.2011 17:28
ограничение на объем передаваемых данных belbek AJAX и COMET 3 31.10.2010 02:45