Codeigniter动态导航

yts*_*jam 2 codeigniter menu

我是codeigniter的新手.我正在尝试使用mysql数据库编写应用程序.在我的网站中,我想使用菜单:

+Homepage
+About
+Services
  +Education services
  +neurofeedback
  +biofeedback
Run Code Online (Sandbox Code Playgroud)

我需要一些信息来理解.我使用页面控制器作为主页面控制器:

<?php 

class Pages extends CI_Controller {

        public function view($page = 'home')
        {$this->load->view('templates/header', $data);
        $this->load->view('pages/'.$page, $data);
        $this->load->view('templates/footer', $data);
Run Code Online (Sandbox Code Playgroud)

我的问题是:

1)菜单控制器必须在页面控制器内编码还是单独编码?

2)如何从数据库中创建菜单控制器?

3)如何与菜单ID和页面ID建立关系?

我做了很多研究,但我需要更多的了解.

谢谢您的帮助.

编辑:我已经按照你的说法使用了MY_Controller.

这是我的页面控制器:

class Home extends MY_Controller {
         function __construct() {
    parent::__construct();
  }

        public function view($page = 'home')
        {
         $this->load->helper('text');
            $data['records']= $this->services_model->getAll();
            if ( ! file_exists('application/views/pages/'.$page.'.php'))
            {
                // Whoops, we don't have a page for that!
                show_404();
            }

            $data['title'] = ucfirst($page); // Capitalize the first letter


            $this->load->view('pages/'.$page, $data);


        }

}
Run Code Online (Sandbox Code Playgroud)

Sér*_*els 5

菜单控制器必须在页面控制器内编码还是分开?

假设您有一个必须跟随所有页面的模板,我建议您这样做.

1.创建一个基本控制器

在./application/core/文件夹中,创建一个名为MY_Controller的文件

class MY_Controller extends CI_Controller {

  protected $data = array();

  function __construct() {
    parent::__construct();
  }

  function render_page($view) {
    //do this to don't repeat in all controllers...
    $this->load->view('templates/header', $this->data);
    //menu_data must contain the structure of the menu...
    //you can populate it from database or helper
    $this->load->view('templates/menu', $menu_data);
    $this->load->view($view, $this->data);
    $this->load->view('templates/footer', $this->data);
  }

}
Run Code Online (Sandbox Code Playgroud)

2.为每个页面创建一个控制器,并使用MY_Controller而不是CI_Controller

class Homepage extends MY_Controller {
  function __construct() {
    parent::__construct();
  }

  function index() {
    //define data that the view can access
    $this->data['someDataToView'] = 'Some data';
    $this->render_page('pages/homepage');
  }

}
Run Code Online (Sandbox Code Playgroud)

如何从数据库中创建菜单控制器?

好吧,你不会有菜单的控制器,而是一个视图.

菜单的可能性

  1. 为菜单创建一个视图,从MY_Controller中的数据库加载记录,加载视图render_page();
  2. 为菜单创建一个视图,创建一个Helper函数,定义菜单结构并在MY_Controller中使用,加载视图render_page();

菜单模板示例(根据您的场景进行调整):

./application/views/templates/menu.php

<ul>
<?php foreach($menus as $menu): ?>
  <li><a href='<?php print $menu["url"] ?>'><?php print $menu["title"] ?></a></li>
<?php endforeach; ?>
</ul>
Run Code Online (Sandbox Code Playgroud)

编辑

鉴于您的Home控制器,我认为错误在您的file_exists检查中.请参阅我更改的Home控制器:

class Home extends MY_Controller {
  function __construct() {
    parent::__construct();
  }

   public function view($page = 'home') {
     $this->load->helper('text');
     //always use $this->data
     $this->data['records']= $this->services_model->getAll();
     if ( ! file_exists(APPPATH.'views/pages/'.$page.'.php'))
     {
       //check the content of APPPATH.'views/pages/'.$page.'.php'
       // Whoops, we don't have a page for that!
       show_404();
     }

     $this->data['title'] = ucfirst($page); // Capitalize the first letter

     //if you use the MY_Controller, check the render_page function...
     //$this->load->view('pages/'.$page, $data);
     $this->render_page('pages/'.$page)
   }
}
Run Code Online (Sandbox Code Playgroud)