如果模板系统中的语句

时间:2011-02-09 10:34:59

标签: php templates templating templating-engine

我如何在我自己的模板类版本的.tpl文件中解析{if $var > 2}{if $var}。我不想使用smarty,因为我不需要他们所有的插件。我只想要包含,if,for和foreach语句。

5 个答案:

答案 0 :(得分:13)

请使用php。 只需输入你的tpl文件:

<?php if ($var > 2) .... ?> 

这比在php中解析文件要简单得多,代码少,速度快得多。

答案 1 :(得分:7)

使用

<? if( condition ) :
    ....
    ....
else : 
    ....
    ....
endif; ?>

Difference between if () { } and if () : endif;

答案 2 :(得分:6)

您已经得到了上一个问题的答案:if statements in php templates using tpl
但是,既然你不会消失,那么让我快速回答它,然后再提一下下一个绊脚石。

// handle {if}...{/if} blocks
$content =
preg_replace_callback('#\{if\s(.+?)}(.+?)\{/if}#s', "tmpl_if", $content);

function tmpl_if ($match) {
    list($uu, $if, $inner_content) = $match;

    // eval for the lazy!
    $if = create_function("", "extract(\$GLOBALS['tvars']); return ($if);");

    // a real templating engine would chain to other/central handlers
    if ( $if() ) {
        return $inner_content;
    }
    # else return empty content
}

使用这样的正则表达式会跳过嵌套的if。但你没有问过这个,所以我不会提到它。并且如评论中所述,您实际上需要链接到中央函数,该函数执行进一步替换({foreach} / {include} /等),而不仅仅是return $content

这是可行的,但很快变得繁琐。这就是为什么所有其他模板引擎(您拒绝检出)实际上将.tpl文件转换为.php脚本的原因。这更容易,因为PHP已经可以处理您尝试使用您自己的模板类来模仿的所有控制结构。

答案 3 :(得分:5)

实际上它非常简单,除非您需要嵌套if条件。

$template = '<b>{foo}</b>{if bar} lorem ipsum {bar}{/if}....';

$markers = array(
    'foo' => 'hello',
    'bar' => 'dolor sit amet',  
);

// 1. replace all markers 
foreach($markers as $marker => $value)
    $template = str_replace('{'. $marker .'}', $value, $template);

//2. process if conditions
$template = preg_replace_callback('#\{if\s(.+?)}(.+?)\{/if}#s', function($matches) use ($markers) {

    list($condition, $variable, $content) = $matches;

    if(isset($markers[$variable]) && $markers[$variable]) {
        // if the variable exists in the markers and is "truthy", return the content
        return $content;
    }

}, $template);

答案 4 :(得分:0)

您可以在模板文件(.tpl)。,

中使用以下格式
{if $url == 'error'}
Error message Invalid Login!
{/if}