Пользовательский шаблонный движок php: я наконец на правильном пути? - PullRequest
1 голос
/ 13 октября 2008

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

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

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

  1. Любой http-запрос направляется на handler.php
  2. на основе запрошенного URL-адреса создается экземпляр контроллера и вызывается метод для этого контроллера.
  3. Метод контроллера должен возвращать IView совместимый экземпляр класса (IView определяет метод Render())
    1. Механизм шаблонов делает некоторый xpath для каждого пространства имен, которое заканчивается на '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 и core есть чуть более 200 классов
  • Я знаю, что существуют решения, которые могут делать подобные вещи, но я хочу создать свое собственное.

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

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

Ответы [ 3 ]

6 голосов
/ 13 октября 2008

Почему бы просто не использовать PHP в качестве вашей системы шаблонов. PHP IS система шаблонов.

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

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

1 голос
/ 16 октября 2008

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

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

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

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

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

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

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

Kris

1 голос
/ 13 октября 2008

Вот статья о шаблонизаторах: http://massassi.com/php/articles/template_engines/

Вы делаете это неправильно.

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