2010-06-01 8 views
2

J'ai un problème avec ma bibliothèque codeigniter. Pour transformer des données de base de données dans une navigation et avoir des éléments actifs et similaires, je construis une classe de bibliothèque CI_Navigation(). Cela fonctionne parfaitement bien, j'ai juste un problème.Bibliothèque CodeIgniter plusieurs instances

Souvent sur les pages Web on a des navigations correspondantes mais séparées, par ex. une navigation principale en haut et une sous-navigation sur le côté. Pour contourner cela, je peux initialiser ma classe avec un paramètre lui indiquant les niveaux que cette navigation doit contenir. Je ferais par exemple quelque chose comme ça.

$this->load->library('Navigation'); 

$main = $this->navigation->build(array('levels'=>array(0))); 
$sub = $this->navigation->build(array('levels'=>array(1,2))); 

Comme vous pouvez vous attendre cela ne fonctionne pas, car les données de la classe reste la façon dont il a été attribué par le premier appel de construction. Malheureusement, dans CodeIgniter, les bibliothèques sont des singletons (c'est bien ce que j'ai lu). Donc, je ne peux pas l'initialiser deux fois comme:

$this->load->library('Navigation','','main'); 
$this->load->library('Navigation','',sub); 

Avez-vous une idée de comment je peux surmonter ce problème.

Cela devrait fonctionner si j'utiliserais des tableaux pour les variables utilisées dans la classe droite? E.g. pour les options au lieu d'utiliser $ this-> option, je devrais créer dynamiquement $ this -> $ option [0], $ this -> $ option [1].

Est-ce que cela fonctionne? Je ne peux pas le tester pour le moment mais je le ferai ce soir. Mais ce n'est pas un moyen vraiment élégant, alors y a-t-il une meilleure façon de résoudre ce problème? Est-il possible que je puisse initialiser la bibliothèque plusieurs fois?

Merci d'avance les gars.

Répondre

7

Si vous voulez coller l'implémentation stricte de la bibliothèque CI, alors je vous suggère de faire de vos paramètres de classe un tableau de configurations; puis spécifiez la configuration que vous souhaitez utiliser dans votre fonction "build".

$options = array 
(
    'main' => array('level' => 0), 
    'sub' =>array('level' => 1) 
); 

$this->load->library('navigation', $options); 

$main_nav = $this->navigation->build('main'); 
$sub_nav = $this->navigation->build('sub'); 

Mais je reviens souvent à des objets standards pour ce genre de chose:

$a_navigator = new Navigation($options_a); 
$b_navigator = new Navigation($options_b); 

$a_tree = $a_navigator->build(); 
$b_tree = $b_navigator->build(); 

unset($a_navigator); 
unset($b_navigator); 
+0

Okey, merci, la première solution est à propos de ce que j'avais en tête, alors je vais essayer et vous dire si cela fonctionne. Merci pour votre réponse de toute façon. –

+0

Oui, cela fonctionne. Parfait, merci beaucoup. Je parle en fait de la première version, en utilisant le tableau d'options. Je n'ai pas essayé l'autre méthode. –

+0

Excellent, je suis content que cela a fonctionné pour vous! – Kurucu

0

Sinon, vous pouvez faire des choses comme ceci:

$this->load->library('navigation'); 
$this->another_navigation = clone($this->navigation);