Как реализовать наследование шаблонов (например, Django?) В PHP5
Существует ли хороший пример или как следует подходить к созданию базовой системы шаблонов (например, MVC), которая поддерживает "наследование шаблонов" в PHP5?
Пример того, что я определяю как наследование шаблонов, приведен в документации по шаблонам Django (среда Python для веб-разработки): http://docs.djangoproject.com/en/dev/topics/templates/
Мне особенно нравится идея о том, что PHP сам по себе является "языком шаблонов", хотя это необязательно.
Если вы перечисляете существующие решения, которые реализуют "Наследование шаблонов", попробуйте сформировать ответы в виде отдельных систем для "народного голосования".
10 ответов
Сам язык PHP был разработан именно для этих задач, к сожалению, со временем он становился все более и более способным, и люди, которые начинали с этого простого синтаксиса, начали реализовывать все более сложные задачи с помощью этого странно развитого языка.
Я думаю, что вы подразумеваете под наследованием шаблонов, лучше всего выражается как динамическое включение файлов в PHP, так же просто, как
<? require $content ?>
Извините, что выкопал старый поток, но я только что выпустил библиотеку, которая выполняет наследование шаблонов в нативном PHP. Очень вдохновлен Джанго. Пожалуйста, проверьте это и дайте мне знать, что вы думаете:
"Наследование шаблонов PHP"
Ответ Soulmerge не имеет ничего общего с наследованием шаблонов.
Лично я считаю наследование шаблонов отличным, и я впервые вижу, что кто-то жалуется на это.
phpti - один из вариантов, упомянутых ранее, но мне он кажется немного уродливым.
Возможно, вы захотите рассмотреть mustache (mustache.github.com), который поддерживает наследование шаблонов и имеет реализации на многих языках (включая php). Чтобы использовать шаблоны усов в PHP, вы, вероятно, захотите написать какой-нибудь контроллер для чтения в файлах усов и их обработки.
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 %}
Как системы шаблонов Smarty, так и Twig поддерживают "наследование шаблонов", которое можно найти в шаблонной системе django. Обе они являются популярными и хорошо поддерживаемыми шаблонными системами, однако синтаксис twig ближе к django, и поэтому вам будет удобнее пользоваться этим.
всезнайка
Чтобы сделать это в smarty, вы можете сделать это, как в следующем примере, скопированном из документации Smarty по наследованию.
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>
прут
Опять же, есть отличная документация для использования этой функции. В документации по ветке пример более сложен, чтобы продемонстрировать некоторые более продвинутые функции, предоставляемые веткой, но для сравнительных целей я написал кое-что, что отражает умный пример в ветке.
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.
Дальнейшее чтение
- http://www.smarty.net/inheritance
- Наследование шаблона веток
- Поиск в Google по шаблону Smarty/Twig Inheritance
Если вы знакомы с тем, как работает наследование классов, ваш ответ - ДА, PHP поддерживает это. Это может быть излишним для Джанго, но я постараюсь очень быстро рассказать вам, как это сделать.
Примечание: я не собираюсь использовать контроллер здесь. Очевидно, что если страница является блогом, вы собираетесь создать объект 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>
Наследование шаблонов PHP кажется хорошей альтернативой. Ниже приведено описание с сайта:
Наследование шаблонов - чрезвычайно полезный метод создания многократно используемых макетов HTML для сайта. Это намного более гибко, чем альтернативные методы, такие как "включение" общих элементов страницы (например, файла верхнего и нижнего колонтитула).
Эта концепция была известна некоторое время, особенно в шаблонном движке Django. В отличие от других библиотек, PHP Inheritance позволяет вам писать все на простом PHP. Нет необходимости изучать другой язык шаблонов.
Смотрите больше на: http://phpti.com/
Puja - это Django-подобный шаблонизатор для PHP http://www.phpclasses.org/package/8283-PHP-Template-engine-that-compiles-templates-into-PHP.html. Он также поддерживает проверку синтаксиса шаблона.
Есть отличный компонент, "Redstart Templating", он очень сильно поддерживает шаблоны php. Наследование и все шаблоны написаны на чистом html и php. Кроме того, он расширяемый, вы можете создавать новые плагины и многое другое.
Вы можете прочитать больше о проекте здесь в http://phpbeat.com/doc/templating
Шаблонный движок, над которым я работаю
(поддерживает php-подобный синтаксис и директивы include / template, а также работает с наследованием шаблонов)
Поддерживает как PHP, js на стороне клиента, так и nodejs с одинаковым форматом