Создать ответ 
Построение дерева иерархии или дерева комментариев
Автор Сообщение
Incognito Не на форуме
Лейтенант
*

Сообщений: 138
У нас с: Nov 2011
Сообщение: #11
RE: Построение дерева иерархии или дерева комментариев
Ок. Всё добавил, пока никаких видимых изменений не произошло, ждём продолжения. Спасибо!
19.07.2012 22:31:46
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,431
У нас с: Aug 2011
Сообщение: #12
RE: Построение дерева иерархии или дерева комментариев
Все так и должно быть.

Далее необходимо сформировать MySQL запрос на выборку нужного количества родительских комментариев и всех их потомков.

Для этого изменяем наш MySQL запрос:

Код:
$result = mysql_query("SELECT * FROM comment WHERE theme='".$_SESSION[mess_url]."' and moderation=1 ORDER BY id", $link);
$number = mysql_num_rows($result);

на такой:

Код:
$result = mysql_query("SELECT * FROM comment WHERE theme='".$_SESSION[mess_url]."' and moderation=1 and first_parent=0 ORDER BY id LIMIT ".($number_theme*5-5).",5", $link);
$number = mysql_num_rows($result);
$zapros='';
for ($n=1; $n<=$number; $n++) {
    $parents[$n]=mysql_fetch_array($result);
    $zapros.=$parents[$n][id].','.$parents[$n][id].',';
}
$zapros=substr($zapros, 0, -1);

$result = mysql_query("SELECT * FROM comment WHERE theme='".$_SESSION[mess_url]."' and moderation=1 and (id IN(".$zapros.") or first_parent IN(".$zapros."))", $link);
$number = mysql_num_rows($result);

Видимых изменений пока тоже не должно быть т.к. у нас пока все комментарии - родительские.
20.07.2012 16:25:00
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,431
У нас с: Aug 2011
Сообщение: #13
RE: Построение дерева иерархии или дерева комментариев
Сразу после MySQL запроса на выборки комментариев идет блок вывода комментариев:
Код:
if ($number>0) {
echo '<hr><div align="center" style="padding:3px; border-radius:5px;">
<u><b>Последние комментарии посетителей:</b></u><br>';

for ($n=1; $n<=$number; $n++) {
   //Тут вывод комментариев
}
echo '</div><br>';
}
else echo '<hr>';

Так вот, внутри этого блока, вместо второго цикла (скопируйте его, т.к. все, что внутри этого цикла нам понадобится позже) for ($n=1; $n<=$number; $n++) {} пишем следующее:

Код:
while ($comments=mysql_fetch_assoc($result)) $tags[(int)$comments['parent_id']][]=array((int)$comments['id'], $comments['message'], $comments['login'], $comments['date'], $comments['plus'], $comments['minus'], $comments['first_parent']);
echo parents().'</div>';

Это мы помещаем все полученные комментарии в массив и вызываем функцию построения иерархического дерева.

Теперь до MySQL запроса добавляем функцию построения иерархического дерева:

Код:
function parents($parent=0,$left=0) {
global $tags;

for ($i=0;$i<=count($tags[$parent])-1;$i++) {
if ($tags[$parent][$i][2]=='Administrator') $tags[$parent][$i][2]='<font color="#cc1111">Administrator</font>';
if ($tags[$parent][$i][6]==0) $tags[$parent][$i][6]=$tags[$parent][$i][0];
     echo '<div align="right" style="margin:0px 0px 0px '.$left.'px;">';

//Тут блок вывода комментариев (тот который надо было скопировать ранее)
//Все те строки, что начинаются с [b]echo[/b]

    if (isset($tags[ $tags[$parent][$i][0] ])) parents($tags[$parent][$i][0],20);
    echo '</div>';
}
}

А вот теперь надо быть внимательным.
Внутри функции parents() вместо переменных $comments[id], $comments[login] и т.д. следует писать $tags[$parent][$i][0], $tags[$parent][$i][1] и т.д.

После этого комментарии должны выводиться в виде дерева. Для проверки измените в MySQL в таблице comment в нескольких комментариях значения полей parent_id и first_parent, где parent_id - id предшествующего в ветке дереве комментария, а first_parent - id самого первого в ветке дереве комментария.
20.07.2012 17:51:29
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,431
У нас с: Aug 2011
Сообщение: #14
RE: Построение дерева иерархии или дерева комментариев
Если все прошло успешно, то Вы должны увидеть, что комментарии, ссылающиеся на родительские (имеющие значения в parent_id и first_parent) сдвигаются вправо.

Теперь остается только добавить кнопку ответа на комментарии (ранее мы уже добавили форму, которая изначально не видна).

Для этого внутри функции построения иерархического дерева в самом конце строчки вывода комментария (echo str_replace()...) добавляем нашу кнопку "Ответить".

Код кнопки:

