Реализация древовидных-комментариев

ShVad

JSmart CMS
Здравствуйте

Начал переписывать свою систему, решил посоветоваться на счет древовидных-комментариев. Пришло две идеи (старая и новая).

Первая:
id | parent_id

Получаем из бд массив и начинаем его обрабатывать рекурсией. Дерево образуется таким образом:

PHP:
<див основной>
     <див комента>Комент</див комента>
     <див с падингом 20>тут прогоняем эту же функцию со значением parent_id от основного коммента</div>
</див основной>
Как такой вариант?

Второя:
id | parent_id | level

Когда мы отвечаем на комментарий level у нового комментария ставится как у родительского + 1. В итоге получается, что в бд уже будет храниться информация сколько делать отступ. Вывод примерно такой:

PHP:
<див комента паддинг по level>Комент</див комента>
Вроде вариант по проще, но коменты будут выводиться как обычные только с отступом с лева.

При удаление придется делать апдейт level - 1 where parent_id = удаляемой ид.

Какой вариант лучше? Может кто предложит более удобные методы реализации?

Еще такой вопрос.
Нужна ли в комментариях разбивка на страницы (у всех разное мнение по этому вопросу )?

Спасибо
 

Lews

Новичок
Есть вариант - nested sets. Очень удобно для различных выборок, но менее удобно для обновления.
 

ShVad

JSmart CMS
Я использую актив рекордс, хотелось бы обойтись стандартными решениями
 

KorP

Новичок
у меня не камменты, но тоже древовидная структура, юзаю - id | parent_id, меня устраивает более чем, а падинг можно и без level сделать - он нафиг не нужен
 

rotoZOOM

ACM maniac
Для вывода отзывов использую ul, li.
В базе храню, id, parent_id, root_id(головной пост)
 

ShVad

JSmart CMS
правильней вставлять суб комментарий в комментарий?

Чем хуже если использовать level?
 

tz-lom

Продвинутый новичок
правильней вставлять суб комментарий в комментарий?

Чем хуже если использовать level?
тем что тебе придётся пихнуть в шаблон расчёт отступа, а это мерзко и противно
так же ты потеряешь эту вложенность в HTML и если когда нибудь ты захочешь делать что то на JS с комментариями тебе придётся восстанавливать эти вложения из дурацких отступов, что тоже не хорошо
 

ShVad

JSmart CMS
Спасибо за советы, сделаю рекурсивно так же как и было.

А что скажете по поводу разбивки комментариев на страницы? Надо ли это? Я делаю комментарии как плагин, вставил тег в любом месте и вывелись комментарии и форма ответа.
Сделать переход по страницам если только через ajax, но тогда поисковики не будут индексировать эти страницы (а надо ли это?). Можно конечно сделать если js не работает ссылки на отдельные страницы (что то вроде последние комментарии, но только для определенной записи).
 

ShVad

JSmart CMS
Вот такой код:

PHP:
function show($entry_id = '', $app_name = '')
{
    $entry_id = intval($entry_id);

    $app_name = (!$app_name) ? $this->router->class : $app_name;

    $query = $this->get_query(0, $app_name, $entry_id);

    $comments = '';

    foreach ($query as $row) {
        if ($row['parent_id'] == 0) {
            $comments .= $this->comment_build($row, $row['id'], &$query);
        }
    }

    $data = array('sing' => base64_encode($this->router->class . '||' . $entry_id),
        'comments' => $comments);

    return $this->template->parse('comments', $data, true);
}

function comment_build($row, $parent_id = 0, &$query)
{
    $row['comments'] = '';

    foreach ($query as $sub_row) {
        if ($sub_row['parent_id'] == $parent_id) {
            $row['comments'] .= $this->comment_build($sub_row, $sub_row['id'], &$query);
        }
    }

    $comments = $this->template->parse('comment', $row, true);

    return $comments;
}
Может есть какие нибудь идеи по оптимизации кода?
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
древовидные комментарии - зло
 

ShVad

JSmart CMS
Он как бы не имеет отношение к рекурсии...
PHP:
function get_query ($id = 0, $app_name = '', $entry_id = '', $start = FALSE, $limit = FALSE)
    {
        $id = intval ($id);
        
        if ($id)
        {
            $this->db->where(array('id' => $id));
        }
        else
        {
            $this->db->where(array('app_name' => $app_name, 'app_entry_id' => $entry_id));
        }
        
        $query = $this->db->join('users', 'users.user_id = comments.user_id', 'left')
                          //->order_by('id', 'desc')
                          ->get('comments', $limit, $start)->result_array();
                          
        return $query;
    }
 
Сверху