PHP模板

时间:2008-11-15 10:34:44

标签: php templates variables global-variables

我正在用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和那里的各种模板引擎 - 我不打算使用它们所以请不要建议它们。谢谢!

4 个答案:

答案 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)

创建文件

  1. 的config.php
  2. 的index.php
  3. 创建文件夹

    1. INC
    2. template / default / controller / main files home.php,login.php,register.php,contact.php,product.php ......
      1. headet.tpl和footer.tpl包含home.php文件。
      2. main dir / template / default
      3. 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?页=家
        2.   
        3. index.php?page = login ...
        4.   

        有效课程代码

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

        问候。