13

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

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

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

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

4

10 回答 10

17

很抱歉挖掘了一个旧线程,但我刚刚发布了一个在原生 PHP 中进行模板继承的库。非常受 Django 的启发。请检查一下,让我知道你的想法:

《PHP 模板继承》

http://arshaw.com/phpti/

于 2010-03-29T01:04:37.617 回答
8

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

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

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

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

于 2012-05-10T09:41:19.397 回答
3

Symfony 支持模板继承,它看起来很像 django,语法看起来与django或其他漂亮的 jinja python 引擎兼容。

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

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

或者更优雅,神社:

<h1>{{ page.title }}</h1>
{% for comment in page.comments %}
   {{ comment.body }}
{% endfor %}
{{ page.comments.count %}
于 2009-07-10T02:10:06.727 回答
2

Smarty 和 Twig 模板系统都支持 django 模板系统中的“模板继承”。这两个都是流行且得到很好支持的模板系统,但是,twig 的语法更接近 django,所以你可能会更舒服地使用它。

聪明的

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

布局.tpl

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

我的页面.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 文档中,该示例更复杂,以演示 twig 提供的一些更高级的功能,但出于比较目的,我编写了一些反映 twig 中 smarty 示例的内容。

布局.twig

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

我的页面.twig

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

结论

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

延伸阅读

于 2015-01-08T08:48:41.633 回答
1

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

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

<? require $content ?>
于 2009-06-03T19:38:07.610 回答
1

假设您熟悉类继承的工作原理,您的答案是肯定的,PHP 支持它。django 的事情可能有点矫枉过正,但无论如何我都会尝试快速向您介绍如何做到这一点。

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

<?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>
于 2009-06-03T21:32:58.143 回答
0

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

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

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

查看更多信息:http: //phpti.com/

于 2012-01-06T12:43:19.160 回答
0

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

您可以在http://phpbeat.com/doc/template中阅读有关该项目的更多信息

于 2013-06-30T23:31:01.490 回答
0

我正在开发的模板引擎

(支持类似 php 的语法和包含/模板指令,也支持模板继承)

支持相同格式的 PHP、客户端 js 和 nodejs

https://github.com/foo123/Contemplate

于 2013-08-11T07:24:57.737 回答
0

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

于 2013-10-07T09:17:54.360 回答