我正在尝试使用load-> View实现小部件库。我知道我可以使用包含来直接调用文件并避免使用VAR缓存问题,只是想知道为什么它不起作用。
这是我构造代码的方式:
我的控制器:
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:呼叫窗口小部件/横幅
正在发生的事情是,第一个窗口小部件呼叫上设置的var(它们与第二个小部件呼叫相同),被加速,这意味着第一个调用中的值将传递给同一调用。这很奇怪,因为是不同的视图。
我尝试过:
- 使用clear_vars():$ this-> ci-> load-> load-> clear_vars(),在库上进行load->视图。
- 用空数组,null等查看load->视图
- 尝试将带有小部件slug的前缀添加到vars(这有效,但我必须以某种方式发送视图的前缀,因此由于缓存问题是不可能的)
有什么想法?
这是应有的。
(我凭借简化了您的数据库调用的自由,使其需要更少的处理。)
public function show($widget_id)
{
$data = array();
$widget_id = (int) $widget_id;
$item = $this->CI->db
->get_where('widget', array('id' => $widget_id))
->row_array();
$data['widget_title'] = $item['title'];
$data['widget_content'] = $item['content'];
$widget = $this->CI->load->view('widget/'.$item['source'], $data, TRUE);
//clear the cached variables so the next call to 'show()' is clean
$this->CI->load->clear_vars();
return $widget;
}
在进一步考虑的情况下,呼叫$this->CI->load->clear_vars();
可能毫无意义,因为每次WidgetManager::show()
称为$data
VAR都使用完全相同的键重新创建。当将$数据var传递给 load->view
时,$ data ['widget_title']的新值和$ data ['widget_content']将使用这些键在缓存的var中替换值。