Pull to refresh

Построение двухуровневого дерева форума на Codeigniter

Не так давно родилась у меня идея создать собственный сайт, но так как я не являюсь программистом и имея при всем этом очень скудные знания в этой области, решил использовать framework с легкодоступной и понятной документацией, а именно codeigniter.

Во время написания сайта было много сложных моментов, и, как обычно, выручал меня google. Но при написании форума для сайта я столкнулся с проблемой написания дерева форума. Прочитав немало статей и обсуждений, проблему не решил, поэтому начал обдумывать какое-то более общее и компактное решение, не нарушающее главного принципа codeigniter'а — это MVC.

Давайте создаим сначала одну таблицу, в которую будет входить название раздела, номер (ID) и ID родителя этого раздела:

CREATE  TABLE `tb_forum_structure` (
`id` INT  NOT NULL AUTO_INCREMENT ,
`division`  VARCHAR( 128 ) NOT NULL ,
`parent_forum`  INT NOT NULL ,
PRIMARY KEY  ( `id` )
);

В данной таблице можно создавать разделы первого и второго уровней, указывая их родителей: если раздел является главным, то parent_forum = 0; если зависимым, то parent_forum = id(раздела_родителя).

Вносим данные в таблицу:

INSERT INTO  `tb_forum_structure` (
`id` ,
`division` ,
`parent_forum`
)
VALUES (NULL ,  'Административный раздел',  '0'),
              (NULL ,  'Программы и прочее',  '0'),
              (NULL ,  'Правила портала',  '1'),
              (NULL ,  'Работа портала',  '1'),
              (NULL ,  'Компас 3D',  '2');

Далее начинается самое интересное, требуется создать двухуровневый список в отображение на форуме, да так чтобы не нарушить принцип «MVС» codeigniter'a.

Создаем файл отображения в папке views/forum: forumview.php

<div class='forum_content'>
		<div class='forum_devision'>
			<?echo $list;?>
		</div>
</div>

Далее создаем контроллер в папке controllers: forum.php:

class Forum extends CI_Controller{
	
	function index()
	{	
		$this->load->model('forum_structure_model');
		$data = array(
			'titles' => 'Форум',
			'list' => $this->forum_structure_model->get_forum()
		);	
		
		$this->load->view('header', $data);
		$this->load->view('forum/forumview', $data);
		$this->load->view('footer', $data);
	}
}

И в конце создаем модель в папке models: forum_structure_model.php:

class Forum_structure_model extends CI_Model {
	
	public function __construct()
	{
		parent::__construct();
	}
	
	public function get_forum()
	{
               //Делаем запрос в БД к таблице со структурой форума
		$query = $this->db->get('tb_forum_structure');
			$view = '<ul>';
               // открываем цикл и формируем переменную с объектами результата запроса
		foreach ($query->result() as $row){
                       //без следующего условия будут показаны все результаты запроса, а нам нужны только те, где родитель=0
			if ($row->parent_forum == '0'){
				$view .= '<li>'.$row->division;
                              //  Второй цикл с формированием новой переменной с объектами результата запроса
				foreach ($query->result() as $item){
					$view .= '<ul>';
                                        //условие: показать только те разделы, у которых родитель = id предыдущего цикла
					if ($row->id == $item->parent_forum){
						$view .= '<li>'.$item->division.'</li>';
					}
					$view .= '</ul>';
				}
				$view .= '</li>';
			}
		}
			$view .= '</ul>';
               // выводим результат
		return $view;
	}
}

После всей проделанной работы можно насладиться результатом, перейдя по адресу: www.your_site.ru/forum

image

Спасибо за просмотр и прошу сильно не ругать, это моя первая статья. Приму любую объективную критику.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.