CodeIgniter和布局?

时间:2010-06-02 10:34:17

标签: codeigniter layout

CodeIgniter库可以提供哪些功能?

http://media.railscasts.com/videos/008_content_for.mov

在rails上看起来很简单但是我找不到一个简单的方法来实现这个在codeigniter上..请帮助..我讨厌在文档正文中插入我的样式或javascript

4 个答案:

答案 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 - 它支持“继承”(而不是传统的包含标题,包括页脚等)

http://www.twig-project.org/

CodeIgniter助手:

http://github.com/jamiepittock/codeigniter-twig 要么 http://github.com/MaherSaif/codeigniter-twig

(还没试过,但看起来后者是最近提交的一个分叉)

答案 3 :(得分:0)

我在查找高级布局库时遇到了同样的问题, 所以我写了我自己的版本,也符合你的需要(使用YAML文件)。

功能

  • 使用YAML文件管理布局,页面标题,元标题,css和js,以获得更清晰,更轻的控制器。
  • 默认配置可以在控制器配置中覆盖。这样您就可以将css和js拆分成更小的文件,以实现更灵活的设计。
  • 在生产模式下合并和缩小css和js文件,以加快页面加载速度。

用法

  // in the controller
  $this->view->render();

此lib将从您的YAML配置中获取布局,视图,页面标题,css,js,metas

文档

下载