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

Сообщений: 311
У нас с: Nov 2014
Сообщение: #161
RE: Построение дерева иерархии или дерева комментариев
(15.04.2015 21:52:08)Admin писал(а):  Код скопировал, проверил, и он вполне рабочий (смещение комментариев присутствует).

Проверьте, при использовании кнопки "ответить", пишутся ли у Вас какие-либо значения в базу в столбцы parent_id и first_parent.

P.S. Просто сейчас из-за работы на сайт времени практически нет, в интернете появляюсь редко, но тему с добавлением комментариев уже давно планировал серьезно обновить.

Доброе время суток,
Проверил, значения в столбцах parent_id и first_parent и для наглядности сделал скриншот:

[Изображение: tid_135_parent.png]
в parent_id значение есть, а first_parent нет. Правильно?

Кнопка ответить работает, но появляется не из блока откуда вызывается форма, а ниже или выше смотря куда поместить код вызываемой формы, но как правильно реализовать не получается, хотя вся информация имеется.

В данный момент смещение комментариев работает, но не совсем корректно в плане отображения, что видно на скрине ниже:
[Изображение: tid_135_form.png]

Стрелки между родительскими и дочерними комментариями, отображаются не совсем корректно, не от блока ответа, а от кнопки ответить, которую не получается переместить например вправо.

echo '<div align="right" style="margin:0px 0px 0px '.$left.'px;">';

на:
if ($parent==0) echo '<div style="padding:5px 0px 0px 0px;">';
else {
if (count($tags[$parent])-1!=$i) echo '<div style="padding:5px 0px 0px '.$left.'px; background: url(image/strelka.png) no-repeat; border-left: 2px solid #000;">';
else echo '<div style="padding:5px 0px 0px '.$left.'px; background: url(image/strelka_2.png) no-repeat;">';
}

Хотел бы с вашей помощью, решить эти вопросы. Вроде работает, но данную форму не хотелось бы размещать на сайте, так как уж больно корявая в плане отображения. Html/css знаю достаточно неплохо, но средствами css не получается.
С уважением и заранее благодарен.
16.04.2015 21:37:42
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,279
У нас с: Aug 2011
Сообщение: #162
RE: Построение дерева иерархии или дерева комментариев
Если в parent_id имеется какое-то значение, то и в first_parent тоже должно быть что-то отличное от нуля.

Кнопку "ответить" в идеале надо просто поднять выше и включить в тело комментария, тогда со стрелками станет намного проще работать.

Все сделанные изменения описывать не буду, просто выложу исправленный код (тот, что Вы дали чуть раньше):
Код:
<?php
function parents($parent=0,$left=0) {
global $tags;

for ($i=0;$i<=count($tags[$parent])-1;$i++) {

$result_minus = mysql_query("SELECT sum(ocenka=1), sum(ocenka=0) FROM ocenka_comment WHERE comment_id='".$tags[$parent][$i][0]."' LIMIT 1");
$ocenka_com=mysql_fetch_array($result_minus);

if ($tags[$parent][$i][2]=='Администратор') $tags[$parent][$i][2]='<font color="#cc1111">Администратор</font>';
if ($tags[$parent][$i][6]==0) $tags[$parent][$i][6]=$tags[$parent][$i][0];
if ($parent==0) echo '<div style="padding:5px 0px 0px 0px;">';
     else {
     if (count($tags[$parent])-1!=$i) echo '<div style="padding:5px 0px 0px '.$left.'px; background: url(image/strelka.png) no-repeat; border-left: 2px solid #000;">';
     else echo '<div style="padding:5px 0px 0px '.$left.'px; background: url(image/strelka_2.png) no-repeat;">';
     }

//Тут блок вывода комментариев
echo '<table border="0" width="100%" style="border:1px solid #4874a3;" bgcolor="#fffabc"><tr>';
echo '<td align="left" style="padding:5px 5px 5px 5px;">';
echo '<div id="m'.$tags[$parent][$i][0].'"></div><b>'.$tags[$parent][$i][2].'</b></td>';
echo '<td width="140">';
echo '<span style="font-size:12px;">('.$tags[$parent][$i][3].')</span></td>';
echo '<td width="20" >';
echo '<form method="POST" action="'.$_SESSION[full_url].'#m'.$tags[$parent][$i][0].'">';
echo '<input type="hidden" name="comment_id" value="'.$tags[$parent][$i][0].'">';
echo '<input type="hidden" name="ocenka" value="1">';
echo '<input type="image" src="comm_up.gif" title="Хороший комментарий" align="middle">';
echo '</form></td>';
echo '<td width="5"><b>'.($ocenka_com[0]-$ocenka_com[1]).'</b></td>';
echo '<td width="20">';
echo '<form method="POST" action="'.$_SESSION[full_url].'#m'.$tags[$parent][$i][0].'">';
echo '<input type="hidden" name="comment_id" value="'.$tags[$parent][$i][0].'">';
echo '<input type="hidden" name="ocenka" value="0">';
echo '<input type="image" src="comm_down.gif" title="Плохой комментарий" align="middle">';
echo '</form></td></tr></table>';
echo '<table border="0" width="100%" style="border: 1px solid #eeeeee;" bgcolor="#f0fff0">';
echo '<tr><td width="100"><img src="'.$ava_user[$tags[$parent][$i][2]].'">';
echo '<td>';
if (($ocenka_com[0]-$ocenka_com[1])<0)
echo '<div><a href="javscript://" class="spoiler_links">Показать</a><div class="spoiler_body">'.wordwrap(nl2br($tags[$parent][$i][1]), 70, "\n", 1).'</div></div>';
else echo wordwrap(nl2br($tags[$parent][$i][1]), 70, "\n", 1);
echo '<div style="border: 1px solid #4874a3;float:right;width:90px;" align="center" class="open_hint" onClick="comm_on('.$tags[$parent][$i][0].','.$tags[$parent][$i][6].')">Ответить</div>';
echo '</td></tr></table>';
if (isset($tags[ $tags[$parent][$i][0] ])) parents($tags[$parent][$i][0],20);
echo '</div>';
}
}

