Библиотека CodeIgniter несколько экземпляров - PullRequest
2 голосов
/ 01 июня 2010

У меня проблема с моей библиотекой codeigniter. Чтобы преобразовать данные базы данных в навигацию и иметь активные элементы и тому подобное, я создаю библиотечный класс CI_Navigation (). Работает отлично, у меня только одна проблема.

Часто на веб-страницах есть соответствующие, но отдельные навигации, например основная навигация вверху и субнавигатор сбоку. Чтобы обойти это, я могу инициализировать свой класс с параметром, сообщающим ему, какие уровни должна удерживать навигация. Я бы, например, сделал что-то вроде этого.

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

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

Как и следовало ожидать, это не работает, потому что данные в классе остаются такими же, какими они были назначены при первом вызове сборки.

К сожалению, в CodeIgniter библиотеки являются синглетонами (верно? Это то, что я читал). Поэтому я не могу инициализировать его дважды, как:

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

У вас есть идеи, как я могу преодолеть эту проблему.

Это должно сработать, если бы я использовал массивы для переменных, используемых в классе, верно? Например. для опций вместо использования опции $ this-> мне нужно было бы динамически создать $ this -> $ option [0], $ this -> $ option [1].

Это работает? Я не могу проверить это в данный момент, но сделаю это сегодня вечером. Но это не очень элегантный способ, так есть ли лучший способ решить это? Можно ли как-нибудь инициализировать библиотеку несколько раз?

Заранее спасибо, ребята.

Ответы [ 2 ]

7 голосов
/ 01 июня 2010

Если вы хотите придерживаться строгой реализации библиотеки CI, я бы посоветовал вам сделать параметры вашего класса массивом конфигураций; и затем укажите конфигурацию, которую вы хотите использовать в вашей функции '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');

Но я часто возвращаюсь к стандартным объектам для такого рода вещей:

$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 голосов
/ 19 мая 2015

Или вы можете сделать что-то вроде этого:

$this->load->library('navigation');
$this->another_navigation = clone($this->navigation);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...