我正在尝试使用load->view实现一个widgets库。我知道我可以使用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;
}
}
widget 1:调用widget/content
小部件2:呼叫小部件/横幅
发生的事情是,在第一个小部件调用上设置的变量(它们与第二个小部件调用的名称相同),被缓存,这意味着第一个调用的值被传递给同一个调用。这很奇怪,因为有不同的观点。
我试过:
- 使用clear_vars():$this->CI->load->clear_vars(),在对库执行load->view之前和之后。
- 使用空数组、null等调用load->view
- 尝试添加一个前缀与小部件slug的变量(这工程,但我必须以某种方式发送前缀的看法,所以这是不可能的,由于缓存问题)
有什么想法吗?
2条答案
按热度按时间uurv41yg1#
这是应该工作的。
(我冒昧地简化了您的数据库调用,使其需要更少的处理。
调用
$this->CI->load->clear_vars();
可能是无意义的,因为每次调用WidgetManager::show()
时,$data
var都是用完全相同的键重新创建的。当$data var传递给load->view
时,$data ['widget_title']和$data ['widget_content']的新值将使用这些键替换缓存的var中的值。xhv8bpkk2#
我在这里面临着同样的问题,为了调试的目的,你可以用这个方法通过CI加载来检查缓存的变量:
使用after call Load方法来了解缓存的变量是很有用的。如果你需要清理这个“缓存”,你可以使用@DFriend公开的方法:
如果你不想调用这个方法,并利用该高速缓存,你可以重写变量。