$result = mysql_query("SELECT * FROM comment WHERE theme='spoiler_smooth_opening.php' and moderation=1 and first_parent=0 ORDER BY id".($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='spoiler_smooth_opening.php' and moderation=1 and (id IN(".$zapros.") or first_parent IN(".$zapros."))", $link);
$number = mysql_num_rows($result);



if ($number>0) {
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>';
echo '<div style="padding:3px;margin-top:10px; border-top:3px solid #09C;">
<p align="center"><strong>Последние комментарии посетителей:</strong></p><br></div>';
}

if (is_numeric($_POST[comment_id])and($_POST[ocenka]=='0' or $_POST[ocenka]=='1')){
$result = mysql_query("SELECT count(id),ocenka FROM ocenka_comment WHERE comment_id='".$_POST[comment_id]."' and ip='".$ip_short."'", $link);
$number = mysql_fetch_array($result);
if ($number[0]==0) {
$result = mysql_query("insert into ocenka_comment (date,comment_id,ip,ocenka) values ('".date("Y-m-d H:i:s")."','".$_POST[comment_id]."','".$ip_short."','".$_POST[ocenka]."')"); }
elseif ($number[ocenka]!=$_POST[ocenka]) {
$result = mysql_query("UPDATE ocenka_comment SET date='".date("Y-m-d H:i:s")."',ocenka='".$_POST[ocenka]."' WHERE comment_id='".$_POST[comment_id]."' and ip='".$ip_short."'"); }
}
?>

<div id="hint" style="position:absolute; display: none;">
<?php echo '<form name="add_comment" method="POST" action="'.$_SESSION[mess_url].'#last">'; ?>
<table border="0" style="border: 1px solid #4874a3; border-radius:8px;" bgcolor="#7799ee" cellspacing="4" align="center">
   <tr>
    <td colspan="2" align="right"><b><font color="red" id="close_hint">Закрыть</font></b><br>
     <?php
     $prov_cod=rand(100,980); $prov_cod_2=rand(1,19);

     echo '<textarea cols="65" rows="5" name="user_text" required>'.$_SESSION[comment_user_text].'</textarea>';
    echo '</td></tr><tr><td width="300">';

     echo '<b>Ваше имя: </b><input type="text" name="mess_login" maxlength="20" value="'.$_SESSION[comment_mess_login].'" required>';

    echo '</td><td align="right">';
     echo '<b>'.$prov_cod.' + '.$prov_cod_2.' = </b>';
     echo '<input type="hidden" name="prov_summa" value="'.md5($prov_cod+$prov_cod_2).'">';
     ?>
     <input type="text" name="contr_cod" maxlength="4" size="4" required>
     <input type="hidden" name="parent_id" value="0">
     <input type="hidden" name="first_parent" value="0">
     <input type="submit" value="Отправить">
    </td>
   </tr>
</table>
</form>
</div>

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script type="text/javascript">
$('html').mousemove(function(e){
$('.open_hint').click(function(){
  $('#hint').fadeIn(700);
  $('#hint').offset({top:e.pageY+15, left:e.pageX-550});
  return false;
});
});

$('#close_hint').click(function(){
$('#hint').fadeOut(700);
return false;
});

function comm_on(p_id,first_p) {
document.add_comment.parent_id.value = p_id;
document.add_comment.first_parent.value = first_p;
}
</script>
16.04.2015 22:46:00
Найти все сообщения Цитировать это сообщение
ale10ey Не на форуме
Генерал-майор
*

Сообщений: 311
У нас с: Nov 2014
Сообщение: #163
RE: Построение дерева иерархии или дерева комментариев
Доброе время суток,
Во-первых выражаю вам огромную благодарность за помощь, ниже на скрине можно видеть изменения, которых бы не было без вашей помощи

[Изображение: tid_135_forma.png]

Поменял немного стили и поменял строки

$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);
$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);

