【发布时间】:2017-09-22 15:49:35
【问题描述】:
我正在尝试使用 load->view 来实现一个小部件库。我知道我可以使用 include 直接调用文件并避免 vars 缓存问题,但只是想知道为什么它不起作用。
这是我的代码结构:
我的控制器:
class Page extends MY_Controller {
public $data = array();
public function __construct() {
parent::__construct();
...
$this->load->library('widgetmanager');
}
public function index($slug = '') {
echo $this->widgetmanager->show(2);
echo $this->widgetmanager->show(1);
}
}
我的图书馆
class WidgetManager
{
private $CI;
public function __construct()
{
$this->CI = & get_instance();
}
public function show($widget_id) {
$data = array();
$widget_id = (int)$widget_id;
$this->CI->db->select('*');
$this->CI->db->from('widget');
$this->CI->db->where('id', $widget_id);
$query = $this->CI->db->get();
$item = $query->row_array();
$data['widget_title'] = $item['title'];
$data['widget_content'] = $item['content'];
$widget = $this->CI->load->view('widget/'.$item['source'], $data, TRUE);
$data['widget_title'] = '';
$data['widget_content'] = '';
$this->CI->load->view('widget/'.$item['source'], $data);
return $widget;
}
}
小部件 1:调用小部件/内容
小部件 2:调用小部件/横幅
发生的情况是,在第一个小部件调用上设置的变量(它们与第二个小部件调用同名)被缓存,这意味着来自第一个调用的值被传递给同一个调用。这很奇怪,因为是不同的观点。
我试过了:
- 使用 clear_vars():$this->CI->load->clear_vars(),在对库执行 load->view 之前和之后。
- 使用空数组、null 等调用 load->view
- 尝试将带有小部件 slug 的前缀添加到 vars(可行,但我必须以某种方式将前缀发送到视图,因此由于缓存问题而无法实现)
有什么想法吗?
【问题讨论】:
-
为什么在
show()方法中加载两次视图? -
@DFriend 它是一种构建小部件的方法,我正在调用 2 个不同的小部件
-
是的,但是您在
show()方法中加载了两次相同的视图。 -
@DFriend 不一样,source定义了哪一个,是动态的
-
不是你的编码方式。在函数
show内部,对load->view的两个调用都使用$item['source']定义的相同文件。
标签: codeigniter caching codeigniter-3 loadview