我只使用控制器和视图.
使用以下代码我显示帖子和帖子有回复.
我使用以下控制器和视图来显示帖子和回复.
通过使用查询1,我从帖子表中选择帖子作为主题id.(例如.topic id = 34)并使用此获取帖子ID 30和31.
通过使用查询2,我从回复表中为每个帖子ID选择回复.
说帖子ID 30有回复id 1和
帖子id 31有回复id 2.
通过使用2nd for循环我选择是否有任何回复使用来自Reply表的parent_id列进行anothr回复.(使用递归调用showreply()函数)
我被困在如何从视图中递归函数showreply()传递结果.
通过使用我的代码我显示:
邮政30
---第一次回复邮政30
邮报31
---回复邮件31
但我想表现出来.
邮政30
---第一次回复邮件30
---回复第一回复
邮件31
---第一回复邮件31
---回复第一回复
我已经使用递归函数调用来获取使用父ID的回复回复,但我没有得到如何将其传递给查看.
控制器:
<?php
public function viewpost()
{
//Query 1
$topicid = trim($this->input->get('topicid'));
$q =$this->db->select(array(
'fp.id as id',
'fp.postdata',
'fp.topicid'))
->from('forum_post AS fp')
->where('fp.topicid',$topicid)
->order_by('fp.id DESC')->limit(0,10)->get();
$resultq1 = $q->result_array();
$data['resultq1'] = $resultq1;
//$data['resultq1'] = $res;
$resultq2 = array();
foreach ($resultq1 as $rec)
{
//Query 2
$postid = $rec['id'];
$q1 =$this->db->select(array(
'fr.id as id',
'fr.reply_data'))
->from('forum_reply AS fr')
->where('fr.postid',$postid)
->order_by('fr.id ')->get();
$resultq2[$postid] = $q1->result_array();
$data["resultq2"][$postid] = $resultq2[$postid];
foreach($q1->result_array() as $row1)
{
//second for loop
$reply_id = $row1['id'];
$resultq3[$reply_id] = $this->showreply($reply_id); // call to function
$data["resultq3"] = $resultq3[$reply_id];
}//inner for loop
} //outer for loop
$this->load->view('viewpost',$data);
}
public function showreply($reply_id)
{
$reply_id1 = $reply_id;
$q1 =$this->db->select(array(
'fr.id as id',
'fr.reply_data',
'fr.parent_id'))
->from('forum_reply AS fr')
->where('fr.parent_id',$reply_id1)
->order_by('fr.id ')->get();
//print $this->db->last_query();
$resultq4[$reply_id1] = $q1->result_array();
$data["resultq4"]= $resultq4[$reply_id1];
$i=0;
foreach($q1->result_array() as $row4)
{
print_r($q1->result_array());
echo "id".$id = $row4['id'];
$parent_id = $row4['parent_id'];
if($parent_id!=0)
{
//$data['nested'][$i] = $q1->result_array();
$this->showreply($id); //recursive call to function
$i++;
}
}
return $resultq4;
}
?>
Run Code Online (Sandbox Code Playgroud)
回复表的表结构:
Rep_id rep_text post_id Parent_ID
-------------------------------------------------------------------------
1 Reply for post 30 30 null
2 Reply for post 31 31 null
3 reply to Rep_id 1 null 1
4 Rep_id 3 have Rep_id 4 null 3
5 Reply for post 31 null 2
6 Reply for Rep_id 5 null 5
----------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
邮政表:
post_id topic id post_title post_desc
-----------------------------------------
30 34 xyz sssss
31 34 pqr tyyyu
----------------------------------------
Run Code Online (Sandbox Code Playgroud)
*查看:*
<div>
<?php foreach($resultq1 as $row)
{ ?>
<ul>
<li></li> // used to display post
</ul>
<?php foreach($resultq2 as $rows)
{
foreach($rows as $row1)
{
if($row['id']==$row1['postid'])
{ ?>
<ul>
<li></li> // used to display reyly for post
</ul>
<?php foreach($resultq3 as $rows)
{
foreach($rows as $row2)
{
if($row1['id']==$row2['parent_id'])
{ ?>
<ul>
<li></li> // used to display reply for reply
</ul>
<?php
}//if
} //inner for $row2
} // outr for $resultq3
} //if
} //inner for of $row1
}//outer for $resultq2
} ?>
</div>
Run Code Online (Sandbox Code Playgroud)
抱歉,这是一个非常糟糕的代码:(。我建议重写整个代码..
例子
表帖子:
ID type title content parent_id post_id
1 post xyx asd Null 1
2 comment asd DEMO 1 1
2 comment com DEMO2 2 1
Run Code Online (Sandbox Code Playgroud)
现在这就是我的建议,
所有帖子应在 1 个表中
与列类型(枚举字段[帖子,评论])
一个parent_id列,指定它在树中的位置。
和一个将所有这些粘合在一起的 post_id 表。
现在你所要做的就是
$post = $this->db->select('*')->where('post_id',$post_id)->get('posts');
Run Code Online (Sandbox Code Playgroud)
现在 $post 将包含您的所有帖子及其评论和子评论以及所有内容..
在单个数据库查询中,您现在要做的就是将它们组织在一个关联数组中
$post = $this->db->select('*')->where('post_id',$post_id)->get('posts');
if($post->num_rows==0)return false;//end if there is no post found
//step 1 find main post
$main_post=FALSE;
foreach($post as $fp){
if($fp->type=='post')$main_post=array ('id'=>$fp->id,'title'=>$fp->title,'content'=>$fp->content);
}
if($main_post==false)return false;///THERE WAS NO MAIN POST FOUND !!!
//step 2 get comments on post
$comments=array();
foreach($post as $fp){
if($fp->type=='comment' && $fp->parent_id==$main_post['id']){
$comment[$fp->id]=array('title'=>$fp->title,'content'=>$fp->content,'child'=>array());
}
}
//step 3 comments of a comment
//IF comment is not on parent so its on another comment right :) !
foreach($post as $fp){
if($fp->type=='comment' && $fp->parent_id != $main_post['id']){
$comment[$fp->parent_id]['child'][]=array('title'=>$fp->title,'content'=>$fp->content);
}
}
Run Code Online (Sandbox Code Playgroud)
现在你有所有的评论和评论 inisde $comment var,非常容易循环和 $main_post 中的主要帖子:) 一个简单的视图将是
<h2><?=$main_post['title']?></h2>
<div class='fp_post'>
<?=$main_post['post']?>
</div>
<ul class='comments'>
<?
foreach($comment as $c){
echo "<li> $c['title'] : $c['content']";
if(!empty($c['comment'])){
//there is a comments on this comment :)
echo "<ul>";
foreach($c['comment'] as $coc){echo "<li> $coc['title']: $coc['content']</li>";}
echo "</ul>";//end of comment of comments
}
echo "</li>"//end of a comment and its comments
}
?>
</ul>
Run Code Online (Sandbox Code Playgroud)
我希望这个简单的代码可以帮助您解决问题,这是简单而有效的方法,并且我确信您可以使用一些调试 try_catch 而不是在错误时返回 false,您也可以添加一些验证,但这是现在不是我们的情况。
| 归档时间: |
|
| 查看次数: |
1739 次 |
| 最近记录: |