קלי קלות..
רקורסיה (:
אתה עושה טבלה כזאת
id | cid | title | content
עכשיו הPID מסמל את הID של התגובה שאליה מגיבה התגובה הנוכחית
כאשר הPID = 0 מדובר בנושא
אתה בהתחלה שולף מהטבלה בעזרת WHILE בכל מקום שבו PID=0
ואז בתוך הלולאת WHILE קורא לפונקציה רקורסיבית שבעבור כל הודעה שהPID אצלה שווה לID של הנושא הנוכחי תחפש הודעות שהPID שלהם שווה לID של התגובה
זה נשמע קצת מסובך
רקורסיה פשוטה
אממ אני לא יודע אם זה הכי יעיל פשוט פעם אחרונה שכתבתי כזה עץ עשיתי את זה ככה, מן הסתם אם תחשוב על דרך להריץ את זה עם לולאות זה יהיה יותר יעיל
שבת שלום
ניצן
עידכון
סתם בגלל נחמדות יתרה הרצתי כאן שאילתא בתקיית עבודות שלי על זה
הנה הפונקציה:
קוד:
function rec_posts($pid, $padding = 0)
{
global $DB, $STD, $greendays, $posts_array;
$posts_q = $DB->query("SELECT * FROM `sk_forums_posts` WHERE `pid`='{$pid}'");
if ($DB->numRows($posts_q) > 0)
{
while ($posts_f = $DB->fetchArray($posts_q))
{
$z5 = $DB->query("SELECT `name` FROM `sk_users` WHERE `id`='{$posts_f['poster_id']}'");
$z6 = $DB->fetchArray($z5);
$posts_f['poster_name'] = $z6['name'];
if ((time()-$posts_f['post_date']) <= $greendays) $posts_f['d'] = 1;
$posts_f['padding'] = $padding;
$posts_f['date'] = $posts_f['post_date'];
$posts_f['post_date'] = $STD->fast_date("forum_post_date", $posts['post_date']);
$posts_array[$posts_f['date']] = $posts_f;
$padding++;
rec_posts($posts_f['id'], $padding);
}
}
}
והקריאה לפונקציה:
קוד:
$topics_buffer = "";
while ($topics_f = $DB->fetchArray($topics_q))
{
$posts_array = Array();
rec_posts($topics_f['id']);
$posts_buffer = "";
if (count($posts_array) > 0)
{
ksort($posts_array);
foreach ($posts_array as $post_date => $parray)
{
$posts_buffer .= $SKIN->post($parray);
}
}
$topics_f['posts_content'] = $posts_buffer;
$z7 = $DB->query("SELECT `name` FROM `sk_users` WHERE `id`='{$topics_f['poster_id']}'");
$z8 = $DB->fetchArray($z7);
$topics_f['poster_name'] = $z8['name'];
if ((time()-$topics_f['post_date']) <= $greendays) $topics_f['d'] = 1;
$topics_f['post_date'] = $STD->fast_date("forum_post_date", $topics_f['post_date']);
$topics_buffer .= $SKIN->topic($topics_f);
unset($posts_buffer);
}
$num = $DB->numRows($DB->query("SELECT `id` FROM `sk_forums_posts` WHERE `pid`='0'"));
$lnkbuf = "";
for ($i=1; $i<=ceil($num/$perpage); $i++)
{
if ($INC['page'] == $i) $lnkbuf .= $SKIN->list_pagelink_current($i, $INC['id']);
else $lnkbuf .= $SKIN->list_pagelink($i, $INC['id']);
}
$output .= $SKIN->template(Array('posts' => $topics_buffer, 'page_links' => $lnkbuf, 'fid' => $INC['id'], 'name' => $forum_info['name']));
יש כאן גם תיעוד של הטבלה:
קוד:
CREATE TABLE `sk_forums` (
`id` INT(8) AUTO_INCREMENT,
`posts` INT(8) NOT NULL,
`name` TEXT NOT NULL,
`description` TEXT,
`rules` TEXT,
`manager_id` INT(8),
`perm` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM;
CREATE TABLE `sk_forums_posts` (
`id` INT(8) AUTO_INCREMENT,
`pid` INT(8) NOT NULL,
`fid` INT(8) NOT NULL,
`title` TEXT NOT NULL,
`content` TEXT,
`poster_id` INT(8) NOT NULL,
`post_date` TEXT NOT NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM;
אם יש עוד בעיות אתה מוזמן לשלוח הודעה
עדיפות למייל
ניצן