2017-09-22 1 views
0

J'essaie d'implémenter une bibliothèque de widgets en utilisant load-> view. Je sais que je peux utiliser include pour appeler directement le fichier et éviter les problèmes de cache de vars, mais je me demande juste pourquoi cela ne fonctionne pas.Chargement de la vue à l'intérieur d'une bibliothèque, problèmes avec les variables en cache

Voici comment j'ai structuré mon code:

Mon contrôleur:

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

    } 
} 

Ma bibliothèque

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 de 1: Appels widget/contenu
widget de 2: Appels un widget/banner

Quoi se passe est, les vars mis sur le premier appel de widget (ils sont même nom que le deuxième appel de widget), sont mis en cache, ce qui signifie que les valeurs du premier appel sont passées au même appel. C'est bizarre parce que ce sont des vues différentes.

J'ai essayé:

  • En utilisant clear_vars(): $ this-> CI-> load-> clear_vars(), avant et après avoir fait load-> vue sur la bibliothèque. Appelez load-> view avec un tableau vide, null, etc
  • J'ai essayé d'ajouter un préfixe avec le slug du widget aux vars (cela fonctionne, mais je dois envoyer en quelque sorte le préfixe à la vue, donc n'est pas possible cause de cache)

Des idées?

+0

Pourquoi charger la vue deux fois dans la méthode 'show()'? – DFriend

+0

@DFriend c'est une méthode pour construire un widget, j'appelle 2 widgets différents – Eduardo

+0

Oui, mais vous chargez la même vue deux fois dans la méthode 'show()'. – DFriend

Répondre

0

Voici ce qui devrait fonctionner.

(je me suis permis de simplifier votre appel de base de données rendant nécessite beaucoup moins de traitement.)

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

sur un examen plus approfondi L'appel $this->CI->load->clear_vars(); est probablement inutile parce que chaque fois WidgetManager::show() est appelé $data var est recréée avec exactement les mêmes clés. Lorsque la variable $ data est passée à load->view, les nouvelles valeurs de $ data ['widget_title'] et $ data ['widget_content'] remplaceront les valeurs dans les vars mis en cache en utilisant ces clés.

+0

vient d'essayer, malheureusement, il ne fonctionne pas, il continue à se produire le même. – Eduardo

+0

Je veux m'assurer de comprendre le problème. Vous montrez deux widgets différents (différents titres et contenu). Mais ce qui est affiché est le même contenu de widget deux fois? – DFriend

+0

merci beaucoup d'avoir pris le temps de m'aider. J'ai un dossier appelé "widget" dans le dossier "views". A l'intérieur, j'ai des fichiers différents, par exemple: contenu, bannière, étapes. Le contenu est mon widget général, utilisé dans la plupart des cas.Je cherche à charger le contenu traité de ces widgets pour ensuite les charger sur ma page via la page d'action/index de mon contrôleur. – Eduardo