PHP - 创建自定义模板系统?

时间:2010-12-04 14:24:39

标签: php templates loops

我已经在这里搜索过,令人惊讶的是我找不到答案。我发现了一个类似的线程,但没有真正的解决方案。复杂的部分是循环,如果我不需要循环,我可以只进行常规替换。

所以,我有一个带有一些标记的.html文件,如下所示:

<ul>
    {{startloop}}
    <li>
        <img src="/album/{{filename}}" alt="">
        <span>{{imgname}}</span>
    </li>
    {{endLoop}}
</ul>

我想做的是用其他内容替换{{filename}}和{{imgname}}。我知道怎么做,但问题是,我想把它放在一个循环中。因此,对于每个循环项{{filename}}和{{imgname}}将是不同的。如果我有两个“项目”,它将看起来像这样(只是一个例子):

<ul>
    <li>
        <img src="/album/image1.jpg" alt="">
        <span>Test name 1</span>
    </li>
    <li>
        <img src="/album/image2.jpg" alt="">
        <span>Test name 2</span>
    </li>
</ul>

有什么建议吗?

6 个答案:

答案 0 :(得分:2)

很长一段时间以来,我一直是“聪明”模板引擎的忠实粉丝,直到我意识到我根本不需要它:)用户直接内联php标签会更好更快。

只需将html + php_tags放入'some_template.inc'文件而不是html文件。

然后通过“include('template.inc');”

显示此模板

'template.inc'的例子:

<ul>
    <?foreach ($items as $item){?>
    <li>
        <img src="/album/<?=$item[filename]?>" alt="">
        <span><?=$item[imgname]?></span>
    </li>
    <?}?>
</ul>

答案 1 :(得分:2)

不要创建一个完全没有意义的解析器,PHP已经是一个模板引擎,你只想用封装的模板系统扩展它的功能。

以下方法是我总是创建模板引擎的方式,它非常丢失,并且可以使用模板助手进行扩展。

关于我的模板系统的一个好处是你不必浪费资源为已编译的模板创建一个缓存系统,因为已经处于编译状态,与smarty之类的引擎相比。

首先,我们要创建一个主模板类,用于设置数据,选择模板等。

让我们开始吧:

class Template
{
    private $__data = array();

    public function __construct(){/*Set up template root here*/}

    public function __set($key,$val)
    {
        $this->__data[$key] => $val;
    }

    public function __get($key)
    {
        return $this->__data[$key];
    }

    public function Display($Template)
    {
        new TemplatePage($Template,$this->__data); //Send data and template name to encapsulated object
    }
}

这是一个非常基本的类,它允许做类似

的操作
$Template = new Template();

$Template->Userdata = $User->GetUserData();

$Template->Display("frontend/index");

好了,现在您可能已经注意到上面的类TemplatePage,这是加载实际文件模板的类,并且在实际模板中,您将在TemplatePage范围的范围内。

这将允许您获取模板数据和访问助手的方法,下面是TemplatePage

的示例
class TemplatePage
{
    private $__data = array();

    public function __construct($template,$data)
    {
        $this->__data = $data;
        unset($data);

        //Load the templates
        if(file_exists(TEMPLATE_PATH . "/" . $template . ".php"))
        {
            require_once TEMPLATE_PATH . "/" . $template . ".php";
            return;
        }
        trigger_error("Template does not exists",E_USER_ERROR);
    }

    public function __get($key)
    {
        return $this->__data[$key];
    }

    public function require($template)
    {
        if(file_exists(TEMPLATE_PATH . "/" . $template . ".php"))
        {
            require_once TEMPLATE_PATH . "/" . $template . ".php";
            return;
        }
        trigger_error("Template does not exists",E_USER_NOTICE);
    }

    public function link($link,$title)
    {
        return sprintf('<a href="%s">%s</a>',$link,$title);
    }
}

现在,当模板加载到类的范围内时,您可以扩展linkrequire等方法以使用完整的函数模板工具包

模板示例:

<?php $this->require("folder/js_modules") ?>
<ul>
    <?php foreach ($this->photos as $photo): ?>
    <li>
        <?php echo $this->link($photo->link,"click to view") ?>
        <span><?php echo $photo->image_name?></span>
    </li>
    <?php endforeach; ?>
</ul>
<?php $this->require("folder/footer") ?>

答案 2 :(得分:0)

你有没有理由制作自己的模板系统?我建议使用Smarty http://www.smarty.net/

它已经具有此功能以及更多功能,例如缓存等。

答案 3 :(得分:0)

这里可能更好的做法是使用MVC / MVVVM模式,然后你可以免费获得这个模式以及一个非常结构化和有组织的代码项目。

从Rasmus的博客中查看此页面,作为此工作流程的入门读物: http://toys.lerdorf.com/archives/38-The-no-framework-PHP-MVC-framework.html

如果你愿意放弃一点,Zend作为一个框架非常好,可以帮助你很快完成你的网站。它将节省您自己重写大量代码并为您提供一些您可能不希望自己编写的高级功能。

我完全同意你关于某些框架的大小,你可以在没有它们的情况下做到这一点。权衡是时间。编程花费的时间和调试时间。就像我说的,如果你愿意放弃一些控制,你可以轻松完成你的项目,只需处理调试你网站的“业务逻辑”,而不必重新发明许多现有的代码。

希望这有用。

答案 4 :(得分:0)

创建超高速模板系统的唯一方法是依靠PHP作为解析器,或者通过使用C语言编写的扩展。此外,在任何情况下都没有理由尝试这样做,因为它已经完成了一千次。像Smarty那样有许多大赢家,尽管表现不是很好。 PHPBB中的模板系统也相当不错(使用预解析和缓存的PHP)。避免在这里重新发明轮子。

如果表现是主要问题,我强烈推荐Blitz

借用 PHPBB 是另一条路线。如果您无法在服务器上扩展PHP,并且Smarty不是您的性能格式,并且想要所有的裸机代码,那么您可以像我一样扯掉PHPBB中的内容。它不是最终解决方案,而且充满了细节,但它非常好 - 而且根据来源,您可以根据需要进行定制。它对代码进行评估,因此支持某种级别的表达式,并支持HTML注释标记作为模板转义/标记,对于不太熟练的图形设计人员而言是用户友好的。

答案 5 :(得分:-3)

将您的{{tags}}替换为PHP代码块(在本例中为foreach),然后eval结果。这就是php模板引擎的工作方式。

示例:

$template = "<h1>Hello {{name}}</h1>";
$name = "Joe";

$compiled_template = preg_replace(
    '~{{(.+?)}}~', 
    '<?php echo $$1 ?>', 
    $template);

eval('?>' . $compiled_template);

打印<h1>Hello Joe</h1>

一个更高级的例子,涉及数组和循环

$template = "
    {{each user}}
        {{name}} {{age}}<br>
    {{end}}
";

$user = array(
    array('name' => 'Joe', 'age' => 20),
    array('name' => 'Bill', 'age' => 30),
    array('name' => 'Linda', 'age' => 40),
);

$t = $template;

$t = preg_replace(
    '~{{each (\w+)}}~', 
    '<?php foreach($$1 as $item) { ?>', 
    $t);

$t = preg_replace(
    '~{{end}}~', 
    '<?php } ?>', 
    $t);

$t = preg_replace(
    '~{{(\w+)}}~', 
    '<?php echo htmlspecialchars($item["$1"]) ?>', 
    $t);

eval('?>' . $t);

在回应其他评论时,告诉我“php是模板引擎”和“eval是邪恶的” - 人们,不要重复你曾经听过的愚蠢的咒语。试着自己思考。