2017-09-22 13 views
0

load-> viewを使用してウィジェットライブラリを実装しようとしています。私はインクルードを使用してファイルを直接呼び出すことができ、varsキャッシュの問題を回避できますが、なぜそれがうまくいかないのか不思議です。ライブラリ内のビューのロード、キャッシュされた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
ウィジェット/コンテンツを呼び出しは:ウィジェットを呼び出します。ここ

は、私は私のコードを構造化している方法です/ banner

最初のウィジェットコールで設定されたバール(2番目のウィジェットコールと同じ名前)がキャッシュされます。つまり、最初のコールからの値が同じコールに渡されます。異なった意見があるので変です。

私が試してみました:

  • をclear_vars()の使用:前とライブラリのロード - >ビューを行った後の$ this - > CI->ロード - > clear_varsを()、。
  • 空の配列、nullなどでload-> viewを呼び出す
  • varsにウィジェットslugのプレフィックスを追加しようとしました(それは動作しますが、プレフィックスをビューに送信する必要があります。可能性によるキャッシュの問題)

任意のアイデアではないでしょうか?

+0

なぜ 'show()'メソッドでビューを2回ロードするのですか? – DFriend

+0

が、ウィジェットを構築するための方法である@DFriend、私ははい – Eduardo

+0

2つの異なるウィジェットを呼び出していますが、あなたは 'ショー()'メソッドに二度同じビューをロードします。 – DFriend

答えて

0

ここで動作するはずです。さらに考慮した上

(私はそれがはるかに少ない処理を必要とすること、データベースの呼び出しを簡素化の自由を取った。)

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; 
} 

たびWidgetManager::show()$data VARをして再作成されたと呼ばれているので、呼び出し$this->CI->load->clear_vars();はおそらく無意味ですまったく同じキー。 $ data [var]がload->viewに渡されると、$ data ['widget_title']と$ data ['widget_content']の新しい値はそれらのキーを使ってキャッシュされた変数の値を置き換えます。

+0

ちょうど試みましたが、残念ながらそれは動作しません、同じことが起こり続けます。 – Eduardo

+0

私は問題を理解していることを確認したい。 2つの異なるウィジェット(異なるタイトルと内容)を表示します。しかし、何が表示されるのは、同じウィジェットコンテンツが2回あることですか? – DFriend

+0

私を助けるために時間を割いてくれてありがとう。私は "ビュー"フォルダ内に "ウィジェット"と呼ばれるフォルダを持っています。その中には、コンテンツ、バナー、ステップなど、さまざまなファイルがあります。コンテンツは私の一般的なウィジェットで、ほとんどの場合使用されます。私はこれらのウィジェットの処理されたコンテンツを読み込んで、自分のコントローラーのアクションページ/インデックスからそれらを私のページにロードしようとしています。 – Eduardo

関連する問題