ниже показан мой SQL запрос, из-за сложности многоуровневых комментов (ответы на выше стоящие комментарии), не знаю как правильно составить запрос.. или настроить paginator((, вообщем вот код:
include './libs/irb_paginator.php';
$paginator = new IRB_Paginator($GET['num'], 6);
$sql = "SELECT `id`,`category`,`parent_id`,`name`,`comment`,
DATE_FORMAT(date_add, '%d %M %Y %H:%i') as `date_add`
FROM `". IRB_DBPREFIX ."comments`
WHERE `category` = '".$GET['news']."'
ORDER BY `id` ASC";
$res = $paginator->countQuery($sql);
$page_menu = $paginator -> createMenu();
if(mysql_num_rows($res) > 0) {
while($row = mysql_fetch_assoc($res)){
$row['comment'] = createBBtags($row['comment']);
$data[$row['id']] = $row;
}
/**
* Фукнция создания дерева комментариев
*/
function mapTree($dataset) {
$tree = array(); // Создаем новый массив
foreach ($dataset as $id=>&$node) {
if (!$node['parent_id']) { // не имеет родителя, т.е. корневой элемент
$tree[$id] = &$node;
} else {
$dataset[$node['parent_id']]['childs'][$id] = &$node; //
}
}
return $tree;
}
function commentsToTemplate($comment){
ob_start();
// Подключаем шаблон comment_template.php, который просто таки ждет наш массив $comment ))
$comments_string = getTpl('main/comments/comments');
eval('?>'. $comments_string .'<?php ');
$comments_string = ob_get_contents(); // Получаем содержимое буфера в виде строки
ob_end_clean(); // очищаем буфер
return $comments_string;
}
function commentsString($data){
$string= "";
foreach($data as $w) {
$string .= commentsToTemplate($w);
}
return $string;
}
$data = mapTree($data);
$comments = commentsString($data);
$data = null;
}
ниже привожу шаблон:
--- тут просто выводится главные комментарии (ниже уже ответы - child)
<?php if(isset($comment["childs"])){ ?>
<!-- child -->
</div><ul id="commentsRoot<?php echo $comment["id"]?>">
<?php echo commentsString($comment["childs"]) ?>
</ul><?php } ?>
<!-- child end --></li>
Всё это происходит из за того что, к примеру, вывожу 5 комментариев на странице, выводятся первые эти 5 комментариев, НО если у последних комментариев были ответы на выше стоящие.. то тут начинаются ошибки.. обычно на следующей уже странице..
сначала вылетают нотисы - Notice: Undefined index: parent_id,
потом - дополнительные формы комментов (в них вместо переменных - нотисы Notice: Undefined index: name, comment, data_add in .... eval()'d code on line 4)
кстате, <?php if($comment["childs"]) заменил на <?php if(isset($comment["childs"])), были варнинги или нотисы (точно не помню)
вся запарка (Как я понимаю) происходит в функции - function mapTree, которая и создаёт $comment["childs"], ["parent_id"]..
+ в карму за хелп)
Спустя 22 часа, 19 минут, 50 секунд (20.11.2011 - 18:03) Игорь_Vasinsky написал(а):
Подозрительна функция, где взял?
именно
function mapTree($dataset) {
$tree = array(); // Создаем новый массив
foreach ($dataset as $id=>&$node) {
if (!$node['parent_id']) { // не имеет родителя, т.е. корневой элемент
$tree[$id] = &$node;
} else {
$dataset[$node['parent_id']]['childs'][$id] = &$node; //
}
}
именно
Цитата |
} else { $dataset[$node['parent_id']]['childs'][$id] = &$node; // |
ты же в foreach разбираешь массив на $id и $node и если не гоню то $dataset внутри в цикле не существует.
Спустя 57 секунд (20.11.2011 - 18:04) Игорь_Vasinsky написал(а):
или ты новый массив $dataset создаёшь?
Спустя 3 часа, 18 минут, 19 секунд (20.11.2011 - 21:22) zeromind написал(а):
2Игорь_Vasinsky, поидее создается новый - $dataset[$node['parent_id']]['childs'] = array(); в описании Попова написано - "при этом у родителя внутри элемента создастся массив childs, в котором и будут вложены его потомки"
вообщем, если на новой странице первый комментарий является дочерним (ответ на вышестоящий), то на этой же странице - добавляется пустой комментарий с нотисами..
вот пример, 2 комментария вложенные к предыдущему, который находится на прошлой страничке(

скажите как мне исправить данную ситуацию? уже 2ой день ни чего не могу придумать(
вообщем, если на новой странице первый комментарий является дочерним (ответ на вышестоящий), то на этой же странице - добавляется пустой комментарий с нотисами..
вот пример, 2 комментария вложенные к предыдущему, который находится на прошлой страничке(

скажите как мне исправить данную ситуацию? уже 2ой день ни чего не могу придумать(
Спустя 9 часов, 43 минуты, 44 секунды (21.11.2011 - 07:06) twin написал(а):
Начнем не с этого. Ответь пожалуйста на вопрос, функция commentsToTemplate() - поповские происки или твое изобретение?
Спустя 5 часов, 19 минут, 43 секунды (21.11.2011 - 12:26) zeromind написал(а):
twin
Попова(но чуть переработал, добавил getTpl + получение шаблона было способом include, я поменял на eval)
пробывал после построения дерева комментов прогонять их через функцию (взятую с того же сайта автора, где написаны функции построения дерева) display_tree():
итог идентичный.. только код сразу значительно сокращается, 1 функция заменяет сразу две(commentsToTemplate()и commentsString($data)).. и шаблон тут не используется(из минуса, чуток сьехали стили)
т.е. получается сначала в контроллере просто $data = mapTree($data);
а в html'e вывожу display_tree()..
ещё есть метод - рекурсивный с 2мя запросами к БД, вот он у меня выводился как надо тут тема
вообщем буду сегодня ещё разбирать полностью код, пытаться налаживать))
Попова(но чуть переработал, добавил getTpl + получение шаблона было способом include, я поменял на eval)
пробывал после построения дерева комментов прогонять их через функцию (взятую с того же сайта автора, где написаны функции построения дерева) display_tree():
function display_tree($nodes, $indent=0) {
if ($indent >= 20) return; // Stop at 20 sub levels
echo "<ul id=\"commentRoot\">";
foreach ($nodes as $node) {
echo str_repeat(' ',$indent*4);
echo "<li id=\"comment".$node["id"]."\">
<div class=\"commentAva\"></div>
<div class=\"commentContent\">
<span>".$node["name"]."</span> <p class=\"mytime\">".$node["date_add"]."</p>
<div class=\"comment\">".$node["comment"]."</div>
<a class=\"reply\" href=\"#comment".$node["id"]."\">Ответить</a>
</div>";
if (isset($node['childs']))
display_tree($node['childs'],$indent+1);
echo "<div class=\"commentArray\"></div><ul id=\"commentsRoot".$node["id"]."\"></ul>";
}
echo "</li></ul>";
}
итог идентичный.. только код сразу значительно сокращается, 1 функция заменяет сразу две(commentsToTemplate()и commentsString($data)).. и шаблон тут не используется(из минуса, чуток сьехали стили)
т.е. получается сначала в контроллере просто $data = mapTree($data);
а в html'e вывожу display_tree()..
ещё есть метод - рекурсивный с 2мя запросами к БД, вот он у меня выводился как надо тут тема
вообщем буду сегодня ещё разбирать полностью код, пытаться налаживать))