CodeIgniter库可以提供哪些功能?
http://media.railscasts.com/videos/008_content_for.mov
在rails上看起来很简单但是我找不到一个简单的方法来实现这个在codeigniter上..请帮助..我讨厌在文档正文中插入我的样式或javascript
答案 0 :(得分:7)
我讨厌像Smarty或http://williamsconcepts.com/ci/codeigniter/libraries/template/
这样的模板使用我自己的类似Zend的布局实现。
添加钩子/application/hooks/Layout.php:
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
/**
*
*/
class Layout {
function render() {
global $OUT;
$CI = & get_instance();
$output = $CI->output->get_output();
if (!isset($CI->layout)) {
$CI->layout = "default";
}
if ($CI->layout != false) {
if (!preg_match('/(.+).php$/', $CI->layout)) {
$CI->layout .= '.php';
}
$requested = BASEPATH . '../application/layouts/' . $CI->layout;
$default = BASEPATH . '../application/layouts/default.php';
if (file_exists($requested)) {
$layout = $CI->load->file($requested, true);
} else {
$layout = $CI->load->file($default, true);
}
$view = str_replace("{content}", $output, $layout);
$view = str_replace("{title}", $CI->title, $view);
$scripts = "";
$styles = "";
$metas = "";
if (count($CI->meta) > 0) { // Массив с мета-тегами
$metas = implode("\n", $CI->meta);
}
if (count($CI->scripts) > 0) { // Массив со скриптами
foreach ($CI->scripts as $script) {
$scripts .= "<script type='text/javascript' src='" . base_url() . "js/" . $script . ".js'></script>";
}
}
if (count($CI->styles) > 0) { // Массив со стилями
foreach ($CI->styles as $style) {
$styles .= "<link rel='stylesheet' type='text/css' href='" . base_url() . "css/" . $style . ".css' />";
}
}
if (count($CI->parts) > 0) { // Массив с частями страницы
foreach ($CI->parts as $name => $part) {
$view = str_replace("{" . $name . "}", $part, $view);
}
}
$view = str_replace("{metas}", $metas, $view);
$view = str_replace("{scripts}", $scripts, $view);
$view = str_replace("{styles}", $styles, $view);
$view = preg_replace("/{.*?}/ims", "", $view); // Подчищаем пустые неподгруженные части шаблона
} else {
$view = $output;
}
$OUT->_display($view);
}
}
?>
然后在/application/config/config.php中启用挂钩:
$config['enable_hooks'] = TRUE;
之后添加到/application/config/hooks.php:
$hook['display_override'][] = array('class' => 'Layout',
'function' => 'render',
'filename' => 'Layout.php',
'filepath' => 'hooks'
);
创建文件夹/ application / layouts /
创建文件/application/layouts/default.php:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>{title}</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
{metas}
{scripts}
{styles}
<link rel="icon" href="<?= base_url() ?>favicon.ico" type="image/x-icon" />
<link rel="shortcut icon" href="<?= base_url() ?>favicon.ico" type="image/x-icon" />
</head>
<body>
<div class="head">
{head}
</div>
<div class="content">
{content}
</div>
</body>
</html>
从控制器使用它:
class main extends MY_Controller {
function __construct() {
parent::Controller();
$this->parts[head] = $this->load->view("frontend/global/header.php", null, true);
$this->scripts = array("JQuery/jquery-1.4.2.min", "JQuery/form", "Core", "Frontend");
$this->styles = array("style");
$this->title = "Blah blah";
}
function index() {
$this->load->view('frontend/index.php');
}
}
答案 1 :(得分:4)
我过去使用此Template Library实现了这一目标。来自文档:
为...编写的模板库 CodeIgniter PHP框架,是一个 CI的View实现的包装器。 模板是对众多人的反应 来自CI社区的问题 关于如何显示 一个控制器的多个视图,和 如何在一个视图中嵌入“视图中的视图” 标准时尚。此外, 模板提供额外的视图加载 能力,利用能力 任何模板解析器(如Smarty),和 包含CSS的快捷方式, JavaScript和其他常见元素 在最终呈现的HTML中。
具体来说,请查看图书馆的additional utilities。它允许你在控制器中放置这样的东西:
$this->template->add_js('js/YourJavascriptFile.js');
或
$this->template->add_js('alert("Hello!");', 'embed');
在模板中回显
$_scripts
(最好在<head>
部分) 利用通过此添加的JavaScript 方法
同样,您可以对CSS执行相同的操作:
$this->template->add_css('css/main.css');
$this->template->add_css('#logo {display: block}', 'embed', 'print');
..只需在$_styles
部分中回显<head>
。
希望有所帮助。
答案 2 :(得分:2)
查看Twig - 它支持“继承”(而不是传统的包含标题,包括页脚等)
CodeIgniter助手:
http://github.com/jamiepittock/codeigniter-twig 要么 http://github.com/MaherSaif/codeigniter-twig
(还没试过,但看起来后者是最近提交的一个分叉)
答案 3 :(得分:0)
我在查找高级布局库时遇到了同样的问题, 所以我写了我自己的版本,也符合你的需要(使用YAML文件)。
// in the controller
$this->view->render();
此lib将从您的YAML配置中获取布局,视图,页面标题,css,js,metas