如何在PHP5中实现模板继承(如Django?)

时间:2009-06-03 19:20:56

标签: php model-view-controller templates template-inheritance

是否有一个现有的好例子,或者如何创建一个支持PHP5中“模板继承”的基本模板系统(思考MVC)?

有关我定义为模板继承的示例,请参阅Django(用于Web开发的Python框架)模板文档:http://docs.djangoproject.com/en/dev/topics/templates/#id1

我特别喜欢PHP本身就是“模板语言”的想法,尽管它不一定是必需的。

如果列出实施“模板继承”的现有解决方案,请尝试将答案形成为单独的系统,以便“普遍投票”。

10 个答案:

答案 0 :(得分:17)

很抱歉挖掘旧线程,但我刚刚发布了一个在本机PHP中执行模板继承的库。非常灵感来自Django。请检查一下,让我知道你的想法:

“PHP模板继承”

http://arshaw.com/phpti/

答案 1 :(得分:7)

Soulmerge给出的答案与模板继承无关。

我个人认为模板继承很棒,这是我第一次看到有人抱怨它。

phpti是前面提到的一个选项,但对我来说看起来有点难看。

您可能需要考虑支持模板继承的mustache(mustache.github.com),并且具有多种语言(包括php)的实现。要在PHP中使用胡子模板,您可能希望编写某种类型的控制器来读取胡子文件并处理它们。

答案 2 :(得分:3)

Symfony supports template inheritance,它看起来非常像django,语法看起来与django或其他beautiful jinja python engines兼容。

优雅,就像使用PHP作为模板语言一样:

<h1><?php echo $page->title; ?></h1>
<?php foreach($page->comments as $comment): ?>
    <?php echo $comment->body; ?>
<?php endforeach; ?>
<?php echo $page->comments->count(); ?>

甚至更优雅,jinja:

<h1>{{ page.title }}</h1>
{% for comment in page.comments %}
   {{ comment.body }}
{% endfor %}
{{ page.comments.count %}

答案 3 :(得分:2)

PHP语言本身就是为这些任务而设计的,[不幸的是]它 随着时间的推移,人们开始越来越有能力 这种简单的语法开始用这种奇怪的进化语言实现越来越复杂的任务。

我认为你对模板继承的意思最好用动态表示 文件包含在PHP中,就像

一样简单
<? require $content ?>

答案 4 :(得分:2)

Smarty和Twig模板系统都支持&#34;模板继承&#34;在django的模板系统中找到。这两个都是受欢迎且支持良好的模板系统,但是twig的语法更接近django,所以你可能更习惯使用它。

Smarty的

要在smarty中执行此操作,您可以按照以下示例执行此操作,从Smarty Documentation on Inheritence

复制

layout.tpl

<html>
<head>
  <title>{block name=title}Default Page Title{/block}</title>
</head>
<body>
{block name=body}{/block}
</body>
</html>

mypage.tpl

{extends file="layout.tpl"}
{block name=title}My Page Title{/block}
{block name=body}My HTML Page Body goes here{/block}

输出mypage.tpl

<html>
<head>
  <title>My Page Title</title>
</head>
<body>
My HTML Page Body goes here
</body>
</html>

枝条

同样,有很好的文档可供使用此功能。在twig documentation中,为了展示twig提供的一些更高级的功能,这个例子更复杂,但为了比较的目的,我写了一些东西反映了树枝中的聪明例子。

layout.twig

<html>
<head>
  <title>{% block title %}Default Page Title{% endblock %}</title>
</head>
<body>
{% block body %}{% endblock %}
</body>
</html>

mypage.twig

{% extends layout.twig %}
{% block title %}My Page Title{% endblock %}
{% block body %}My HTML Page Body goes here{% endblock %}

结论

回想起来,这两个例子几乎完全相同,因此在两者之间进行选择是比较特征和完全不同的问题。使用PHP模板框架,您可以实现模板继承,就像使用django一样。

进一步阅读

答案 5 :(得分:1)

假设您熟悉类继承的工作原理,您的答案是YES,PHP支持它。 django的事情可能有点矫枉过正,但无论如何我都会尽力让你快速填写。

注意:我不打算在这里使用控制器。显然,如果页面是博客,您将创建一个blogPage对象,而不仅仅是一个常规页面。另外,我是从头开始为你写的,所以不能保证它的工作......但希望它会给你一些想法。

<?php
class Page
{

    protected $content_main; // Your main page content.
    protected $content_leftbar; // Your left sidebar content.
    protected $content_title; // Your content title.
    protected $template; // Template data.

    Function getTemplate() {
        // Logic for determining the template to be used in here.
        // Let's say it returns the location of a cached version of the template.
            return $template_file_path;
    }

    Function populateContentBlocks() {
        // This populates the $content_BLOCK variables with data using some default
        // logic you have for determining where to grab that data from.
    }

    Function loadPage() {

        // Populates variables.
        $this->populateContentBlocks();

            // Fetches template
        include( $this->getTemplate() );
    }


} // END class


Class blogPage extends Page {
    Function getTemplate() {
        // Logic for determining the template to be used in here.
        // Let's say it returns the location of a cached version of the template.
        // OVERRIDE THE DEFAULT TEMPLATE LOGIC OF THE PAGE WITH WHAT IS RELEVENT TO
                // BLOGPAGE.
    }
}
?>

模板文件示例:

<html>
  <head>
    <title><?php echo $this->content_title; ?></title>
  </head> 

  <body>
      <div class="sidebar"><?php echo $this->content_sidebar; ?></div>
      <div class="mainContent"><?php echo $this->content_main; ?></div>
  </body>
</html>

答案 6 :(得分:0)

PHP模板继承似乎是一个不错的选择。以下是网站上的描述:

模板继承是一种非常有用的技术,可用于为网站制作可重用的HTML布局。它比其他技术更灵活,例如“包含”页面的常见元素(如页眉和页脚文件)。

这个概念已经存在了一段时间,尤其是在Django模板引擎中。与其他库不同,PHP模板继承允许您以直接PHP编写所有内容。无需学习其他模板语言。

详情请见:http://phpti.com/

答案 7 :(得分:0)

有一个很棒的组件,“Redstart Templating”它支持php模板继承非常强大的方式,所有模板都是用纯HTML和php编写的,而且它是可扩展的,你可以创建一个新的插件和更多的

您可以在http://phpbeat.com/doc/templating

中详细了解该项目

答案 8 :(得分:0)

我正在使用的模板引擎

(支持类似php的语法和include / template指令以及处理模板继承)

支持PHP,客户端js和具有相同格式的nodejs

https://github.com/foo123/Contemplate

答案 9 :(得分:0)

Puja是一个类似Django的PHP http://www.phpclasses.org/package/8283-PHP-Template-engine-that-compiles-templates-into-PHP.html模板引擎。它还支持验证模板语法。