使用PHP作为模板引擎

时间:2011-02-12 10:23:35

标签: php templates

我不打算仅针对PHP选择模板引擎。我选择不使用像Smarty这样的模板引擎,因为我想学习如何使用PHP和HTML正确设计模板。有人可以提供有关如何设计模板页面的链接或示例吗?

6 个答案:

答案 0 :(得分:17)

只需为if / for / foreach控制语言结构使用替代PHP语法,该语言结构是专门为此目的而设计的:

    <h1>Users</h1>
<?php if(count($users) > 0): ?>
    <table>
        <thead>
            <tr>
                <th>Id</th>
                <th>First Name</th>
                <th>Last Name</th>
            </tr>
        </thead>
        <tbody>
<?php foreach($users as $user): ?>
            <tr>
                <td><?php echo htmlentities($user->Id); ?></td>
                <td><?php echo htmlentities($user->FirstName); ?></td>
                <td><?php echo htmlentities($user->LastName); ?></td>
            </tr>
<?php endforeach; ?>
        </tbody>
    </table>
<?php else: ?>
    <p>No users in the database.</p>
<?php endif; ?>

我还建议为非常相似的HTML输出创建视图助手,并使用它们而不是重复的HTML代码。

答案 1 :(得分:9)

真的不是那么困难。

Non-PHP goes out here
<?php # PHP goes in here ?>
More non-PHP goes out here
<?php # More PHP goes in here ?>

答案 2 :(得分:7)

 function returnView($filename,$variables){
    ob_start();
        $htmlfile = file_get_contents($filename);  
        foreach($variables as $key=>$value){
          $htmlfile = str_replace("#".$key."#", $value, $htmlfile);
        }              
        echo $htmlfile;
    return ob_get_clean(); 
 } 

//htmlfile
<html>
<title>#title#</title>
</html>


//usage

echo returnView('file.html',array('title'=>'hello world!');

我的框架我有加载视图的功能,然后在布局中将其删除:

 public function returnView(){
    ob_start();
    $this->loader();
    $this->template->show($this->controller,$this->action);
    return ob_get_clean(); 
 }

布局如下所示:

<html> 
    <head>
        <title><?php echo $this->layout('title'); ?></title>
    </head>
    <body>
        <?php echo $this->layout('content'); ?>
    </body>
</html>

答案 3 :(得分:1)

您可能想要考虑的是,如果您选择MVC风格的方法,如果您将模板包含在对象(其类方法之一)中,那么模板文件中的$this将指向你从中调用它的对象。

如果您想确保模板的某种封装,即如果您不想依赖全局变量来传递动态数据(例如,从数据库中),这将非常有用。

答案 4 :(得分:0)

我已经使用了各种模板引擎,并设计了自己的模板引擎,随着时间的推移越来越精细。我认为最好通过使用本机php的东西来保持它尽可能简单,而不是创建精细的功能。 (这篇文章有一些好处:Boring Architecture is Good)。我发现在几个月或几年后回到项目时,可读性和维护性更好。

例如:

<?
$name="john";
$email="john@xyz.com";

require "templates/unsubscribe.php";

- templates / unsubscribe.php -

<?
$o=<<<EOHTML

Hi $name, sorry to see you go.<BR>
<input type=input name=email value=$email> 
<input type=submit value='Unsubscribe'>
EOHTML;
echo $o;

答案 5 :(得分:0)

使用理查德的例子,但更简单:

    <h1>Users</h1>
<? if(count($users) > 0): ?>
    <table>
        <thead>
            <tr>
                <th>Id</th>
                <th>First Name</th>
                <th>Last Name</th>
            </tr>
        </thead>
        <tbody>
<? foreach($users as $user): ?>
            <tr>
                <td><?= htmlentities($user->Id) ?></td>
                <td><?= htmlentities($user->FirstName) ?></td>
                <td><?= htmlentities($user->LastName) ?></td>
            </tr>
<? endforeach ?>
        </tbody>
    </table>
<? else: ?>
    <p>No users in the database.</p>
<? endif ?>