Как реализовать наследование шаблонов (например, Django?) В PHP5 - PullRequest
11 голосов
/ 03 июня 2009

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

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

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

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

Ответы [ 10 ]

17 голосов
/ 29 марта 2010

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

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

http://arshaw.com/phpti/

7 голосов
/ 10 мая 2012

Ответ Soulmerge не имеет ничего общего с наследованием шаблонов.

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

phpti - одна из опций, упомянутых ранее, но мне она кажется немного уродливой.

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

3 голосов
/ 10 июля 2009

Symfony поддерживает наследование шаблонов , это так похоже на django, что синтаксис выглядит совместимым с django или другими красивыми движками jinja python .

Elegance, как использование 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 %}
2 голосов
/ 08 января 2015

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

Smarty

Чтобы сделать это в 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>

Twig

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

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.

Дальнейшее чтение

2 голосов
/ 03 июня 2009

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

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

<? require $content ?>
1 голос
/ 04 июня 2009

Если вы знакомы с тем, как работает наследование классов, ваш ответ - ДА, 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>
0 голосов
/ 07 октября 2013

Puja - Django-подобный шаблонизатор для PHP http://www.phpclasses.org/package/8283-PHP-Template-engine-that-compiles-templates-into-PHP.html. Он также поддерживает проверку синтаксиса шаблонов.

0 голосов
/ 11 августа 2013

Шаблонный движок, над которым я работаю

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

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

https://github.com/foo123/Contemplate

0 голосов
/ 01 июля 2013

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

Подробнее о проекте вы можете прочитать здесь http://phpbeat.com/doc/templating

0 голосов
/ 06 января 2012

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

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

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

Подробнее на: http://phpti.com/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...