0

我的页面上有一个菜单,每个页面都加载了该菜单。菜单数据通过模型从数据库中获取。我的第一个想法是从控制器调用模型,然后将其传递给每个页面上的视图。但这会导致“混乱”的代码,如果我忘记将菜单数据传递给视图,则会导致一个丑陋的错误(或者只是没有菜单项)。

所以我想出了通过助手获取菜单项的解决方案,然后从视图中调用助手函数。这更有意义,因为我只有一个地方的代码(菜单视图)。

我的视图是这样设置的:控制器调用“页面”视图,然后加载标题视图、菜单视图、适当的内容视图,最后是页脚视图。助手只能从一个地方调用,即菜单视图。

通常你甚至不能从助手加载模型,但我做了一个解决方法 $i = get_instance(); 然后通过该实例加载模型;$i->加载->模型()。

我有一种感觉,这不是要走的路,但有没有更好的方法?

编辑:以更好的方式说:

我想要:查看 -> 获取数据 -> 显示

不是:控制器 -> 获取数据 -> 传递给视图 -> 显示

我只是不确定这是否“可以”,因为它完全无视 MVC 模型。

4

3 回答 3

2

所以我找到了一个剪切-粘贴的快速示例(在这种情况下,我有一个称为login自动加载的模型,但您当然可以手动执行)

在文件中core\MY_Controller.php

class Admin_Controller extends CI_Controller 
{
    protected $login_ok;

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

        /* --- Check if user is logged in --- */
        $this->config->load('adldap', TRUE);
        $data->login_ok = $this->login->check_login(TRUE);

        $this->load->vars($data);
    }
}

如果你然后用这个扩展你的控制器。您将$login_ok在您的视图中可用。

这样您就可以确保始终准备好所需的变量,并且您只需在一个地方编写代码

于 2012-07-04T15:52:33.423 回答
1

请记住,关于 MVC 模式的任何内容都不会禁止 View 直接联系 Model。这只是 CodeIgniter 中常见的约定。

我建议在这种情况下,您的菜单视图应该直接从菜单模型加载菜单数据。

于 2012-07-04T15:07:32.900 回答
1

我认为解决方案比您想象的要容易。

如果现在你在你的助手中做这样的事情:

create_menu()
{
    $menu_items = $this->db->query('')->result();
    // creating the menu here
}

您可以更改函数以接受这样的输入,并且仍然遵循 MVC 模式。

帮手

create_menu($input)
{
    $menu_items = $input;
    // creating the menu here
}

模型:

get_menu_data()
{
   $menu_items = $this->db->query('')->result();
}

这有意义吗?

编辑:

这是我在其中一个项目上的做法:

我扩展了我的标准控制器。在该控制器的构造函数中,我调用了模型并获取了数据:

$this->menu_items = $this->some_model->get_menu_items();

在一个视图中nav.php

if(!empty($this->subnav_item))
{
   // Generate menu
}

这样 MVC 是完整的,但我不必担心传递变量。

编辑 2

如何扩展标准控制器:

MY_Controller.php在中创建文件application/core

class MY_Controller extends CI_Controller {

    public $menu_items = '';

    function __construct()
    {
        parent::__construct();
        $this->load->model('some_model_that_you_always_use');
        $this->load->library('some_library_that_you_always_use');
        $this->menu_items = $this->some_model->get_menu_items();
    }

}

当你创建一个新的控制器时,你扩展MY_Controller而不是CI_Controller这样:

 class Something extends MY_Controller {

 }
于 2012-07-04T14:30:28.793 回答