2017-09-22 6 views
0

load-> view를 사용하여 위젯 라이브러리를 구현하려고합니다. include를 사용하여 파일을 직접 호출하고 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 : 위젯/컨텐츠
위젯이 호출 : 위젯 호출/banner

첫 번째 위젯 호출에 설정된 변수 (두 번째 위젯 호출과 동일한 이름)가 캐시되고, 첫 번째 호출의 값이 동일한 호출에 전달됩니다. 다른보기이기 때문에 그것은 별나다.

이 나는 ​​시도했다 :

  • clear_vars을 사용하여() : $ this-> CI->로드 -> clear_vars(), 이전과 라이브러리를로드 ->보기를 수행 한 후.
  • 빈 배열, null 등을 사용하여 load-> view를 호출합니다.
  • 위젯 슬러그와 함께 접두사를 vars에 추가하려고 시도했으나 작동하지 않지만보기에 접두어를 보내야합니다. 캐시 문제로 인해 가능하지 않음)

아이디어가 있으십니까?

+0

왜'show()'메소드에서 뷰를 두 번로드합니까? – DFriend

+0

@DFriend 위젯을 만드는 방법입니다. 다른 위젯을 두 개 호출합니다. – Eduardo

+0

네,하지만 같은 뷰를'show()'메소드에서 두 번로드합니다. – 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; 
} 

을 더 고려에 호출 $this->CI->load->clear_vars(); 아마 무의미마다 WidgetManager::show()$data VAR이와 함께 다시 만들어집니다 호출되기 때문에 정확히 같은 열쇠. $ data var가 load->view에 전달되면 $ data [ 'widget_title'] 및 $ data [ 'widget_content']의 새 값은 해당 키를 사용하여 캐시 된 값의 값을 대체합니다.

+0

그냥 불행하게도 작동하지 않습니다. 계속 동일하게 진행됩니다. – Eduardo

+0

문제를 이해하고 있는지 확인하고 싶습니다. 두 가지 위젯 (다른 제목과 내용)을 보여줍니다. 그러나 동일한 위젯 컨텐츠가 두 번 표시되는 것은 무엇입니까? – DFriend

+0

시간을내어 도와 주셔서 감사합니다. "views"폴더 안에 "widget"이라는 폴더가 있습니다. 그 안에는 콘텐츠, 배너, 단계 등 다른 파일이 있습니다. 콘텐츠는 내 일반적인 위젯으로 대부분의 경우에 사용됩니다.위젯을 처리 한 컨텐츠를로드하여 컨트롤러의 작업 페이지/인덱스를 통해 내 페이지로로드하려고합니다. – Eduardo