是否有一个现有的好例子,或者如何创建一个支持PHP5中“模板继承”的基本模板系统(思考MVC)?
有关我定义为模板继承的示例,请参阅Django(用于Web开发的Python框架)模板文档:http://docs.djangoproject.com/en/dev/topics/templates/#id1
我特别喜欢PHP本身就是“模板语言”的想法,尽管它不一定是必需的。
如果列出实施“模板继承”的现有解决方案,请尝试将答案形成为单独的系统,以便“普遍投票”。
答案 0 :(得分:17)
答案 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 Documentation on Inheritence
复制<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>
同样,有很好的文档可供使用此功能。在twig documentation中,为了展示twig提供的一些更高级的功能,这个例子更复杂,但为了比较的目的,我写了一些东西反映了树枝中的聪明例子。
<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 %}
回想起来,这两个例子几乎完全相同,因此在两者之间进行选择是比较特征和完全不同的问题。使用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编写的,而且它是可扩展的,你可以创建一个新的插件和更多的
中详细了解该项目答案 8 :(得分:0)
我正在使用的模板引擎
(支持类似php的语法和include / template指令以及处理模板继承)
支持PHP,客户端js和具有相同格式的nodejs
答案 9 :(得分:0)
Puja是一个类似Django的PHP http://www.phpclasses.org/package/8283-PHP-Template-engine-that-compiles-templates-into-PHP.html模板引擎。它还支持验证模板语法。