Пользовательский механизм шаблонов php: я, наконец, на правильном пути?

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

Я так долго и так много раз работал над полным переписыванием пользовательского механизма шаблонов на php, что решил спросить мнения.

Короче говоря, это самая важная часть, которую я реализовал до сих пор:

  1. Любой http-запрос перенаправляется на handler.php
  2. на основе запрошенного URL-адреса создается экземпляр контроллера и вызывается метод этого контроллера.
  3. The controller method must return an IView compatible class instance ( IView defines a Render() method)
    1. The template engine does some xpath for every namespace that ends in 'serverside' sprintf('//%s:*[@runat="server"]', $namespaceprefix )
    2. Для каждого найденного тега он ищет класс php, идентифицированный $tag.localName, создает экземпляр и прикрепляет его к исходному шаблону.
    3. После прикрепления исходный узел шаблона передается в «ServerTag», чтобы он мог правильно инициализироваться.
    4. полностью полный экземпляр, совместимый с IView, назначается временной переменной в методе контроллера.
  4. Контроллер просит передать данные из класса Model в представление, которое выполняет изящную замену xpath DOM.
  5. Контроллер возвращает полностью заполненный вид обработчику main(), который его рендерит.

Я основываю свой шаблон на xml. простой шаблон в настоящее время выглядит так:

<html xmlns="http://www.w3.org/1999/xhtml" 
  xmlns:red="http://www.theredhead.nl/serverside">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Title will be filed by the View depending on the Controller</title>
    <link rel="stylesheet" type="text/css" href="/Stylesheet/Get/Main/" />
</head>
<body>
    <!-- the entire body may be reset by the view using it, using XPath and DOM functions -->
    <!-- Usually the PageHeader and PageFooter would be put back after clearing the body  -->
    <div id="PageHeader">
        <img src="/Image/Get/theredhead_dot_nl.png" alt="Site Logo" />
    </div>
    <h1>www.theredhead.nl :: Test Template</h1>
    <p>
        Lorum ipsum dolar sit amet. blah blah blah yackadee schmackadee.
    </p>

    <div id="PageFooter">
        Built by
        <br />
        <red:UserProfileLink runat="server" Username="kris" />
    </div>
</body>
</html>

В настоящее время это выводит (включая сломанный отступ):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:red="http://www.theredhead.nl/serverside">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>Welcome to my site</title>
    <link rel="stylesheet" type="text/css" href="/Stylesheet/Get/Main/"/>
    <link rel="stylesheet" type="text/css" href="/Stylesheet/Get/Custom/"/>
    <link rel="stylesheet" type="text/css" href="/Stylesheet/Get/Profile/"/>
</head>
<body>
    <!-- the entire body may be reset by the view using it, using XPath and DOM functions -->
    <!-- Usually the PageHeader and PageFooter would be put back after clearing the body  -->
    <div id="PageHeader">
        <img src="/Image/Get/theredhead_dot_nl.png" alt="Site Logo"/>
    </div>
    <h1>www.theredhead.nl :: ModelViewController</h1>
    <p>
        Lorum ipsum dolar sit amet. blah blah blah yackadee schmackadee.
    </p>

    <div id="PageFooter">
        Built by
        <br/>
        <div><div xmlns:profile="http://www.theredhead.nl/profile" class="ProfileBadge" style="font-size : .8em;">
<a style="text-decoration : none; border: none;" href="/Profile/View/kris">
    <img style="float : left;" src="http://www.gravatar.com/avatar/5beeab66d6fe021cbd4daa041330cc86?d=identicon&amp;s=32&amp;r=pg" alt="Gravatar"/>
    &#xA0;Kris
</a>
<br/>
<small>
&#xA0;Rep:&#xA0;1
</small>
</div></div>
    </div>
</body>
</html>
  • Я затронул здесь только верхушку айсберга, и да, я буду удалять неиспользуемые атрибуты xmlns из вывода, как только буду доволен функциональностью.
  • в настоящее время в моих mvc и основных фреймворках чуть более 200 классов.
  • Я знаю, что существуют существующие решения, которые могут делать подобные вещи, но я хочу создать свое собственное.

