如何解析PHP中的基本模板逻辑?

时间:2014-01-12 23:27:08

标签: php parsing templates template-engine

我正在尝试为项目编写 very 基本模板引擎,最后采用this article中描述的方法,该方法编写模板变量,如[@variable]和只需使用str_replace()来解析模板并输入变量值。

这非常简单并且似乎运行良好,但尽管我尽了最大努力,但在模板本身中确实需要基本逻辑。我不需要任何复杂的东西,只需要一个单独的if / else或三元语句。例如,像[if@something?"text":"other text"]

在模板中解析基本逻辑可能是一个很好的方法,如上例所示?

更新:

我正在开发一个AJAX重型网站,所以我有一个接收请求的PHP AJAX控制器,然后返回一个JSON编码的响应。这是一个例子:

AJAX handler.php:

...
else if($req == 'getContent')
{
    $template = new Template('template.tpl');
    $template->setData(array(
        'date' => time(),
        'var'  => 'foo',
        'foo'  => 'bar'
    ));

    $response = array(
        'error' => null,
        'content' => template->getOutput()
    );
}
...

echo json_encode($response);

template.tpl:

lots and lots and lots of HTML
........
variables [@date] mixed in [@foo] somewhere with HTML [@bar]
........
lots and lots and lots of HTML

如果我没有使用模板引擎(在使用str_replace()获取后使用file_get_contents()将变量值放入模板中),那么我必须这样做:

AJAX handler.php:

...
else if($req == 'getContent')
{

    $output = '
        lots and lots and lots of HTML' . time() . '
        ........
        variables ' . $foo . ' mixed in ' . $bar . 'somewhere with HTML
        ........
        lots and lots and lots of HTML
    ';

    $response = array(
        'error' => null,
        'content' => $output
    );
}
...

echo json_encode($response);

我在这里要完成的重点是从我的AJAX处理程序中分离大量的HTML文本块(在某些情况下,完全是整个页面主体),而是将它们保存在单独的文件中,这些文件更具可读性并使AJAX处理程序变得无比庞大。

2 个答案:

答案 0 :(得分:1)

PHP已经是一种模板语言。例如,这就是上面的示例在PHP中的样子:

<? echo (something ? "text" : "other text") ?>

在添加另一层复杂性之前,请三思而后行。

有像Smarty这样的模板库,它们有正当理由,比如缓存,或者你想以安全的方式分离代码和设计(即给设计师一些他们可以在不破坏代码的情况下进行修改)。但是,如果它仅供您自己使用,那么使用本机PHP是一个非常强大的选择。

  

原因是避免将HTML与PHP混合并使用意大利面条代码

在HTML代码中使用简单的PHP没有任何问题。 (以及你是否在PHP中使用意大利面条代码或者你的新模板语言并没有真正起作用......)

什么是坏的(并导致Spaghetti代码)将大量代码与HTML输出混合在一起,例如计算或准备。这些应始终与HTML分开。

HTML结构中的PHP应该只进行简单的比较,if/then/else检查,for / foreach循环,以及与输出数据直接相关的任何操作(例如htmlspecialchars或简单的计算)。

如果坚持这一点,您可以愉快地使用本机PHP来满足您的模板需求。

答案 1 :(得分:0)

也许您可以为函数定义另一个模板定义,例如:

[*function_name][param1,param2,param3]

例如,您的示例:

[*defined][@something,"text","other"]

在模板引擎代码中,您可以编写“已定义”模板函数的逻辑。

只是一个想法!!