如何在PHP5中实现模板继承(比如Django?)
是否有一个现有的好例子,或者一种方法应该如何创建一个基本的模板系统(考虑MVC)来支持PHP5中的“模板继承” 有关我定义为模板继承的示例,请参阅Django(用于web开发的Python框架)模板文档: 我特别喜欢PHP本身作为“模板语言”的想法,尽管这不一定是一种要求如何在PHP5中实现模板继承(比如Django?),php,model-view-controller,templates,template-inheritance,Php,Model View Controller,Templates,Template Inheritance,是否有一个现有的好例子,或者一种方法应该如何创建一个基本的模板系统(考虑MVC)来支持PHP5中的“模板继承” 有关我定义为模板继承的示例,请参阅Django(用于web开发的Python框架)模板文档: 我特别喜欢PHP本身作为“模板语言”的想法,尽管这不一定是一种要求 如果列出实现“模板继承”的现有解决方案,请尝试以单个系统的形式给出答案,以利于“大众投票” 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模板继承
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 %}