我需要调用一些库函数,以便在我的头部视图中正确显示一些数据-什么是最好/正确的方法?
我认为我应该在所有控制器中调用这个,但它似乎有点多余。我应该走这条路吗?你有什么建议吗?
编辑:我有一个输出页头部分的视图。在这个视图中,我有一个菜单,这取决于你是否登录,有任何收藏夹等。为了确定在菜单中显示什么,我必须参考一些库,例如,身份验证和收藏夹库。
我尝试从视图中调用库,但是它给了我一个错误。
我想我可以加载控制器并将数据传递给每个控制器中的视图,但我会有很多重复的代码。是这条路吗?
是的,在每个控制器或方法中手动分配相同的数据给分部视图是多余的。你要避免这个
任何像样的模板库都应该能够为你处理这个问题。你可以在谷歌上搜索一个解决方案,或者自己写一个。
在这里,在模型代码中,它可能类似于:
class Template {
public $data = array();
function area($area_name)
{
$CI =& get_instance();
$data = isset($this->data[$area_name]) : $this->data[$area_name] ? NULL;
$CI->load->view('templates/'.$area_name, $data);
}
function set_data($area_name, $data)
{
$this->data[$area_name] = $data;
}
}
然后在控制器中,像这样:
$this->template->set_data('header', $my_data);
然后在视图中,像这样:
<header><?php echo $this->template->area('header'); ?></header>
<div><?php echo $this->template->area('content'); ?></div>
<footer><?php echo $this->template->area('footer'); ?></footer>
这是过度简化了,有一百万种方法来处理它,但我绝对建议编写一些类来处理你的模板,而不是仅仅使用$this->load->view()
来处理所有事情,即使它只是一个加载视图的包装器。
为了避免在每个控制器中手动设置相同的数据,使用MY_Controller
,在模板类__construct()
中设置它,或者直接从视图文件中调用它,无论源是什么(模型,库等)。父MVC可能会流泪,但有时这是最简单的,甚至是最有意义的。
如何使用控制器扩展的快速示例:
// File: application/core/MY_Controller.php
class MY_Controller extends CI_Controller {
public function __construct()
{
parent::__construct();
$data['var_name'] = $this->some_lib->get_data();
$data['var_name2'] = $this->some_model->get_more_data();
$this->template->set_data('header', $data);
}
}
然后,您的所有控制器将扩展MY_Controller
而不是CI_Controller
,并且头数据将已经加载。这只是对另一个主题的一个简单的概述,使用这种方法可以实现更多的可能性。
我尝试从视图中调用库,但是它给了我一个错误。
如果库已加载并且正确调用它,则不应该发生这种情况。语法为$this->library_name->method()
。
无论如何,我强烈建议编写或借用某种模板类
您没有遵循MVC模型,但如果您想要,"正确"的方法是调用控制器中的函数,然后将数据传递给打印出来的视图
你应该能够在视图之前自动加载库或者在控制器中加载它。然后你就可以访问视图中的库方法,并且可以像在控制器中那样访问它们。