Jump to content
I-NOZex

Sort Array, retornar comentarios de forma hierarquica

Recommended Posts

I-NOZex

Bem malta, venho pedir aqui ajuda aos gurus que dominam ai a cenas das arrays :D

ora bem, ando para aqui a desenvolver um sistema de comentarios, de forma a permitir respostas a comentario (child comments por assim dizer)

Ora, eu ate de certa forma, ja consegui meter isso a dar, o problema é que tou a usar a Yii framework e aquele codigo está um pouco

errado... o dito cujo é este:

public function commentsRender($row,$level=1) {
$command = Yii::app()->db->createCommand()
->setFetchMode(PDO::FETCH_OBJ)
->select('*')
->from('comentario')
->where('parentID = :id', array(':id'=>$row['commentID'])); //isto é apenas o select

 echo "<li class='comment '>";
 echo "<div class='aut'>".$row['userID']."</div>";
 echo "<div class='comment-body'>".$row['texto']."</div>";
 echo "<div class='timestamp'>".$row['data']."</div>";
 echo "<a href='#comment_form' class='reply' id='".$row['commentID']."'>Reply</a>";

 $dataReader = $command->query(); //aqui basicamente faz a query
 if($dataReader->rowCount > 0){ // aqui testa se o comentario tem childs
	if ($level == 1) $level++;
	  while(($row = $dataReader->read())!==false) { //isto é como o tipico fetch_array
				echo "<li class='well well-small' style='padding-left: " . (($level - 1) * 20) . "px;'>";
		   $this->commentsRender($row,$level+1);
	  }
	  echo "</div>";
  }
 echo "</li>";
}

(basei-me neste codigo: http://www.technabled.com/2009/06/how-to-multi-level-comments-in-php.html )

nao se aflijam por nao conhecerem a framework, se eu conseguir um exemplo em php puro eu acho que ja me consigo safar!

ora isto renderiza uma lista ordenada html do genero:

<ul>
   <li class="comment ">
       <div class="aut">1</div>
       <div class="comment-body">comment3</div>
       <div class="timestamp">1384447010</div><a id="10" class="reply" href="#comment_form">Reply</a>
       <ul style="padding-left: 20px;">
           <li class="comment ">
               <div class="aut">1</div>
               <div class="comment-body">comment3.1</div>
               <div class="timestamp">1384447035</div><a id="11" class="reply" href="#comment_form">Reply</a>
               <ul style="padding-left: 40px;">
                   <li class="comment ">
                       <div class="aut">1</div>
                       <div class="comment-body">comment3.1.1</div>
                       <div class="timestamp">1384449678</div><a id="12" class="reply" href="#comment_form">Reply</a>
                   </li>
               </ul>
           </li>
       </ul>
   </li>
   <li class="comment ">
       <div class="aut">1</div>
       <div class="comment-body">comment2</div>
       <div class="timestamp">1384433970</div><a id="8" class="reply" href="#comment_form">Reply</a>
   </li>
   <li class="comment ">
       <div class="aut">1</div>
       <div class="comment-body">comment1</div>
       <div class="timestamp">1384433970</div><a id="9" class="reply" href="#comment_form">Reply</a>
   </li>
</ul>

o problema é que eu em vez de tar a returnar logo com os echos todos, eu queria retornar uma array, do genero:

fqgRcVO.png

Alguem me pode ajudar? sugerir algum codigo se possivel, ou uns tutoriais...

funçoes recursivas é uma area pouco explorada para mim, entao com arrays... da-me a volta a mioleira!

espero ter sido suficentemente explicito, e que me consigam ajudar :confused:

Edited by I-NOZex

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Share this post


Link to post
Share on other sites
HappyHippyHippo

tens um pequeno problema ai no teu array objectivo ... imagina que uma entrada tem mais do que um child ... (é por essa razão que a solução apresentada a seguir não é exactamente como apresentas :

public function commentsRender($row) {
 $command = Yii::app()->db->createCommand()
                      ->setFetchMode(PDO::FETCH_OBJ)
                      ->select('*')
                      ->from('comentario')
                      ->where('parentID = :id', array(':id'=>$row['commentID']));

 $result = $row;
 $dataReader = $command->query();
 if($dataReader->rowCount > 0) {
   $result['child'] = array();
   while(($row = $dataReader->read())!==false) {
     $result['child'][] = $this->commentsRender($row);
   }
 }
}

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
I-NOZex

tens um pequeno problema ai no teu array objectivo ... imagina que uma entrada tem mais do que um child ... (é por essa razão que a solução apresentada a seguir não é exactamente como apresentas :

public function commentsRender($row) {
 $command = Yii::app()->db->createCommand()
				   ->setFetchMode(PDO::FETCH_OBJ)
				   ->select('*')
				   ->from('comentario')
				   ->where('parentID = :id', array(':id'=>$row['commentID']));

 $result = $row;
 $dataReader = $command->query();
 if($dataReader->rowCount > 0) {
$result['child'] = array();
while(($row = $dataReader->read())!==false) {
  $result['child'][] = $this->commentsRender($row);
}
 }
}

é isso tudo, obrigadao :D

defacto tinha-me escapado esse pormenor, entretanto precisei de algumas adaptaçoes (pq a variavel parametro $row era um objecto, e faltava um return á funçao)

public function commentsRender($row,$level=1) {
   $command = Yii::app()->db->createCommand()
				   ->select('*')
				   ->from('comentario')
				   ->where('parentID = :id', array(':id'=>$row['commentID']));
   $result = array();
   foreach($row as $k => $v)
    $result[$k] = $v;
   $result['level'] = $level;
   $dataReader = $command->query();
   if($dataReader->rowCount > 0) {
    $result['child'] = array();
    while(($row = $dataReader->read())!==false) {
	    $result['child'][] = $this->commentsRender($row,$result['level']+1);
    }
   }
 return $result;
}


B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.