Каков наилучший способ построения заголовков и нижних колонтитулов? Если вы вызываете все это из контроллера или включаете из файла вида? Я использую CodeIgniter, и я хочу знать, для чего лучше всего подходит. Загрузка всех включенных файлов просмотра с контроллера, как это?
class Page extends Controller { function index() { $data['page_title'] = 'Your title'; $this->load->view('header'); $this->load->view('menu'); $this->load->view('content', $data); $this->load->view('footer'); } }
или вызов одного файла представления, а также вызов заголовков и нижнего колонтитула оттуда:
//controller file class Page extends Controller { function index() { $data['page_title'] = 'Your title'; $this->load->view('content', $data); } } //view file <?php $this->load->view('header'); ?> <p>The data from the controller</p> <?php $this->load->view('footer'); ?>
Я видел это в обоих направлениях, но хочу выбрать сейчас, прежде чем идти слишком далеко по пути.
Вы также можете попробовать это так: определить шаблон представления по умолчанию, который затем втягивает содержимое на основе переменной («контент» в моем примере), передаваемой контроллером.
В вашем контроллере:
$data['content'] = 'your_controller/index'; // more code... $this->load->vars($data); $this->load->view('layouts/default');
Затем определите макет по умолчанию для всех страниц, например views / layouts / default.php
// doctype, header html etc. <div id="content"> <?= $this->load->view($content) ?> </div> // footer html etc.
Тогда ваши представления могут содержать только чистый контент, например views / your_controller / index.php могут содержать только переменные, переданные из массива контроллера / данных
<?= $archives_table ?> <?= $pagination ?> // etc.
Подробнее о CI wiki / FAQ – (Q. Как вставлять представления в представления? Вложенные шаблоны? …)
Собственно, после изучения этого совсем немного, я пришел к выводу, что наилучшая практика включения верхних и нижних колонтитулов в MVC – это третий вариант – расширение базового контроллера. Это даст вам немного больше гибкости, чем предложение htxt, особенно если вы создаете очень модульный макет (а не только верхний и нижний колонтитулы, а также панели боковой панели, нестатические меню и т. Д.).
Во-первых, определите класс Base_controller, в котором вы создаете методы, которые присоединяют элементы страницы (заголовок, нижний колонтитул и т. Д.) К выходной строке:
class Base_controller extends Controller { var $_output = ''; function _standard_header($data=null) { if (empty($data)) $data = ...; // set default data for standard header here $this->_output .= $this->load->view('header', $data, true); } function _admin_header($data=null) { if (empty($data)) $data = ...; // set default data for expanded header here $this->_output .= $this->load->view('admin_header', $data, true); } function _standard_page($data) { $this->_standard_header(); $this->_output .= $this->load->view('standard_content', $data, true); echo $this->_output; // note: place the echo statement in a // separate function for added flexibility } function _page_with_admin_header($data) { $this->_admin_header($data); $this->_output .= $this->load->view('standard_content', $data, true); echo $this->_output; } }
Затем в ваших контролерах страниц просто добавьте базовый класс и вызовите свои функции для создания страницы.
class Page_controller extends Base_controller { function index() { $data = ...; // Set content data here $this->_standard_page($data); } function admin() { $data = ...; // Set content and header data here $this->_page_with_admin_header($data); } }
Используя базовый контроллер, вы можете получить очень чистый код в своих индивидуальных контроллерах страниц. У вас есть отдельные представления для элементов на странице (что позволяет повторное использование кода как в представлениях, так и в контроллерах). Все, что вам нужно сделать, это определить разделы вашей общей страницы (что может вызвать соблазн вызвать «фрагменты») в качестве функций вашего базового контроллера.
И если базовый контроллер должен неуклонно расти (что может произойти на больших сайтах), вы можете изменить некоторые из его менее общих функций, поместив их в подклассы и позволить соответствующим контроллерам страниц расширять их вместо исходного базового контроллера.
Наслаждайтесь!
/ Йенс Роланд
Я думаю, что первый способ, которым вы это делаете, чище. Просто с точки зрения знания того, что будет сделано. Вместо того, чтобы вводить файл просмотра, чтобы найти остальное.
Неправильно использовать вызовы из других представлений. Это может быть форма смешения вида контроллера. Функция просмотра в CI позволяет вам передать третий параметр, который заставляет его возвращать эти представления в виде строки. Вы можете использовать это для создания сложного вида.
Например:
class Page extends Controller { function index() { $data['page_title'] = 'Your title'; $this->load->view('default_layout', array( 'header' => $this->load->view('header' , array(), true), 'menu' => $this->load->view('menu' , array(), true), 'content' => $this->load->view('content', $data , true), 'footer' => $this->load->view('footer' , array(), true), )); } }
default_layout.php
<? echo $header, $menu, $content, $footer; ?>
Вы можете комбинировать верхний и нижний колонтитулы, чтобы создать такой шаблон.
class Page extends Controller { function index() { $data['page_title'] = 'Your title'; $this->load->view('default_template', array( 'menu' => $this->load->view('menu' , array(), true), 'content' => $this->load->view('content', $data , true), )); } }
default_template.php
<html><head></head><body><span>Some Header HTML</span> // this is your header html <? echo $menu, $content; ?> <span>some footer HTML</span></body></html> // this is your footer html