Итак, большой вопрос: Можете ли вы что-нибудь сказать об обязательных функциях?

P.S. если кого-то интересует полный исходный код, пожалуйста, оставьте комментарий, я размещу его на своем сайте, когда достигну приемлемого уровня удобства использования для разработчиков.


person Kris    schedule 12.10.2008    source источник
comment
Я думаю, что вопрос был в том, правильно ли я поступаю на этот раз? Я думаю, что это невозможно ответить. Я имею в виду, что уже более 200 (!) классов и все такое, никто не может судить о вашей работе по тому, что вы здесь написали ... и IIRC SO не предназначен для вопросов такого типа.   -  person Simon Lehmann    schedule 13.10.2008
comment
Вопрос о движке шаблонов, о каких обязательных функциях я, возможно, не подумал? Не обо всей структуре.   -  person Kris    schedule 13.10.2008
comment
Я еще ничего не тестировал, но все работает быстро на моем Macbook pro 2Ghz при обычной повседневной нагрузке.   -  person Kris    schedule 13.10.2008
comment
Можете ли вы предоставить исходный код, как вы предложили в своем вопросе?   -  person hakre    schedule 13.11.2011
comment
@hakre: Больше нет, но посмотрите github.com/theredhead, последняя версия должна появиться там, как только у меня есть демонстрационное приложение адресной книги (которое должно было быть сегодня, но я немного отстаю от графика)   -  person Kris    schedule 14.11.2011


Ответы (3)


Почему бы просто не использовать PHP в качестве системы шаблонов. PHP ЯВЛЯЕТСЯ системой шаблонов.

Что плохого в том, чтобы просто сбросить <?php=$variable;?> в HTML-шаблон? Вы можете использовать циклы foreach и т. д. Просто убедитесь, что вы запускаете его из области, которая не может получить доступ к каким-либо переменным, которые вам не нужны.

У меня действительно глубокая ненависть к таким сверхсложным системам шаблонов, как эта, еще со времен кошмаров с Java/Struts. Вам нужно погрузиться в пространства имен, xpath, пользовательские пространства имен и все такое, прежде чем вы сможете изменить только одну вещь, которая вам нужна.

person SchizoDuckie    schedule 13.10.2008
comment
Я делаю это, потому что это весело, а не потому, что мне это нужно. Это началось как идея доказать, что php не менее способен, чем aspx, но сейчас это просто хобби. - person Kris; 13.10.2008


Мне кажется, что только Фил Рейф действительно прочитал и вопрос и его намерение.

Те люди, которые утверждают, что php является механизмом шаблонов, игнорируют слишком много фактов и закрываются от реального мира, где важны надежные фреймворки.

Итак, пункты должны иметь функции до сих пор (которые еще не были реализованы):

  1. Списки. Я буду обрабатывать те элементы управления, которые аналогичны <asp:DataGrid>.
  2. Проверка. Будет обрабатываться с помощью элементов управления проверкой. Регулярные выражения, сравнения и т.д.
  3. Вывод принудительно действителен xhtml 1.0, по крайней мере, до тех пор, пока не впитается html 5.
  4. Составные настраиваемые элементы управления (на основе шаблонов xml вместо кода)
  5. встроенный php-код... Я рассматриваю это, <?php ... ?> является допустимым узлом xml DOMProcessingInstruction, но судьи не определились.
  6. Настраиваемая глобальная обработка исключений.

Я разместил первые черновики в Интернете, чтобы вы могли взглянуть и, возможно, вернуться ко мне с некоторыми интересными идеями.

Судя по тому, как все выглядит, в ближайшие пару дней у меня будут готовые формы. На данный момент это только первый набросок дизайна (как по коду, так и по стилю).

Все еще надеясь получить здесь больше информации, какие элементы управления вы используете и любите? (из любого фреймворка/языка)

Крис

person Kris    schedule 15.10.2008