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

如何在PHP5中实现模板继承(比如Django?),php,model-view-controller,templates,template-inheritance,Php,Model View Controller,Templates,Template Inheritance,是否有一个现有的好例子,或者一种方法应该如何创建一个基本的模板系统(考虑MVC)来支持PHP5中的“模板继承” 有关我定义为模板继承的示例,请参阅Django(用于web开发的Python框架)模板文档: 我特别喜欢PHP本身作为“模板语言”的想法,尽管这不一定是一种要求 如果列出实现“模板继承”的现有解决方案,请尝试以单个系统的形式给出答案,以利于“大众投票” PHP语言本身就是为这些任务而设计的,[不幸的是]它 随着时间的推移,越来越多的人开始与 这种简单的语法开始用这种奇怪的语言实现越来越

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

有关我定义为模板继承的示例,请参阅Django(用于web开发的Python框架)模板文档:

我特别喜欢PHP本身作为“模板语言”的想法,尽管这不一定是一种要求


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

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

我认为你所说的模板继承最好用动态的方式来表达 PHP中的文件包含,非常简单

<? require $content ?>

假设您熟悉类继承的工作原理,您的答案是肯定的,PHP支持它。django的事情可能有点过头了,但我会尽快告诉你怎么做

注意:我不打算在这里使用控制器。显然,如果页面是一个blog,那么您将创建一个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>

,它看起来非常像django,因此语法看起来与或其他兼容

优雅,如使用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 %}
{{page.title}
{%用于页面中的注释。注释%}
{{comment.body}}
{%endfor%}
{{page.comments.count%}

很抱歉,我发现了一个旧的线程,但我刚刚发布了一个用原生PHP进行模板继承的库。非常受Django的启发。请查看它并告诉我您的想法:

“PHP模板继承”


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

模板继承是一种非常有用的技术,用于为站点创建可重用的HTML布局。它比其他技术(如“包含”页面的公共元素(如页眉和页脚文件))灵活得多

这个概念已经存在了一段时间,最显著的是Django模板引擎。与其他库不同,PHP模板继承允许您使用纯PHP编写所有内容。无需学习其他模板语言


更多信息请参见:

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

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

phpti是前面指出的一种选择,但在我看来有点难看


你可能想考虑支持模板继承的胡桃树(Suthase.Guthub.com),它有多种语言(包括PHP)的实现。在PHP中使用SuthAcess模板,你可能需要编写某种控制器来读取胡桃锉并处理它们。“Redstart模板”它以一种非常强大的方式支持php模板继承,所有模板都是用纯html和php编写的,而且它是可扩展的,您可以创建一个新的插件等等


您可以在我正在开发的模板引擎中阅读更多关于该项目的信息

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

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


Puja是一个类似Django的PHP模板引擎。它还支持验证模板语法。

Smarty和Twig模板系统都支持“模板继承”正如在django的模板系统中所发现的那样。这两种模板系统都很流行,并且得到了很好的支持。然而,twig的语法更接近django,因此使用它可能会更舒服

精明的 要在smarty中执行此操作,您可以按照以下示例中的方法执行,复制自

第三方物流 mypage.tpl的输出 结论 回想起来,这两个例子几乎是相同的,因此在两者之间进行选择是一个比较特性的问题,也是一个完全不同的问题。使用PHP模板框架,您可以实现模板继承,就像使用django一样

进一步阅读
  • 在谷歌搜索Smarty/Twig模板继承

使用此解决方案是可能的,因为父(或“控制器”)PHP脚本中定义的所有变量都“全局”可用对于所有包含,以及这些包含所包含的文件,是否正确?没错,如果包含文件,范围保持不变。如果从类方法中包含文件,您甚至可以访问$this。是的,loadpage应该是loadpage(){$this->populateBlocks();include$this->templateFile;}多多,太多C++,我已经有一段时间没有做PHP了。谢谢提醒。这应该是对原始帖子/问题的评论。@ JPIC你能重新发布上面链接的内容吗?(链接现在已经死了)。我真的很想听到一些反对PHP中模板继承的合理论据,因为如果我找不到任何反论据,我计划在新项目上这样构造模板。特别是因为我最终意识到不需要模板引擎:PHP有
ob_start()
ob_get_clean()
这些就是“干净”继承所需的全部内容(这里的一个示例是基本片段:)对于Symfony中的模板继承,请参考上面(更新)答案中的链接。如果您确实需要
<html>
<head>
  <title>{block name=title}Default Page Title{/block}</title>
</head>
<body>
{block name=body}{/block}
</body>
</html>
{extends file="layout.tpl"}
{block name=title}My Page Title{/block}
{block name=body}My HTML Page Body goes here{/block}
<html>
<head>
  <title>My Page Title</title>
</head>
<body>
My HTML Page Body goes here
</body>
</html>
<html>
<head>
  <title>{% block title %}Default Page Title{% endblock %}</title>
</head>
<body>
{% block body %}{% endblock %}
</body>
</html>
{% extends layout.twig %}
{% block title %}My Page Title{% endblock %}
{% block body %}My HTML Page Body goes here{% endblock %}