允许用户使用给定变量自定义布局

时间:2012-07-15 13:18:30

标签: php

假设我有这个数组:

$meta = array(
    'name' => 'John Doe',
    'age' => 16,
    'e-mail' => 'john.doe@doedoe.com'
);

如何允许用户使用这些变量自定义布局? (并且能够发现错误)。这是我目前的想法:

extract($meta,EXTR_OVERWRITE);
$string = "Hi, I am $name. This is an $undefined_variable";

但它无法捕获未定义的变量。

2 个答案:

答案 0 :(得分:3)

这个怎么样?

$string = "Hi, I am {{name}}. This is an {{undefined_variable}}";
foreach ($meta as $key => $value) {
    $string = str_replace('{{' . $key . '}}', $value, $string);
}

或者,如果您可以将{{name}}等直接作为$meta中的键,则:

$string = "Hi, I am {{name}}. This is an {{undefined_variable}}";
$string = str_replace(array_keys($meta), array_values($meta), $string);

或者,您可以使用$meta密钥创建和缓存{{...}},如果您不能将它们放在原始密钥中:

$metaTokens = array();
foreach ($meta as $key => $value) {
    $metaTokens['{{' . $key . '}}'] = $value;
}

然后,如果你想简单地隐藏未定义的变量,那么现在你应该填写所有已定义的变量,因此{{..}}中的任何其他内容都应该是一个未定义的变量:

$string = preg_replace('/{{.+?}}/', '', $string);

答案 1 :(得分:0)

您可以根据this article创建模板类(我尽量避免使用魔术方法):

class Template 
{
    protected $parameters  = array();
    protected $filename = null;

    public function __construct( $filename )
    {
        $this->filename = $filename;
    }

    public function bind($name, $value) 
    {
        $this->parameters[$name] = $value;
    }

    public function render() 
    {
        extract( $this->parameters );
        error_reporting(E_ALL ^ E_NOTICE);
        ob_start();
        include( $this->filename );
        error_reporting(~0); // -1 do not work on OSX
        return ob_get_clean();
    }

}

基本上,您在渲染输出之前禁用警告,然后再次启用它们。即使某些变量尚未定义,也可以渲染文件。