如何处理 Codeigniter 模板?
Posted
技术标签:
【中文标题】如何处理 Codeigniter 模板?【英文标题】:How to Deal With Codeigniter Templates? 【发布时间】:2010-11-05 00:33:24 【问题描述】:我对 MVC 还很陌生,最近我发现了 CodeIgniter。我仍然每天都在学习,但一个问题是它的模板引擎。在 CodeIgniter 中创建模板的最佳方法是什么?
Cakephp自带模板库,CodeIgniter有没有类似的功能?
【问题讨论】:
您好@Martin,我看到这是一篇很老的帖子,您仍然没有将任何答案标记为正确。您找到解决问题的方法了吗? 【参考方案1】:与其他框架不同,CodeIgniter 没有全局模板系统。每个控制器控制自己的输出,独立于系统,除非另有说明,否则视图是先进先出的。
例如,如果我们有一个全局标题:
<!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);
还有其他组合,但通过用户库存在更好的解决方案,例如:
见下方评论
【讨论】:
我是从 google 到这里的,上面的链接不再起作用,并重定向到 CodeIgniter 的 github repo,但是你可以去那里的 wiki 页面并搜索“模板”来找到针对这个问题的十几种不同的实现。 我还使用了许多很棒的模板库,它们不是 CodeIgniter 的一部分,但可以轻松集成,Mustache(github.com/bobthecow/mustache.php) 和 Twig(twig.sensiolabs.org) 因为在 6 年前给出并回答了这个问题时,它是相关的。【参考方案2】:我尝试了几种方法来做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
是查看联系人。
【讨论】:
当我使用这个方法时,我得到了很多未定义的变量——它们似乎没有从控制器传递到 $body 变量。【参考方案3】:创建一个包含所有视图的库,并将您需要发送到内容视图的数据发送给它。就这些了!
<?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');
【讨论】:
【参考方案4】:这个库易于使用和自定义,完全符合您的期望:
避免 HTML 重复(页眉、页脚..) 无需学习一门新语言 (!)Most Simple Template Library for CodeIgniter
【讨论】:
我最喜欢的一点是,它没有为 Smarty 切换到不同的语法,而是保留了我最喜欢 CI 基本模板的内容:PHP 短标签。【参考方案5】:我将 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 中。
您可以做的另一件很酷的事情是将此列表模板用于非文章的内容。您可以有一个用户或页面列表或其他任何内容。在某些情况下,重用这样的模板会很有用。不总是,但有时。
为 smarty 设置 CodeIgniter 非常简单。只需将 Smarty 文件复制到您的库文件夹并为其创建一个简单的包装器即可。您可以在此处找到说明:
http://devcha.blogspot.com/2007/12/smarty-as-template-engine-in-code.html
设置好之后就很棒了。
【讨论】:
【参考方案6】:我有两个主要模板;一个用于网站,一个用于我们的管理面板。这是我的主站点设置(大部分是静态的)...我决定使用一个名为 site
的控制器,它调用模板文件和每个页面并获取 其 视图文件。
为什么没有人提到模板引擎的使用? -just- 视图是否更好/更快?
在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
中,我设置了规则来处理
site
控制器主要是单段网址,但我们这样做
有一个这样构成的部分; /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...
注意路由器允许我们在 url 中省略 `/site/', http://thesite.com/who-we-are
想法?任何人?布勒?
【讨论】:
【参考方案7】:嗯,您实际上可以将 codeigniter 库用于模板。最著名的是:
-
Codeigniter Simplicity(积极开发)
Phil Sturgeon's Template Library(未积极开发)
An Introduction to Views & Templating in CodeIgniter(这里实际上是从零开始创建模板库)
【讨论】:
【参考方案8】:我偏向于 Carmelo Capinpin 制作的这个模板库,因为它非常易于使用:link text。只需将文件复制到您的库中,您就可以开始使用了。如何使用它的说明在我提供的链接中。
【讨论】:
【参考方案9】:There is a library which allows you to use templates in CodeIgniter 采用原生风格。 要加载模板/主题,只需执行以下操作:
$this->load->theme(‘theme_name’);
要从您的视图中加载 CSS 和 javascript 文件,您可以这样做:
$this->load->css(‘path/file.css’);
$this->load->js(‘path/file.js’);
您可以选择控制浏览器缓存 CSS 和 JS 文件的方式。
【讨论】:
【参考方案10】: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 User Guide: Views
【讨论】:
嗯,是的。但我想知道是否有任何方法可以加快这个过程并使其更有条理 - 所以我不必输入请允许我提出一个更简单的方法来做到这一点。考虑my answer to a similar question。
优点:
-
您的模板文件可以是完整的 HTML 文件。您不必拆分页眉和页脚。
任何视图文件都可以轻松转换为模板。
可以在模板中生成特定视图的数据。
缺点:
1. 您可能需要在视图下添加一个template
(或layout
——如果您想以Rails 方式执行此操作)目录,以便正确地构造您的代码。这来自 Pros[2]。
2. 来自控制器的特定视图的数据必须首先传递给模板。
【讨论】:
【参考方案12】:默认情况下,codeignier 没有这样的库。但是,如果您想管理不同的主题、视图和资产,请尝试使用:
https://github.com/mahadazad/php-layout-manager
【讨论】:
以上是关于如何处理 Codeigniter 模板?的主要内容,如果未能解决你的问题,请参考以下文章
Codeigniter:当我插入数据时出现重复键错误,我该如何处理这个错误?