我正在用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
中解析它们,除非我把它们放在全局范围内 - 我我不确定自己想做什么。那个或者有一个变量数组作为函数中的一个参数(听起来更乏味但可能)。
除了在我的代码中使用函数代码(它只是一行代码)而不是使用函数之外,有没有人有任何解决方案?
谢谢, 罗斯
P.S。我知道Smarty和那里的各种模板引擎 - 我不打算使用它们所以请不要建议它们。谢谢!的
答案 0 :(得分:7)
您可以使用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 ...非常适合操作模板中的数据。有关详细信息,请参阅“Alternative syntax for control structures”。
答案 1 :(得分:6)
我会传递一个带有变量的关联数组来替换,然后提取()它们。
然后你也可以通过$ _GLOBALS来实现相同的结果。
function output_template($template, $vars) {
extract($vars);
eval('return "' . $template . '";');
}
编辑:您可能还需要考虑字符串替换而不是eval,具体取决于允许编写模板的人员以及指定要加载的模板的人员。那么也可能有逃避问题......
答案 2 :(得分:3)
另外,扩展davev的评论评估有点难看。
如果你能做点什么
function inc_scope( $file , $vars )
{
extract($vars);
ob_start();
require($file);
return ob_get_clean();
}
然后你可以使用plain-old-php作为你的模板语言,你不会得到任何邪恶的逃避,而“提取”+缓冲只会限制php中代码的可见范围。
答案 3 :(得分:0)
创建文件
创建文件夹
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"] );
?>
- 的index.php?页=家
- index.php?page = login ...
醇>
有效课程代码
<ul>
<li <?php if ( $page == 'home' ) echo 'class="active"'; ?> Home </li>
<li <?php if ( $page == 'login' ) echo 'class="active"'; ?> Login </li>
</ul>
- 令牌系统即将来临:
- index.php?page = home&amp; token = Co54wEHHdvUt4QzjEUyMRQOc9N1bJaeS
醇>
问候。