在库中加载视图,缓存vars的问题



我正在尝试使用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中替换值。

相关内容

  • 没有找到相关文章

最新更新