Лучший способ включения представлений в представлениях в CodeIgniter

Я начинаю большой проект codeigniter и хотел бы попытаться создать несколько «мини» представлений многократного использования для фрагментов контента, таких как циклы данных, которые могут отображаться на разных страницах / контроллерах.

Лучше ли вызывать представления изнутри основного контроллера? Если да, то как? Или я должен назвать «мини-представление» с контроллера и, таким образом, передать код представления в основное представление?

Представления в других представлениях называются вложенными представлениями . Существует два способа включения вложенных представлений в CodeIgniter:

1. Загрузите в контроллер вложенное представление

Загрузите представление заранее и перейдите к другому представлению. Сначала поставьте это в контроллер:

<?php // the "TRUE" argument tells it to return the content, rather than display it immediately $data['menu'] = $this->load->view('menu', NULL, TRUE); $this->load->view ('home', $data); ?> 

Затем поставьте <?=$menu?> В своем представлении в точке, в которой вы хотите, чтобы меню отображалось.

2. Загрузите представление «изнутри» в виде

Сначала поставьте это в контроллер:

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

Затем поместите это в представление /application/views/home.php :

 <?php $this->view('menu'); ?> <p>Other home content...</p> 

Что касается лучшего метода, я предпочитаю 1-й метод по сравнению со вторым, потому что, используя 1-й метод, мне не нужно смешивать код, это не похоже на php. Хотя косвенно оба они одинаковы, первый способ более ясен и чист, чем второй!

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

Поэтому мой шаблонный вид будет выглядеть примерно так:

template.php

 $this->load->view('header',$title); $this->load->view('sidebar',$sidebar_content); $this->load->view('main_content',$main_content); $this->load->view('footer'); 

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

 $data['title'] = 'Home Page'; $data['sidebar_content']='pages/standard_sidebar'; $data['main_content'] ='pages/my_home_page'; $this->load->view('template',$data); 

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

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

МЕТОД 1

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

 $this->load->view('include/include_view'); 

СПОСОБ 2

или в контроллере вы можете загрузить kore, чем в виде:

 $this->load->view('header_view'); $this->load->view('list_view'); $this->load->view('footer_view'); 

Не лучший метод, зависит, если вам нужно передать некоторые данные (в его случае используйте метод2) или если вы хотите включить представление в определенную часть вашего основного вида (в этом случае лучше использовать метод 1 )

МЕТОД 3

Передача данных в ваш просмотр с помощью вашего основного вида

в ваш контроллер:

 $data['title'] = "Title"; $this->load->view('main_view',$data); 

на ваш взгляд

 $data2['title'] = $title; $this->load->view('include/include_view',$data2); 

Если вы хотите передать целые данные в ваш включенный вид, вы можете сделать в этом режиме: в вашем контроллере:

 $data['nestedView']['title'] = 'title'; 

на ваш взгляд

 $this->load->view('includes/included_view', $nestedView); 

Это простой способ включения представлений в views.there нет необходимости загружать представления в advance.just пройти путь просмотра к другому представлению.

В вашем контроллере используйте это:

 $data['middle'] = 'includeFolder/include_template_view'; //the view you want to include $this->load->view('main_template_view',$data); //load your main view 

и в main_template_view вы можете включить другие виды:

 $this->load->view($middle); 

На мой взгляд, для более эффективного решения этой проблемы я сделал так:

Вы создаете нового помощника (в приложении / помощниках) с именем (es. common_helpers.php, подчеркивание важно). В этом файле вы помещаете все функции, например, сборки частей html.

 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); function getHead(){ require_once(APPPATH."views/common/head.php"); } function getScripts(){ require_once(APPPATH."views/common/scripts.php"); } function getFooter(){ require_once(APPPATH."views/common/footer.php"); } 

В вашем контроллере вы вызываете только один вид в отношении MVC и вызываете функции из своего пользовательского помощника.

 class Hello extends CI_Controller { public function index(){ $this->load->helper('common'); $this->load->view('index'); } }