Я довольно новичок в MVC, и недавно нашел CodeIgniter. Я все еще изучаю каждый день, но одна проблема – его механизм шаблонов. Каков наилучший способ создания шаблонов в CodeIgniter?
CakePHP поставляется со своей собственной библиотекой шаблонов, есть ли аналогичная функция в CodeIgniter?
В отличие от других фреймворков CodeIgniter не имеет глобальной системы шаблонов. Каждый контроллер управляет собственным выходом независимо от системы, а представления – FIFO, если не указано иное.
Например, если у нас есть глобальный заголовок:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html> <head> <title><?=$title?></title> <!-- Javascript --> <?=$javascript ?> <!-- Stylesheets --> <?=$css ?> </head> <body> <div id="header"> <!-- Logos, menus, etc... --> </div> <div id="content">
и глобальный нижний колонтитул:
</div> <div id="footer"> <!-- Copyright, sitemap, links, etc... --> </div> </body> </html>
то наш контроллер должен выглядеть
<?php class Welcome extends Controller { function index() { $data['title'] = 'My title'; // Javascript, CSS, etc... $this->load->view('header', $data); $data = array(); // Content view data $this->load->view('my_content_view', $data); $data = array(); // Copyright, sitemap, links, etc... $this->load->view('footer', $data); } }
Существуют и другие комбинации, но лучшие решения существуют через пользовательские библиотеки, такие как:
См. Комментарии ниже
Я пробовал несколько способов создания шаблонов codeigniter, и способ, которым я остаюсь, является самым быстрым и простым, заключается в следующем.
В контроллере:
//Charge the view inside array $data['body'] = $this->load->view('pages/contact', '', true); //charge the view "contact" in the other view template $this->load->view('template', $data);
В поле зрения template.php:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es"> <head> <title>Template codeigniter</title> </head> <body> <div> <?=$body?> </div> <div class="clear"></div> <div>Footer</div> </div> </body> </html>
$body
– контакт вида.
Создайте библиотеку, которая включает в себя все ваши представления и отправьте ее, которые вам нужно отправить на ваш контент. Это все!
<?php class Display_lib { public function user_page($data,$name) { $CI =& get_instance (); $CI->load->view('preheader_view',$data); $CI->load->view('header_view'); $CI->load->view('top_navigation_view'); $CI->load->view($name.'_view',$data); $CI->load->view('leftblock_view',$data); $CI->load->view('rightblock_view',$data); $CI->load->view('footer_view'); } }
Эта библиотека, простая в использовании и настраиваемая, делает именно то, что вы ожидаете:
Самая простая библиотека шаблонов для CodeIgniter
Я использую CodeIgniter с Smarty, и это здорово (если вам нравится Smarty, я знаю).
Скажем, у вас есть контроллер статьи, вы можете сделать что-то вроде этого:
class Article extends Controller { function show_all() { $articles = $this->article_model->get_all(); $this->smarty->assign('entities', $articles); $this->smarty->view('list'); } }
И затем в вашем шаблоне:
{include file="header.tpl"} <ul> {foreach from=$entities item=entity} <li>{$entity.title}</li> {/foreach} </ul> {include file="footer.tpl"}
Приятная часть этого заключается в том, что диспетчеру действительно не нужно знать о верхних и нижних колонтитулах. Он просто знает, что группа статей должна отображаться как список. Оттуда именно шаблоны отвечают за определение того, как отображается список вещей, в данном случае, в ul между верхним и нижним колонтитулом.
Еще одна интересная вещь, которую вы можете сделать, это использовать этот шаблон списка для вещей, которые не являются статьями. У вас может быть список пользователей или страниц или что-то еще. В некоторых случаях использование такого шаблона может быть полезным. Не всегда, но иногда.
Настройка CodeIgniter для smarty довольно проста. Речь идет о копировании файлов Smarty в папку с вашей библиотекой и создании для него простой оболочки. Инструкции можно найти здесь:
http://devcha.blogspot.com/2007/12/smarty-as-template-engine-in-code.html
Как только вы получите, это здорово.
У меня есть два основных шаблона; один для сайта и один для нашей панели администратора. Вот моя настройка для нашего основного сайта (в основном статического) … Я решил на одном контроллере, называемом site
Он вызывает файл шаблона и каждую страницу и получает его файл вида.
Почему никто не упоминает использование шаблонов шаблонов? Лучше / быстрее ?
В config/template.php
я определил шаблон (ы). Примечание * site_template * находится в папке views
:
$template['site']['template'] = 'site_template'; $template['site']['regions'] = array('title','section','col2','content',); $template['site']['parser'] = 'parser'; $template['site']['parser_method'] = 'parse'; $template['site']['parse_template'] = FALSE;
В config/routers.php
я config/routers.php
правила для обработки запросов для контроллера site
которые в основном являются URL-адресами отдельных сегментов, но у нас есть один раздел, который структурирован как таковой; / who-we-are, а затем для избранных людей / who-we-are / robert-wayne и так:
$route['what-we-do'] = 'site/what_we_do'; $route['who-we-are'] = 'site/who_we_are'; $route['who-we-are/(:any)'] = "site/who_we_are/$1"
И controllers/site.php
Опять с функцией для каждой страницы / раздела:
class Site extends CI_Controller { function __construct() { parent::__construct(); $this->template->set_template('site'); // ask for the site template $this->load->library('mobile'); } public function index() { $data = array('section' => 'home'); $this->template->write_view('col2', 'site/menu.php', $data); $this->template->write('title', "COOL PAGE TITLE", TRUE); $this->template->write('section', $data['section'], TRUE); $this->template->write_view('content', 'site/welcome', $data); $this->template->render(); } public function who_we_are() { // this bit readies the second segment. $slug = str_replace('-', '_', $this->uri->segment(2, 0)); if($slug) // IF there is a second segment we load the person. { $data['bio'] = $this->load->view('site/people/'.$slug, '', true) } else { // where it loads the general view who_we_are } // and so on for each page...
и в качестве замечательного уведомления маршрутизатор позволяет нам оставить «/ site /» в URL -адресе , http: // site.com/who-we-are
мысли? кто угодно? Bueller?
Ну, вы можете использовать библиотеку codeigniter для шаблонов. Самые известные из них:
Я склонен к этой библиотеке шаблонов, созданной Carmelo Capinpin, потому что она настолько проста в использовании: текст ссылки . Просто скопируйте файл в свою библиотеку, и вы готовы к работе. Инструкции о том, как его использовать, приведены в ссылке, которую я предоставил.
Существует библиотека, которая позволяет использовать шаблоны в CodeIgniter в родном стиле. Чтобы загрузить шаблон / тему, выполните:
$this->load->theme('theme_name');
Чтобы загрузить файлы CSS и javascript из своих представлений, вы можете:
$this->load->css('path/file.css'); $this->load->js('path/file.js');
Вы можете дополнительно управлять тем, как браузеры кешируют файлы CSS и JS.
Шаблон Codeigniter обычно представляет собой только файл PHP. Вы можете использовать весь обычный синтаксис PHP для вывода переменных, выполнения циклов и вызова другого кода PHP.
Контроллер образца:
<?php class Blog extends Controller { function index() { $data['title'] = "My Real Title"; $data['heading'] = "My Real Heading"; $this->load->view('blogview', $data); } } ?>
Пример:
<html> <head> <title><?php echo $title;?></title> </head> <body> <h1><?php echo $heading;?></h1> </body> </html>
Подробнее читайте в документах: CodeIgniter Руководство пользователя: Просмотры
Позвольте мне предложить более простой способ сделать это. Рассмотрите мой ответ на аналогичный вопрос .
Плюсы:
Минусы: 1. Вам может потребоваться добавить template
(или layout
если вы хотите сделать это в режиме Rails) под представлениями, чтобы правильно структурировать код. Это следует из п. [2]. 2. Данные для конкретного представления от контроллера должны быть сначала переданы в шаблон.
У Well codeignier нет такой библиотеки по умолчанию. Но если вы хотите, чтобы различные темы, представления и активы, которые нужно было контролировать, используйте это: