5

コントローラーとビューのみを使用しています。
次のコードを使用して、返信のある投稿と投稿を表示しています。
次のコントローラーとビューを使用して、投稿と返信を表示しました。

クエリ 1 を使用して、投稿テーブルからトピック ID (eg.topic id=34) の投稿を選択し、これを使用して投稿 ID 30 および 31 を取得しています。

クエリ 2 を使用して、返信テーブルから投稿 ID ごとに返信を選択しています。
返信 ID 1 を持つ投稿 ID 30 と
返信 ID 2 を持つ投稿 ID 31 とします。

2番目のforループを使用して、返信テーブルのparent_id列を使用して別の返信があるかどうかを選択しています(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;
    }
?>

応答テーブルのテーブル構造:

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

----------------------------------------------------------------------------

ポストテーブル:

post_id  topic id   post_title   post_desc 
-----------------------------------------
  30       34         xyz         sssss
  31       34         pqr         tyyyu

----------------------------------------

*ビュー: *

<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>
4

2 に答える 2

2

申し訳ありませんが、これは非常に悪いコードです:(.すべてを書き直すことをお勧めします..

テーブルポスト:

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

それが今私が提案することです、

すべての投稿は 1 つのテーブルにある必要があります

with column Type (enum フィールド [post,comment])

ツリー内での位置を指定するparent_id列。

そして、それらすべてを結び付ける post_id テーブル。

今あなたがしなければならないのは

$post = $this->db->select('*')->where('post_id',$post_id)->get('posts');

$post には、すべての投稿とそのコメント、サブコメント、およびすべてが含まれます。

単一の db クエリで、あとはそれらを連想配列に整理するだけです

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

これで、コメント 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>

この簡単なコードが問題の解決に役立つことを願っています。これは簡単ですが効果的な方法です。エラー時に false を返す代わりに、デバッグ用の try_catch を使用できると確信しています。また、いくつかの検証を追加することもできますが、これは今は私たちの場合ではありません。

この答えがあなたにとって十分であることを願っています:)

チーズ

于 2013-03-27T15:34:35.270 に答える
2

これが私の答えです:

初め

MVCアプローチの使用を検討し、アプリケーションのモデル部分でdbクエリを分離してください。

2番

クエリに結果があるかどうかを常に確認する必要があります。これにより、クエリに結果がなく、それらを foreach しようとした場合に、コードが致命的なエラーになるのを防ぐことができます。

<?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();
     //$data['resultq1'] = $res;
     $resultq2 = array();
     if($q->num_rows() > 0) 
     {
            $resultq1 = $q->result_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();

            // the rest of your code

     }

     // the rest of your code

三番

第 1 レベルの返信を (ネストされているのではなく) 第 2 レベルの返信と同じように表示すると仮定します。

役職

-- 投稿に返信

-- 返信に返信

役職

-- 投稿に返信

-- 返信に返信

<div>
<?php
if($resultq1) 
{
   echo '<ul>';
   foreach($resultq1 as $row)
   { 
      echo '<li>';      
      echo $row;// used to display post
      if(resultq2)
      { 
         echo '<ul>';
         foreach($resultq2 as $rows)
         {
             echo '<li>';
             echo $rows; // display reply to post
             echo '</li>';
             if($resultq3)
             {
                foreach($resultq3 as $row1)
                {
                    echo '<li>';
                    echo $row1; // display reply to reply
                    echo '</li>';
                }
             }
          }
          echo '</ul>';
       }
       echo '</li>';
    }
    echo '</ul>';
  }
  </div>

これまでのところ、これが私の答えです。これがあなたにも役立つことを願っています。

于 2013-03-28T05:54:32.940 に答える