Не так давно родилась у меня идея создать собственный сайт, но так как я не являюсь программистом и имея при всем этом очень скудные знания в этой области, решил использовать 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

Спасибо за просмотр и прошу сильно не ругать, это моя первая статья. Приму любую объективную критику.