древовидная структура коментов

Древовидные комментарии на PHP

Древовидные комментарии весьма популярная тема на просторах инета. Недавно и у меня была такая задача…Я писал на  Codeigniter, но код который я получил в итоге можно использовать и в других фреймвоках или просто на классическом PHP.

Структура таблицы БД

Обратите внимание на поля parent_id — идентификатор родительского комментария, level -уровень на котором находится комментарий в древовидной структуре относительно главного родительского комментария. Если это основной комментарий то у него поле level=0, поле parent_id так же равно нулю!

структура бд вложенных комментриев

Выборка из БД и построение древовидного массива комментариев

 

Обратите внимание обращаюсь я к БД с помощью ActiveRecord, конечно же это можно заменить простыми запросами query из  PHP. Весь этот код я написал в модели.

public function comments($id)
{ 
// $this->db->select_max('level');
//  $max=  $this->db->get('comments')->row();
$this->db->where('article_id',$id);
$this->db->join('users', 'users.id = comments.user_id','inner');
$this->db->order_by('comment_id','asc');
$data=  $this->db->get('comments')->result_array();
$count= $this->db->count_all_results('comments');
$comments=array();  
for($z=0;$z<=$count-1;$z++)
{if($data[$z]['level']==0)
{     $comments[$z][0]=$data[$z];
$kr=0;   
for($j=0;$j<=$count-1;$j++)
{
if($data[$j]['parent_id']==$data[$z]['comment_id'])
{$last_parent_id=$data[$j]['comment_id'];
if ($last_level =$data[$j]['level'])
{
$comments[$z][$data[$j]['level']+$kr]=$data[$j];
$last_level=$data[$j]['level'];$kr++;
}
}
if((isset($last_parent_id))&&($data[$j]['parent_id']==$last_parent_id)) 
{ if ($last_level =$data[$j]['level'])
{
$last_parent_id=$data[$j]['comment_id'];
$comments[$z][$data[$j]['level']+$kr]=$data[$j];
$last_level=$data[$j]['level'];$kr++;
}
}      
}
}
}
return $comments ;
}

 


Код модели. Если у вы не используете модель MVC то этот код можно использовать просто для формирования массива древовидной структуры.

Убедительная просьба ставить лайки и делиться ссылкой на блог, заранее спасибо ;) 

Код в контроллере

public function comments($id)
{     $this->load->model('home_model');
$data['comments']=$this->home_model->comments($id); 
$this->load->view('article',$data );     
}

 Отображение древовидных комментариев

Обратите внимание на то что тут используется альтернативный PHP синтаксис Codeignater.  Кроме того сюда в дальнейшем необходимо добавить условие, по исполнению которого не будет увеличиваться  отступ слева.

<div class="comments  col-md-12">
<?php foreach ($comments as $item1):
foreach ($item1 as $item2):
?>
<?php if($item2['parent_id']!=0): ?>
<div style="padding-left:<?=10*$item2['level']?>px"><?=$item2['text']?> </div>
<?php else: ?>
<div><?=$item2['text']?> </div>
<?php endif; ?>
<?php endforeach; endforeach;?>
</div>

В итоге мы получаем вот такие комментарии. Конечно же их еще нужно довести до ума, но тут уже дело за малым.

А девочка на картинке прям красотка. Люблю ее 😉

древовидная структура коментов


Добавить комментарий