[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: составить правильный запрос в paginator'e
zeromind
Вообщем сделал свой модуль многоуровневых комментариев (взяв за основу из урока Попова), отправка осуществляется на ajax'e..
ниже показан мой 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 комментария вложенные к предыдущему, который находится на прошлой страничке(
user posted image

скажите как мне исправить данную ситуацию? уже 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():
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мя запросами к БД, вот он у меня выводился как надо тут тема

вообщем буду сегодня ещё разбирать полностью код, пытаться налаживать))
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.