2013-03-22 14 views
5

Sto usando solo controller e view.
utilizzando il seguente codice sto visualizzando post e posta avendo risposta.
Ho usato il seguente controller e la vista per visualizzare posta e risposta.come passare il risultato della funzione ricorsiva per visualizzare

utilizzando Query 1 Sto selezionando post per il tema id. (Eg.topic id = 34) dalla tabella posta e utilizzando questo ottenere posta id 30 e 31.

utilizzando Query 2 sto selezionando risposta per ogni ID post dal tavolo risposta.
dicono posta id 30 avendo risposta id 1 e
posta id 31 avendo risposta id 2.

utilizzando 2 ° ciclo for sto selezionando se alcuna risposta ha anothr risposta tramite colonna parent_id dalla tabella risposta. (Utilizzare chiamata ricorsiva a showreply() funzione)

mi sono bloccato nel modo in cui passo il risultato di funzione ricorsiva showreply() in vista.

Utilizzando il mio codice ho disply:

Messaggio 30
--- prima risposta per la post 30
dopo 31
--- rispondere per il post 31

ma io voglio mostrare come .

Messaggio 30
--- prima risposta per la post 30
--- risposta alla prima risposta
inviare 31
--- prima risposta per la post 31
--- risposta alla prima risposta

Ho usato la chiamata di funzione ricorsiva per ottenere la risposta per risposta tramite il genitore id ma non sono sempre come posso passare questo per visualizzare.

Controller: Struttura

<?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; 
    } 
?> 

Tavolo per la risposta Tabella:

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 

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

Messaggio Tabella:

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

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

* Vista: *

<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> 
+0

puoi essere più chiaro? –

+0

ci saranno solo 4 risposte ..? –

+0

Vedi la mia domanda modificata – Kango

risposta

2

Mi dispiace, ma questo è un pessimo codice :(. suggerirei di riscrivere il tutto ..

esempio

messaggi da tavolo:

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 

ora che è quello che vorrei suggerire,

tutti i messaggi devono essere in 1 tavolo

con colonna tipo (campo enum [postare, commentare])

a parent_id colonna che specifica la sua posizione nell'albero.

e una tabella post_id che li incolla tutti insieme.

ora tutto quello che dovete fare è

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

ora $ messaggio conterrà tutti i tuoi messaggi con i suoi commenti e le subcomments e tutto ..

in una singola query db, tutto quello che dovete fare ora è quello di organizzarli in un array assoc

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

ora avete tutti i vostri commenti e commenti sui commento inisde $ var commento, molto facile da anello e il post principale all'interno $ Mai n_post :) una vista semplice sarà

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

Spero che questo semplice codice aiutarti risolvere il tuo problema, questo è il modo semplice ma efficace per farlo, e sono sicuro che è possibile utilizzare alcuni try_catch debug-ing invece di restituire false in caso di errore, inoltre è possibile aggiungere qualche verifica, ma questo non è il nostro caso ora.

speranza questa risposta è abbastanza buono per voi :)

Cheerz

+0

Il codice visualizzato è molto brutto, ma l'idea stessa è buona presumendo che siano consentiti solo 2 livelli di commenti. – ahmad

+0

ciao, mi interessa, cosa detesti esattamente del codice? – Zalaboza

2

Questa è la mia risposta:

Prima

considerare l'utilizzo di MVC aproach, separare la query db a modello parte della tua domanda.

Seconda

Si dovrebbe sempre verificato se v'è il risultato sulla vostra richiesta o meno. Questo può impedire il tuo codice da un errore fatale quando non c'è alcun risultato nella tua query e provi a forzarli.:

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

Terzo

presumo che mostrerà la vostra prima risposta livello nella stessa vostra risposta secondo livello (invece di nidificato):

Messaggio

- risposta postare

- risposta alla risposta

Messaggio

- Risposta al post

- Rispondi per rispondere

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

Finora, questa è la mia risposta, spero che questo aiuterà anche.

+0

La soluzione che punti non copre tutte le possibilità. In questo caso una soluzione ricorsiva è l'approccio migliore perché ci sono N livelli di risposte. Sto cercando di capire una soluzione per un problema come questo. Quando lo raggiungo pubblicherò il link per la soluzione qui. – Elkas

Problemi correlati