2

我正在用 PHP 编写一个简单的模板层,但我有点卡住了。以下是它目前的工作方式:

首先,我使用fetch_template从数据库中加载模板内容 - 这很有效(如果您有兴趣,我会在启动时收集所有模板)。

我在模板代码和逻辑中使用 PHP 变量 - 例如:

// PHP:
$name = 'Ross';

// Tpl:
<p>Hello, my name is $name.</p>

然后我使用output_template(下面)解析模板中的变量并替换它们。以前我使用带有美化str_replace模板类的模板标签,但效率太低。

/**
 * Returns a template after evaluating it
 * @param   string  $template   Template contents
 * @return  string  Template output
 */
function output_template($template) {
    eval('return "' . $template . '";');
}

如果您还没有猜到,我的问题是变量没有在函数内部声明 - 因此函数无法解析它们,$template除非我将它们放在全局范围内 - 我不确定我是否想要这样做. 或者有一个变量数组作为函数中的参数(这听起来更乏味但可能)。

除了在我的代码中使用函数中的代码(它只是一个单行代码)而不是使用函数之外,有没有人有任何解决方案?

谢谢,罗斯

Ps 我知道 Smarty 和大量的模板引擎 - 我不打算使用它们,所以请不要推荐它们。谢谢!

4

4 回答 4

8

您可以使用include($template_name).

或者,如果您想要模板输出的内容,您可以执行以下操作:

$template_name = 'template.php';

// import the contents into this template
ob_start();
include($template_name);
$content = ob_get_clean();

// do something with $content now ...

请记住,在您的模板中,您可以使用经常被忽视的 PHP 语法:

<?php if ($a == 5): ?>
A is equal to 5
<?php endif; ?>

替代语法可用于 if、while、for、foreach 和 switch ...非常适合操作模板中的数据。有关详细信息,请参阅“控制结构的替代语法”。

于 2008-11-15T10:49:48.420 回答
6

我会传递一个带有要替换的变量的关联数组,然后 extract() 它们。

然后你也可以通过 $_GLOBALS 来达到同样的效果。

function output_template($template, $vars) {
    extract($vars);
    eval('return "' . $template . '";');
}

编辑:您可能还需要考虑字符串替换而不是 eval,这取决于允许谁编写您的模板以及谁指定要加载哪个模板。那么逃跑也可能有问题......

于 2008-11-15T10:41:10.903 回答
3

此外,扩展davev的评论 eval 有点难看。

如果你能做类似的事情

function inc_scope( $file , $vars )
{
    extract($vars); 
    ob_start(); 
    require($file); 
    return ob_get_clean(); 
}

然后你可以使用plain-old-php 作为你的模板语言,你不会得到任何邪恶的评估,并且“提取”+缓冲只是限制了需求中php代码的可见范围。

于 2008-11-15T10:47:03.247 回答
-1

创建文件

  1. 配置文件
  2. 索引.php

创建文件夹

  1. 公司
  2. 模板/默认/控制器/这里的主要文件 home.php、login.php、register.php、contact.php、product.php ...

  1. headet.tpl 和 footer.tpl 包含 home.php 文件。
  2. 主目录/模板/默认

config.php 代码在这里

/* semu design */
// HTTP URL
define('HTTP_SERVER', 'http://localhost/1/');

// HTTPS URL DISABLE
// define('HTTPS_SERVER', 'http://localhost/1/');

// DİZİNLER
define('DIR_INC',       'C:\wamp\www\1/inc/');
define('DIR_TEMLATE',   'C:\wamp\www\1/template/default/');
define('DIR_MODULES',   'C:\wamp\www\1/template/default/module/');
define('DIR_IMAGE',     'C:\wamp\www\1/image/');
define('DIR_CACHE',     'cache'); // [php cache system turkish coder][1]

// DB
define('DB_HOSTNAME',   'localhost');
define('DB_USERNAME',   'root');
define('DB_PASSWORD',   '123');
define('DB_DATABASE',   'default');
define('DB_PREFIX',     '');

index.php 代码在这里

<?php 
// Version
define('VERSION', '1.0');

// Config file
if (file_exists('config.php')) {
    require_once('config.php');
}

// Moduller
require_once(DIR_INC . 'startup.php'); // mysql.php db engine, cache.php, functions.php, mail.php ... vs require_once code

// Cache System
//$sCache = new sCache();

/*$options = array(
    'time'   => 120,
    'buffer' => true,
    'load'   => false,
    //'external'=>array('nocache.php','nocache2.php'), // no cache file
);

$sCache = new sCache($options);*/

// page
$page = isset($_GET['page']) ? trim(strtolower($_GET['page'])) : "home";

$allowedPages = array(
    'home'          => DIR_TEMPLATE.'controller/home.php',
    'login'         => DIR_TEMPLATE.'controller/login.php',
    'register'      => DIR_TEMPLATE.'controller/register.php',
    'contact'       => DIR_TEMPLATE.'controller/contact.php'
);

include( isset($allowedPages[$page]) ? $allowedPages[$page] : $allowedPages["home"] );
?>
  1. index.php?page=home
  2. index.php?page=登录 ...

活动类代码

<ul>
<li <?php if ( $page == 'home' ) echo 'class="active"'; ?> Home </li>
<li <?php if ( $page == 'login' ) echo 'class="active"'; ?> Login </li>
</ul>
  1. 令牌系统即将到来:
  2. index.php?page=home&token=Co54wEHHdvUt4QzjEUyMRQOc9N1bJaeS

问候。

于 2016-04-12T17:31:08.193 回答