Код:
<div align="center" style="width:100px; border: 1px solid #000;"><span class="size14" onClick="comm_on(0,'.$tags[$parent][$i][0].','.$tags[$parent][$i][6].')">Ответить</span></div>
20.07.2012 18:11:25
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,431
У нас с: Aug 2011
Сообщение: #15
RE: Построение дерева иерархии или дерева комментариев
Установил данный скрипт построения дерева комментариев себе на сайт.
Разбивку на странички делать не стал чтобы не плодить дубли тем с разными комментариями.

Пока полет нормальный.

[Изображение: parents_2.png]
20.07.2012 22:30:39
Найти все сообщения Цитировать это сообщение
Incognito Не на форуме
Лейтенант
*

Сообщений: 138
У нас с: Nov 2011
Сообщение: #16
RE: Построение дерева иерархии или дерева комментариев
Круто! Сейчас заценю! А у меня затык - не могу понять, у Вас написано что если добавить вот этот код (разумеется в замен старого):

PHP код:
$result mysql_query("SELECT * FROM comment WHERE theme='".$_SESSION[mess_url]."' and moderation=1 and first_parent=0 ORDER BY id LIMIT ".($number_theme*5-5).",5"$link);
 
$number mysql_num_rows($result);
 
$zapros='';
 for (
$n=1$n<=$number$n++) {
     
$parents[$n]=mysql_fetch_array($result);
     
$zapros.=$parents[$n][id].','.$parents[$n][id].',';
 }
 
$zapros=substr($zapros0, -1);

 
$result mysql_query("SELECT * FROM comment WHERE theme='".$_SESSION[mess_url]."' and moderation=1 and (id IN(".$zapros.") or first_parent IN(".$zapros."))"$link);
 
$number mysql_num_rows($result); 

То комментарии всё равно должны быть видны т.к. у них значение 0 по умолчанию, я же ставлю этот код и все комментарии пропадают...
Разумеется у меня "беседка" без модерации и я поставил значения and moderation=0
Ох какая крутотеь! То же себе хочу такое скорей!!!!
(Последний раз сообщение было отредактировано 20.07.2012 в 22:44:07, отредактировал пользователь Incognito.)
20.07.2012 22:36:41
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,431
У нас с: Aug 2011
Сообщение: #17
RE: Построение дерева иерархии или дерева комментариев
Попробуйте вывести на экран каждую переменную и найти ту, которая пустая.
Возможно, Вам надо заменить в LIMIT $number_theme на $comment_list. Посмотрите какая из переменных у Вас имеется (должна высчитывается при подсчете количества страничек с комментариями).
20.07.2012 22:48:47
Найти все сообщения Цитировать это сообщение
Incognito Не на форуме
Лейтенант
*

Сообщений: 138
У нас с: Nov 2011
Сообщение: #18
RE: Построение дерева иерархии или дерева комментариев
Понял, скажите а последовательность ячеек parent_id и first_parent, в базе после id может играть какое то значение?
20.07.2012 22:56:04
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,431
У нас с: Aug 2011
Сообщение: #19
RE: Построение дерева иерархии или дерева комментариев
Нет.
В коде везде мы обращаемся к ним по наименованию, а не по порядку.

Раз у Вас ничего не выводится, значит, проблема, скорее всего, в SQL запросе.
Попробуйте упростить запрос до такого (только для теста):
Код:
$result = mysql_query("SELECT * FROM comment WHERE theme='".$_SESSION[mess_url]."' ORDER BY id", $link);
20.07.2012 23:01:30
Найти все сообщения Цитировать это сообщение
Incognito Не на форуме
Лейтенант
*

Сообщений: 138
У нас с: Nov 2011
Сообщение: #20
RE: Построение дерева иерархии или дерева комментариев
(20.07.2012 23:01:30)Admin писал(а):  Нет.
В коде везде мы обращаемся к ним по наименованию, а не по порядку.

Ясно, спасибо, в общем, решил полностью с нуля начать (кроме базы) - думаю что где то косяк замутил, сейчас буду разбираться. Ещё раз спасибо!
(20.07.2012 23:01:30)Admin писал(а):  Попробуйте упростить запрос до такого (только для теста):
Код:
$result = mysql_query("SELECT * FROM comment WHERE theme='".$_SESSION[mess_url]."' ORDER BY id", $link);
Так, сработало! )) Первую строчку поменял на эту и комментарии появились...

Ага, убрал слово LIMIT и всё заработало:
$result = mysql_query("SELECT * FROM comment WHERE theme='".$_SESSION[mess_url]."' and moderation=1 and first_parent=0 ORDER BY id".($number_theme*5-5).",5", $link);

может там и не нужен вовсе LIMIT )))
(Последний раз сообщение было отредактировано 20.07.2012 в 23:20:50, отредактировал пользователь Incognito.)
20.07.2012 23:03:53
Найти все сообщения Цитировать это сообщение
Создать ответ 


Переход:


Пользователи просматривают эту тему: 1 Гость(ей)


LiveInternet
© Copyright 2011-2024 by UsefulScript.ru