2011-01-29 2 views
1

Я следую the Nettuts tutorial для реализации субдоменов в стиле Basecamp с помощью CodeIgniter.Глобальные переменные в представлении CodeIgniter

Основываясь на вызывающем субдомене, таблица поддоменов в базе данных возвращает расширение, соответствующее этому поддомену. Итак, скажем, для stackoverflow.mywebsite.com, он вернет расширение sf, и папка с изображением и файл CSS, используемые по всему веб-сайту, будут изменены на основе этого расширения; например, images_sf, style_sf.css и т. д.

Теперь, что является лучшим способом получить это расширение в любом месте в M, V или C?

Варианты:

  1. Печенье
  2. Динамически настройки переменной
  3. CI конфигурации Установить переменную для этого в MY_Controller и получить доступ к этой переменной в любом месте с помощью $this->.
  4. Отправить эту переменную от каждого контроллера к моделям, помощникам, представлениям или библиотекам.

Я пропустил какие-либо другие варианты? Кроме того, какой из них будет лучше всего предполагать, что это будет сильно использоваться по всему коду?

Благодаря

ответ

4

Лично я хотел бы создать базовый контроллер для каждого сайта, который вы расширить, и использовать только $this->load->vars($data); загрузить информацию, вам нужно глобально установить.

В конструкторе вашего конкретного базового контроллера просто загружайте данные в представления по всему миру.

$data->some_var = "some value"; 
$this->load->vars($data); 

А потом во всех ваших взглядах, загруженных этого контроллер (или базового контроллером), вы можете использовать переменную $some_var непосредственно в окне просмотра.

+0

не устанавливает их через php DEFINE - лучший способ? Я уверен, что когда-то они не изменились во время выполнения скрипта. –

+0

Ваш вопрос может быть немного обманчивым, потому что в заголовке вы спрашиваете о представлениях CodeIgniter, но в вопросе, который вы задаете о загрузке информации во все M, V и C. Этот метод будет загружать эти переменные глобально в загруженные представления этим контроллером. – jondavidjohn

2

Лучше всего, вероятно, вариант 3, чтобы поместить его в конструкторе базового регулятора,, вероятно, MY_controller или что вы расширяете контроллер (теперь CI_Controller с CI2.0 официальным релизом)

Однако, если все, что вы 're делает получение расширения, не может быть причины иметь таблицу базы данных, поскольку вы можете просто сохранить ее в файле конфигурации.

Я бы сделал что-то вроде этого ... в MY_Controller.php (Это представляет собой синтаксис CI 2.0)

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class MY_Controller extends CI_Controller { 

     function __construct() 
     { 
      parent::__construct(); 

      $subdomain_arr = explode('.', $_SERVER['HTTP_HOST'], 2); 
      $subdomain_name = $subdomain_arr[0]; 

      $this->load->config('sub_prefix'); 
      $pre_arr = $this->config->item('prefixes'); 

      /* Check to make sure the subdomain name is in the config array */ 
      $this->prefix = isset($pre_arr[$subdomain_name]) ? $pre_arr[$subdomain_name] : ''; 
     } 

Затем в конфигурационном файле (sub_prefix.php)

<?php if (! defined('BASEPATH')) exit('No direct script access'); 

    $config['prefixes'] = array('subdomain1' => 'sub1', 
           'stackoverflow' => 'sf'); 

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

Теперь вы можете использовать префикс $ this-> в любом из видов, контроллеров или моделей вы будете использовать ... лучший способ сделать это для чего-то, что сильно используется во всем вашем приложении.

+0

Мне нужно получить его из db, так как там много 1000 субдоменов с помощью приложения. поэтому жесткое кодирование их в конфигурации может быть не лучшим ... может ли динамическая настройка элемента конфигурации? или установить с помощью php define? –

Смежные вопросы