如何处理 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

【讨论】:

嗯,是的。但我想知道是否有任何方法可以加快这个过程并使其更有条理 - 所以我不必输入
、、样式等...我想要它仅在一个文件夹或库中。把它想象成 wordpress,你可以在不编辑每个视图的情况下更改模板。
【参考方案11】:

请允许我提出一个更简单的方法来做到这一点。考虑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:当我插入数据时出现重复键错误,我该如何处理这个错误?

如何处理 Codeigniter 上的多语言 uri 重定向?

自然模板(例如Thymeleaf)时如何处理代码重复?

如何处理模棱两可的模板参数?

如何处理 Freemarker 字符串模板?

如何处理 Meteor 模板中的 switch case