Два контроллера для одного представления, CodeIgniter? - PullRequest
2 голосов
/ 19 мая 2011

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

Как лучше всего это сделать без копирования / вставки?

Ответы [ 6 ]

8 голосов
/ 19 мая 2011

Есть много способов сделать это.

1) Шаблонирование: это мое предпочтение в большинстве случаев (поскольку мои шаблоны сложны), я отображаю свое представление в переменную, используя что-то вроде:

$content = $this->load->view('myview', $page_data, true);

Затем я загружаю его в анализатор шаблонов (к вашему сведению, вы также можете загрузить его в другое представление) следующим образом:

$this->load->library('parser');
$data = array(
        'page_title' => 'My Page Title',
        'page_content' => $content,
        'side_bar' => side_bar(), // function which generates your side bar
        'right_col' => right_col() // function which generates your right column
        );
$this->parser->parse('my_template', $data);

Тогда ваш шаблон выглядит так:

<html>
<head>
<title>{page_title}</title>
</head>
<body>
    <div>{side_bar}</div>
    <div>{page_content}</div>
    <div>{right_col}</div>
</body>
</html>

2) Загрузить другое представление в вашем представлении: (предполагается, что ваше меню - это представление, а не контроллер). Примерно так:

<?php $this->load->view('menu_view'); ?> 

3) PHP включает в себя: как именно это сделать на простом PHP (просто включите URL, указывающий на контроллер, который возвращает меню), что-то вроде этого:

<?php include("/common/sidebar"); ?>

Codeigniter отобразит эту страницу и затем включит ее.

4) AJAX. Я использую это, если содержимое в «шаблоне» менее важно, например, баннеры, предлагаемые списки связанных элементов и т. Д.

3 голосов
/ 19 мая 2011

Используйте PHP для генерации статической HTML-страницы, такой как side_bar.html ... Затем вы можете включить ее на других страницах.

2 голосов
/ 19 мая 2011

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

<html>
<head>
</head>
<body>
<?php echo $sidebar; ?>
<?php echo $content; ?>
<?php echo $right_column; ?>
</body>
</html>

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

private function BuildTemplate($view, $data) {
   // Generate sidebar content
   $sidebar_data['...'] = 'blah blah';
   $master_data['sidebar'] = $this->load->view('sidebar', $sidebar_data, true);

   // Generate right column data
   $right_data['...'] = 'blah blah';
   $master_data['right_column'] = $this->load->view('right_column', $right_data, true);

   // Now load your content
   $master_data['content'] = $this->load->view($view, $data, true);

   // Merge it into the master template and return it
   return $this->load->view('master' $master_data, true);
}

Затем в вашем подходящем методе контроллера:

public function index() {
   $data['...'] = 'blah';
   echo $this->BuildTemplate('index', $data);
}

, который соберет все для вас.При желании вы можете добавить дополнительные аргументы в BuildTemplate, если хотите добавить такие вещи, как заголовки страниц или сценарии.

2 голосов
/ 19 мая 2011

Вы можете посмотреть на HMVC . Он особенно подходит для областей типа «виджет», о которых вы говорите.

По сути, вы будете создавать две полные структуры MVC - одну для боковой панели и правого столбца, включая контроллер, модель (если требуется) и частичное представление. Затем вы можете вызвать этот контроллер непосредственно из основного окна, чтобы вывести на страницу необходимый контент.

Чтобы вызвать его из представления, просто поместите следующее в разметку везде, где вы хотите, чтобы появилась боковая панель:

<?php echo modules::run('module/sidebar/index'); ?>

Индекс не требуется, но я поместил его там, чтобы продемонстрировать, что вы можете вызывать различные методы, используя modules::run(). Вы также можете передать неограниченное количество параметров в modules::run().

1 голос
/ 19 мая 2011

Я не уверен, что ваша проблема в представлении или в (динамических) данных, которые будут отображаться в (общих частях) этого представления. Если это позже (как кажется, предлагает фразу «я не хочу перекодировать одни и те же биты, чтобы получить данные в каждом контроллере»), то у вас есть несколько вариантов. Например.

  1. Поместите логику для получения «общих» данных в какую-то функцию вне контроллера, в качестве помощника или внутри какой-либо модели, и вызывайте ее из ваших контроллеров.

  2. Заставьте ваши контроллеры наследовать ваш собственный пользовательский контроллер, который реализует эту функцию сбора данных.

  3. Рефакторинг двух ваших контроллеров в один контроллер с различными функциями для каждого сценария.

0 голосов
/ 12 августа 2018

1 - Создайте пользовательский класс библиотеки в папке библиотеки с кодом ниже

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

class LoadView{

   function __construct(){
    $this->CI =& get_instance();
   }
   function load_view($page){
       $this->CI->load->view('header');
       $this->CI->load->view('sidebar');
       $this->CI->load->view($page);
       $this->CI->load->view('footer');
   }

}

2-Теперь загрузите эту библиотеку в свой контроллер вот так

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

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

$this->loadview->load_view('about.php');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...