Как реализовать наследование шаблонов (например, Django?) В PHP5

Есть ли хороший пример или как следует подходить к созданию базовой системы шаблонов (мышление MVC), которая поддерживает "Наследование шаблонов" в PHP5?

В качестве примера того, что я определяю как наследование шаблона, обратитесь к Django (инфраструктура Python для веб-разработки). Документация по шаблонам: http://docs.djangoproject.com/en/dev/topics/templates/#id1

Мне особенно нравится идея о том, что сам PHP является "языком шаблонов", хотя это не обязательно требование.

Если перечислены существующие решения, реализующие "Наследование шаблонов", попробуйте сформировать ответы как отдельные системы в интересах "народного голосования".

Ответ 1

Сам язык PHP был разработан именно для этих задач, [к сожалению] он стали более способными со временем и людьми, которые начали с этот простой синтаксис начал реализовывать все более сложные задачи с этим странным языком.

Я думаю, что вы имеете в виду с наследованием шаблона, лучше всего выразить как динамическое включение файла в PHP, так же просто, как

<? require $content ?>

Ответ 2

Извините, что выкопал старый поток, но я только что выпустил библиотеку, которая наследует шаблон на родном PHP. Очень вдохновлен Django. Пожалуйста, проверьте его и дайте мне знать, что вы думаете:

"Наследование шаблонов PHP"

http://arshaw.com/phpti/

Ответ 3

Ответ, полученный Soulmerge, не имеет ничего общего с наследованием шаблонов.

Лично я считаю, что наследование шаблонов велико, и это мой первый раз, когда кто-то жалуется на это.

phpti - это один из вариантов, который был указан ранее, но для меня это выглядит немного уродливо.

Возможно, вы захотите рассмотреть усы (mustache.github.com), которые поддерживают наследование шаблонов, и имеют реализации на многих языках (включая php). Чтобы использовать шаблоны усов в PHP, вы, вероятно, захотите написать какой-то контроллер для чтения в файлах усов и обработать их.

Ответ 4

Symfony поддерживает наследование шаблонов, он так же напоминает django, что синтаксис выглядит совместимым с django или другие красивые 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 %}

Ответ 5

Обе системы шаблонов Smarty и Twig поддерживают "Наследование шаблонов", как это описано в системе шаблонов django. Оба эти являются популярными и хорошо поддерживаемыми системами шаблонов, однако twig имеет синтаксис ближе к django, и поэтому вам может быть удобнее использовать это.

Smarty

Чтобы сделать это в smarty, вы можете сделать это, как в следующем примере, скопировано из Smarty Documentation on Inheritence

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>

Twig

Опять же, есть хорошая документация для использования этой функции. В документации twig пример более сложный, чтобы продемонстрировать некоторые из более продвинутых функций, предоставляемых веточкой, но в сравнительных целях я написал что-то, что отображает пример smarty в веточке.

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.

Дополнительная литература

Ответ 6

Предполагая, что вы знакомы с тем, как наследование классов работает, ваш ответ ДА, 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 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 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>

Ответ 7

Наследование шаблона PHP кажется хорошей альтернативой. Ниже приведено описание с веб-сайта:

Наследование шаблонов - чрезвычайно полезный способ создания многоразовых HTML-макетов для сайта. Он гораздо более гибкий, чем альтернативные методы, такие как "включая" общие элементы страницы (например, файл заголовка и нижнего колонтитула).

Концепция существует некоторое время, особенно в шаблоне Django. В отличие от других библиотек, PHP Template Inheritance позволяет писать все в прямом PHP. Нет необходимости изучать другой язык шаблонов.

См. больше на: http://phpti.com/

Ответ 8

Есть отличный компонент, "Redstart Templating", он поддерживает php-шаблоны Inheritance очень сильным способом, и все шаблоны написаны в чистом html и php, а также расширяемы, вы можете создавать новые плагины и создавать больше

вы можете больше узнать о проекте здесь, в http://phpbeat.com/doc/templating

Ответ 9

Механизм шаблонов, над которым я работаю

(поддерживает php-подобный синтаксис и директивы include/template, а также работает над наследованием шаблонов)

Поддерживает как PHP, клиентские js и nodejs с одинаковым форматом

https://github.com/foo123/Contemplate