Php 使用codeigniter在头文件上加载菜单

Php 使用codeigniter在头文件上加载菜单,php,codeigniter,Php,Codeigniter,我是Codeigniter的新手,我一直在尝试使用它开发一些部件。 在我的头文件中,我需要加载我的菜单项,我已经创建了一个菜单控制器、菜单模型和一个视图。 控制器页 <?php class Menu extends CI_Controller { public function __construct(){ parent::__construct(); $this->load->model('menu_model'); } public fu

我是Codeigniter的新手,我一直在尝试使用它开发一些部件。 在我的头文件中,我需要加载我的菜单项,我已经创建了一个菜单控制器、菜单模型和一个视图。 控制器页

<?php
  class Menu extends CI_Controller
  {
 public function __construct(){
     parent::__construct();
     $this->load->model('menu_model');

 }
 public function index(){

    $data['menuArray'] = $this->mainMenuDataLoad();

    if($data['menuArray']){
        $this->load->view('menu' , $data);
    }
 }

 public function mainMenuDataLoad(){ /* create menus Array */

    $rootMenuData = $this->menu_model->loadManuData();

    if($rootMenuData){
        for($e=0; $e<count($rootMenuData); $e++){
            if($rootMenuData[$e]){
                $data[$e] = array(
                        'title' => $rootMenuData[$e]['title'],
                        'menu_id' => $rootMenuData[$e]['menu_id'],
                        'url' => $rootMenuData[$e]['url'],
                        'menu_icon' => $rootMenuData[$e]['menu_icon'],
                );

                $get_sub = $this->mainMenuDataLoad($rootMenuData[$e]['menu_id']);
                if($get_sub){
                    $data[$e]['sub'] = $get_sub;
                }
            }
        }
        return $data;
    }
    return false;
 }   }
在我的菜单视图页面上,我正在循环菜单数据。 但是在我的header.php上,如果我尝试像这样调用菜单控制器

$this->load->controller('menu');
这给了我一个这样的错误

致命错误:在header.php上调用未定义的方法CI_Loader::controller()

我做错了什么?。 有人请引导我。 提前谢谢

menu.php查看页面

 <ul class="nav navbar-nav">
    <?php 
    print_r($menuArray);
            for($q=1; $q<count($menuArray); $q++){ 

        ?><li>
                        <a href="<?php echo base_url($menuArray[$q]['url']);?>">
                            <span class="<?php echo $menuArray[$q]['menu_icon'];?>">
                            <?php echo $menuArray[$q]['title'];?>
                            </span>
                        </a>
                    </li>
        <?php   }

    ?>

  </ul>

您不能从视图中调用控制器

i、 e.在视图页面中写入此代码
$this->load->controller('menu')是不允许的

控制器加载视图和模型,它是这里的主控制器

[更多编辑:]

把你的模型换成这个

class Menu_model extends CI_Model{
public function __construct(){
    parent::__construct();
}

public function get_menu()
{
    $this->db->select("*");
    $this->db->from('tbl_menu');
    $this->db->order_by("order", "DESC");
    $query = $this->db->get();

    return $query;

}

}?>
然后在控制器中执行此操作

public function index(){

            $data['menuArray'] = $this->menu_model->mainMenuDataLoad()->result_array();
            $this->load->view('header', $data);
            $this->load->view('menu'); // u are passing data from here//
            $this->load->view('landing_page');
            $this->load->view('footer');
         }
最后一个观点是

<?php
    if(count($menuArray)>0)
    {
    for($q=0; $q<count($menuArray); $q++){ 

        ?><li>
                        <a href="<?php echo base_url($menuArray[$q]['url']);?>">
                            <span class="<?php echo $menuArray[$q]['menu_icon'];?>">
                            <?php echo $menuArray[$q]['title'];?>
                            </span>
                        </a>
                    </li>
        <?php   }
    }?>

  • 如果使用函数创建BaseController并从扩展控制器调用它,则控制器中也不需要公共函数mainMenuDataLoad()函数,这是更好的解决方案

    基本控制器:

    class BaseController extends CI_Controller 
    {
    protected $data = array();
    
    function __construct() {
        parent::__construct();
    
         $this->load->model('my_model');
    }
    
    protected function LoadContView($aContentView) {
        $this->data['menu'] = $this->my_model->getMenu();
    
        $this->load->view('common/ViHeader', $this->data);
        $this->load->view($aContentView, $this->data);
        $this->load->view('common/ViSidebar', $this->data);
        $this->load->view('common/ViFooter', $this->data);
    }
    
    Mypage:

    class Mypage extends BaseController{
    
        function __construct() {
            parent::__construct();
        }
    
        public function index() {
            $this->LoadContView('my_view');
        }
    
    }
    

    也可以使用foreach($menu\u数组作为$menu\u项):

    :但是如何在header.php上加载菜单?就像这样$this->view('menu');你不需要像那样加载菜单。告诉我您拥有的视图文件,如header.php、menu.php、index.php、footer.php、etcheader.php、landing.php、footer.php和menu.phpnow,从上到下告诉我这些文件。如果header.php位于顶部,menu.php位于header.php之下,那么像header.php、menu.php这样编写。。。在你的问题中写下菜单的html代码。这样我才能理解你在那里?请回复,而不是通过控制器加载菜单,尝试使用助手。只需在helper文件中定义您的方法,通过autoload加载它,并从视图中调用helper方法。通过这种方式,您将在头文件中调用一个方法,并且在任何地方都可用。
    class Mypage extends BaseController{
    
        function __construct() {
            parent::__construct();
        }
    
        public function index() {
            $this->LoadContView('my_view');
        }
    
    }