Я начинаю большой проект codeigniter и хотел бы попытаться создать несколько «мини» представлений многократного использования для фрагментов контента, таких как циклы данных, которые могут отображаться на разных страницах / контроллерах.
Лучше ли вызывать представления изнутри основного контроллера? Если да, то как? Или я должен назвать «мини-представление» с контроллера и, таким образом, передать код представления в основное представление?
Представления в других представлениях называются вложенными представлениями . Существует два способа включения вложенных представлений в CodeIgniter:
Загрузите представление заранее и перейдите к другому представлению. Сначала поставьте это в контроллер:
<?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?>
В своем представлении в точке, в которой вы хотите, чтобы меню отображалось.
Сначала поставьте это в контроллер:
<?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'); } }