на:
$result = mysql_query("SELECT * FROM comment WHERE theme='".$_SESSION[mess_url]."' and moderation=1 ORDER BY id", $link);
$number = mysql_num_rows($result);
так как разбивка не нужна

У меня есть маленький вопросик по форме, как видно на скриншоте, что текст "Последние комментарии посетителей" находится не вверху, а снизу от последнего ответа, что не получилось у меня реализовать, хотя не думаю, что сложно. В форме без дерева иерархии все нормально, а тут нет.

И еще одна просьба, как добавить к сообщениям идентификатор (например #253). Очень интересно как это реализуется, если поможете буду рад, а если нет, то в любом случае вам огромное спасибо.
С уважением и только положительная оценка !


Просьба пояснить, в следующем коде:
if ($parent==0) echo '<div style="margin: 0 50px; padding:5px 0px 0px 0px;">';
else {
if (count($tags[$parent])-1!=$i) echo '<div style="padding:5px 0px 0px '.$left.'px; background: url(../image/strelka.png) no-repeat; border-left: 2px solid #000;">';
else echo '<div style="padding:5px 0px 0px '.$left.'px; background: url(../image/strelka_2.png) no-repeat;">';
}
При ссылке на родительский комментарий применяется изображение strelka_2.png, а в каком случае будет применяться strelka.png и если есть возможность, как реализовать, чтобы показывалось это изображение.

И еще вопросик насчет закрытия формы, после клика на кнопку "Ответить".
В браузере Firefox, когда на 3, когда на 5 или 6 раз при клике по ссылке "Закрыть"
форма не закрывается. После обновления страницы - аналогично.
На форуме, подобная проблема описывалась, но в моем случае проблема не решается.
На вашем сайте пробовал n-число вызывать и закрывать форму работая в Firefox и ни одного зависания.
Не подскажите, как проблему решить, а то не хотелось бы терять людей, которые зашли на сайт с Firefox, а таких людей достаточно.
Заранее благодарен.
(Последний раз сообщение было отредактировано 18.04.2015 в 00:04:01, отредактировал пользователь ale10ey.)
17.04.2015 23:21:42
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,279
У нас с: Aug 2011
Сообщение: #164
RE: Построение дерева иерархии или дерева комментариев
По поводу надписи "Последние комментарии посетителей"...
Замените:
Код:
if ($number>0) {
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>';
echo '<div style="padding:3px;margin-top:10px; border-top:3px solid #09C;">
<p align="center"><strong>Последние комментарии посетителей:</strong></p><br></div>';
}

на:
Код:
if ($number>0) {
echo '<div style="padding:3px;margin-top:10px; border-top:3px solid #09C;">
<p align="center"><strong>Последние комментарии посетителей:</strong></p><br>';
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>';
}

Идентификатор - это обычный id комментария в БД.

Чтобы его добавить, после строчки:
Код:
echo '<span style="font-size:12px;">('.$tags[$parent][$i][3].')</span></td>';

добавьте строчку:
Код:
echo '<td width="50"><a href="'.$_SESSION[full_url].'#m'.$tags[$parent][$i][0].'"># '.$tags[$parent][$i][0].'</a></td>';
18.04.2015 00:06:28
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,279
У нас с: Aug 2011
Сообщение: #165
RE: Построение дерева иерархии или дерева комментариев
Изображение strelka.png применяется в том случае, когда на один родительский комментарий поступило два ответа. Посмотреть как это выглядит можно в комментариях к теме спойлер с плавным открытием и скрытием

По поводу ссылки (кнопки) "Закрыть", не знаю что не так, т.к. у нас используется аналогичный код для закрытия. Проверьте, чтобы id="close_hint" встречалось на страничке только один раз (у ссылки "Закрыть"). Так же попробуйте из кода:
Код:
$('#close_hint').click(function(){
$('#hint').fadeOut(700);
return false;
});
удалить return false;
18.04.2015 00:18:57
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,279
У нас с: Aug 2011
Сообщение: #166
RE: Построение дерева иерархии или дерева комментариев
Тема Форма добавления комментариев к темам была обновлена и доработана.

Подробнее с новой темой, в которой уже изначально присутствует иерархическое дерево комментариев, можно ознакомиться по ссылке Добавление комментариев на сайт.
19.04.2015 22:22:53
Найти все сообщения Цитировать это сообщение
ale10ey Не на форуме
Генерал-майор
*

Сообщений: 311
У нас с: Nov 2014
Сообщение: #167
RE: Построение дерева иерархии или дерева комментариев
(19.04.2015 22:22:53)Admin писал(а):  Тема Форма добавления комментариев к темам была обновлена и доработана.

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

Доброе время суток,
Спасибо за помощь.
С кнопкой "Ответить" я разобрался (не всегда по клику закрывалось окно), но у меня есть еще к вам просьба, несмотря, что вы уже обновили тему.

Каждый раз, когда я кликаю по кнопке "Ответить", форма появляется, но каждый раз со смещением, что наглядно на скринах ниже:

1 клик по кнопке:
[Изображение: tid_135_forma_1.png]

2 клик по кнопке:
[Изображение: tid_135_forma_2.png]

3 клик по кнопке:
[Изображение: tid_135_forma_3.png]

и т.д., все время присутствует смещение. Пробовал задавать фиксированную ширину и margin: auto; , но не срабатывает. Дальнейшие эксперименты со стилями ни к чему не привели. У вас форма появляется точно в 1 месте по центру, а у меня появляется и закрывается, но со смещением. Может быть последовательность кода, который вы поправили другая, или проблема в скрипте?

При отправке сообщения появляется сообщение "Комментарий принят и ожидает модерации", а как сделать отступы этого сообщения от самой формы?

И еще просьба. Я хочу на блог вставить сообщение "Комментариев - 7", например, которая может быть как просто сообщение или как ссылка сразу на комментарии.

Для наглядности сделал скриншот:
[Изображение: tid_135_blog.png]

Где красная рамка, хотел бы, чтобы сообщение (ссылка) "Комментариев - 7"
(или 9, 15 и т.д) присутствовали причем скрин страницы blog.html, а страницы и комментариев - blog.html/info-1.html.

Был бы благодарен, если бы вы пояснили, что и куда вставлять, так как php я начинаю только самостоятельно изучать и трудностей хватает.
С уважением, Алексей.
21.04.2015 00:37:35
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,279
У нас с: Aug 2011
Сообщение: #168
RE: Построение дерева иерархии или дерева комментариев
По порядку.
Форма ответа у Вас, как я понимаю, появляется в зависимости от координат курсора мышки в момент клика по кнопке "Ответить" (когда-то я выкладывал и такой вариант скрипта). Тут надо смотреть, что у Вас на данный момент находится в JavaScript коде и вносить изменения там.

На нашем сайте, например, вот такой JavaScript код, отвечающий за показ формы и ее положение:
Цитата:$(".open_hint").click(function(){$("#hint").animate({
top:$(this).offset().top+23,left:$(this).offset().left-540},400).fadeIn(800);
});

Как видно, смещение формы ответа относительно исходного положения мы задали вручную относительно положения кнопки, по которой был клик: ($(this).offset().left-540).



За вывод сообщения "Комментарий принят и ожидает модерации", отвечает код:
Код:
if (isset($_SESSION[send])and($_SESSION[send]!="")) {
echo '<font color="red"><b>'.$_SESSION[send].'</b></font>';
$_SESSION[send]="";
}
Вот с ним и работайте. Либо добавьте нужные стили, либо перенесите в удобное для Вас место.


Чтобы получить сообщение "Комментариев - 7", достаточно сделать обычный запрос к БД:
Код:
$res=mysql_query("SELECT * FROM comment WHERE theme_id='".$_SESSION["mess_url"]."' and moderation=1", $link);
$num_comm=mysql_num_rows($res);
echo 'Комментариев - '.$num_comm;

Если количество комментариев требуется вывести не на самой страничке с комментариями, а на другой, то вместо ".$_SESSION["mess_url"]." нужно указывать имя конкретной странички (должно совпадать с именем в БД).
21.04.2015 23:15:00
Найти все сообщения Цитировать это сообщение
ale10ey Не на форуме
Генерал-майор
*

Сообщений: 311
У нас с: Nov 2014
Сообщение: #169
RE: Построение дерева иерархии или дерева комментариев
1. По поводу смещения формы, проблем нет - все работает. Правда у меня
top-290,left:$(this).offset().left-920, думаю тут все зависит от того, где находится форма.
Есть вопрос, как сделать закрытие формы по нажатию клавиши Escape.
Пробовал, так:
Код:
$("#hint").live("click", function(e) { $(".close_hint").css("display","none"); });
$().bind("keydown", function (c) {    if (c.keyCode === 27) { $(".close_hint").css("display","none"); }});
но не срабатывает, думаю, что-то упустил или возможно реализовать закрытие формы подобным образом?

2. За вывод сообщения "Комментарий принят и ожидает модерации", отвечает код:
PHP код:
if (isset($_SESSION[send])and($_SESSION[send]!="")) {
echo 
'<font style="color: red; margin-top:5px;"><b>'.$_SESSION[send].'</b></font>';
$_SESSION[send]="";

Не срабатывает ни внутренний, ни внешний отступы. Цвет, да - меняется, но отступы - нет.

3. Чтобы получить сообщение "Комментариев - 7", достаточно сделать обычный запрос к БД:
Код:
$res=mysql_query("SELECT * FROM comment WHERE theme_id='".$_SESSION["mess_url"]."' and moderation=1", $link);
$num_comm=mysql_num_rows($res);
echo 'Комментариев - '.$num_comm;

Все ясно, но не совсем понятно, как правильно сделать этот запрос. Пробовал по незнанию вставлять код, то в comment, то в ocenka_comment и естественно выдается ошибка. Полагаю, что данный запрос нужно формировать на самой странице, где находятся комментарии или в другом месте, но как реализовать не подскажите? У вас в шапке "Комментарии посетителей (всего 3 шт.):" работает и примерно так хотел бы реализовать на сайте.

Если количество комментариев требуется вывести не на самой страничке с комментариями, а на другой, то вместо ".$_SESSION["mess_url"]." нужно указывать имя конкретной странички (должно совпадать с именем в БД).

т.е. вместо .$_SESSION["mess_url"]. - mysite.ru/blog.html или неправильно?

С уважением Yes и заранее благодарен.
22.04.2015 00:31:58
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,279
У нас с: Aug 2011
Сообщение: #170
RE: Построение дерева иерархии или дерева комментариев
По пунктам.
1) Что-то перемудрили. Все гораздо проще:
Код:
$(document).keypress(function(c){ if (c.which=='27') $('#hint').fadeOut(700); });

2) Margin-top работает только для блочных элементов, а <font> таким не является, поэтому замените его, например, на <div>:

PHP код:
if (isset($_SESSION[send])and($_SESSION[send]!="")) {
 echo 
'<div style="margin-top:35px; color:red;"><b>'.$_SESSION[send].'</b></div>';
 
$_SESSION[send]="";


3) Если Вам необходимо узнать количество оставленных комментариев к теме с любой другой странички, то естественно нужно знать имя странички, у которой Вы будете считать комментарии (вместо .$_SESSION["mess_url"]. - blog.html).
22.04.2015 23:24:28
Найти все сообщения Цитировать это сообщение
Создать ответ 


Переход:


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



Mail.ru LiveInternet

© Copyright 2011-2016 by UsefulScript.ru