Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

I-NOZex

Sort Array, retornar comentarios de forma hierarquica

Mensagens Recomendadas

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:

Editado por I-NOZex

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

beat2revolution.net

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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);
   }
 }
}

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.