Библиотека тегов PHP
Я терпеть не могу HTML, смешанный с кодом. Я едва могу посмотреть на один из этих шаблонов, не чувствуя тошноты. Я знаю, когда в вашем распоряжении целая армия "веб-дизайнеров", и вы являетесь единственным разработчиком, имеет смысл использовать какую-то систему шаблонов. Я много слышал о Смарти. Но в моем случае это всегда было источником еще большей работы.
В любом случае, на этот раз я собираюсь в одиночку, поэтому я не хочу касаться шаблона HTML полюсом пословицы. То, что я сейчас делаю, выглядит так:
<?php
$page = new html_page('My wonderful page');
$page->add_contents(new html_tag('p', 'It works', array('id' => 'helloworld', 'class' => 'somecssclass')));
echo $page->render();
?>
Все принадлежит хорошей иерархии объектов, что хорошо и модно. Конечно, у меня есть много небольших классов, и я думаю об использовании динамических классов (например, "html_a" автоматически создаст объект html_tag типа "a".)
Теперь мой вопрос: кажется, что никто больше этим не занимается. Зачем? Я слишком далеко, и мой слабый, лишенный кислорода разум что-то упускает из общей картины?
(Я хорошо помню библиотеку с открытым исходным кодом, которая сделала именно это, но больше не может ее найти. Поэтому, если я на самом деле не представляю себе что-то, я не единственный, кто задумался об этом подходе к визуализации HTML.)
Есть ли у вас какие-либо мысли по этому поводу? (Пожалуйста, воздержитесь от рекомендации другого языка; мой любимый язык - Perl, поэтому я могу легко превзойти вас:-). Я застрял с PHP.)
редактировать
Э-э-э, похоже, я ударил по нервам. Некоторые уточнения:
- Я единственный разработчик в этом проекте.
- Как я смешиваю код с HTML? Объект "html_tag" из моей библиотеки очень похож на, скажем, узел в DOM. Метод "рендеринга" - это тот, который создает html (с прекрасным отступом, я должен добавить), но я нигде не пишу открывающий или закрывающий тег.
- Я создаю небольшие объекты для нескольких задач. Эти объекты имеют методы для создания объектов тегов; эти результирующие объекты затем вставляются, скажем, в таблицы или страницы.
- Я упоминал, что я застрял с PHP?
- В моей библиотеке есть несколько примитивных методов доступа для поиска объектов. Таким образом, пример итератора, опубликованный в 26288, может быть реализован относительно легко.
- Я не беспокоюсь о производительности (пока). Я всегда думал, что это действительно хорошая проблема, но я еще не там.
13 ответов
Немного по-другому, но все же похоже. Я написал статью об использовании DOM для привязки переменных к шаблонам. Вы можете найти это интересным.
Основной вариант использования:
$t = new Domling('<p class="hello"></p>');
$t->capture('hello')->bind("Hello World");
echo $t->render();
Который производит:
<p class="hello">Hello World</p>
Ну, суть в том, что вы все еще смешиваете свой HTML с вашим кодом. Если вы хотите поменять этот тег "p" на "div", вам нужно просто пройтись по коду, чтобы сделать это. Подумайте о том, что предлагает ваш метод:
- смешивает код с HTML
- добавляет накладные расходы для анализа всех запросов
- вводит новый "язык" над HTML
По сути, хотя подход может отличаться, он имеет те же проблемы, что и языки шаблонов, от которых вы пытаетесь уйти.
Не проще ли, если вы работаете в одиночку (или в группе), просто позволить PHP быть языком шаблонов?
$page = new Page('test.html');
$page->load($data);
$page->render();
и в вашем test.html "шаблон"
<html>
<head>
<title><?php echo $title ?></title>
</head>
<body>
<p><?php echo $hello ?></p>
</body>
</html>
То, что на самом деле делают другие движки шаблонов - это формализация приведенного выше кода. но если вы придерживаетесь основ (отображение переменных, базовые условия, циклы), вы, по сути, обладаете всей мощью языка шаблонов, но в привычном PHP и без снижения производительности.
Кроме того, в отличие от вашего примера, вы можете изменить HTML (я знаю, что вы не хотели его трогать, но изменение "p" на "div" в коде действительно ничем не отличается от изменения). <p>
в <div>
), без необходимости углубляться в код.
Итак, если я правильно понимаю, вы говорите, что вы так ненавидите смешивать код с вашим HTML, что вместо этого вы решили смешать HTML с вашим кодом? Я не вижу, как это что-то улучшает - код и HTML все еще смешаны - и это менее естественный / более сложный подход к PHP, который, кажется, дает очевидное объяснение того, почему никто другой не делает этого.
Используйте правильную систему шаблонов, которая фактически отделяет код от HTML, а не просто играет с тем, какой из них встроен в другой. Я бы предложил HTML::Template или Template::Toolkit, так как вы разделяете мой вкус к Perl, но вы уже сказали, что не-PHP языки не являются жизнеспособными вариантами.
Что ж, похоже, что люди расстроились из-за цитаты "ненавидеть PHP". Это не намеренный вопрос, извините, если я откажусь от вашего любимого языка.
В конце есть несколько действительно важных замечаний, сделанных несколькими людьми;
- Неудачное соглашение об именах: имя элемента HTML в качестве имени объекта звучит как колокольчик.
- Я заново изобретаю Лисп, и самое худшее в этом.
- Это просто еще одна система шаблонов и плохая для загрузки.
Принятым ответом для меня была хорошая статья, опубликованная troelskn. Я пришел к выводу, что мне нужна моя собственная модель документа и что я должен воздерживаться от использования имен сущностей html на ней. Как я уже говорил, это небольшой побочный проект; эта статья и некоторые советы, которые я получил из ее комментариев, дали мне новые идеи для изучения.
(О переизобретении части Lisp: я единственный человек, которого я знаю, который любил программировать DOM. Так что там.)
Спасибо всем за ваши комментарии.
Я не уверен, о чем ты говоришь. Вы ищете библиотеку шаблонов для PHP? Их много, и хотя модно ненавидеть Smarty (как и модно ненавидеть сам php), это отличная библиотека.
Вы спрашиваете, почему "все" смешивают HTML в своем PHP-коде? Ответ заключается в том, что это делают только начинающие и идиоты. Каждый, кто имеет опыт работы с php, использует шаблонизатор.
Если вы спрашиваете, почему никто не добавляет каждый HTML-код в код, как в вашем примере, это очевидно: потому что это кошмар обслуживания. Собираетесь ли вы дать свой код дизайнеру и пожелать ему удачи в этом? Собираетесь ли вы вручную конвертировать каждую HTML-страницу в страницы и страницы кода?
Вопрос 261338 имеет некоторую колинеральность в этом, но мой ответ там был больше нацелен на php людей, которые являются новичками во всей этой программе "разделение проблем? Что это?" люди. (извините php люди, во многом это так)
Вы могли бы быть хорошим игроком на perl и использовать perl для создания html шаблонного дерьма, которое загружается в php, я все еще новичок в perl, но php пахнет, и я использовал его слишком долго, наверняка должен быть способ написать сайт на Perl, который работает на PHP.
В-третьих, я хотел бы увидеть что-то, что делает аугментативную замену вне переменных.
Вроде как в стиле jQuery, но без раздумий, java(носорогов) или всего веб-браузера.
$page = new Page("FakePage.html");
$page->find("div#foobar")->text = "Hahah! I rock" ;
/* Give All H1's a numeric lead in */
foreach( $page->find("h1")->iterator() as $index => $node )
{
$node->text = ($index + 1 ) . ". " $node.text;
};
$page->render();
Мне бы очень понравилось то, что делало это хорошо и не слишком сильно. Обратите внимание на мое использование структур, которые, вероятно, не будут полностью любимы php.
Мечты свободны.
(Это синтаксис /only/, который по-настоящему разделяет дизайн и логику, все остальные шаблонные вещи просто рекурсивно уменьшают языки программирования)
Дополнительная классная часть здесь:
- Не нужно santise HTML, его DOM AWARE!
- Нет необходимости в странной специальной разметке шаблона, которая отстой и не будет работать в 90% редакторов и не может быть проверена сама по себе, не пролив на нее курицу.
PHP - это язык шаблонов. поэтому естественно, что все поклонники PHP используют шаблонный дизайн.
Есть несколько библиотек LISP, которые делают такие вещи, как вы. ИМХО, это большое отключение, когда я подхожу к языкам LISP.
Никто другой не делает этого, потому что это немного больше работы, чем просто выход из режима PHP и выход из него для файла шаблона, не говоря уже о том, что он просто добавляет накладные расходы исключительно для удовлетворения ваших предпочтений в эстетике кода.
Это не означает, что вы можете отделить логику от отображения, например, простую систему, как предложил Оуэн. Но уклоняться от соглашения php, смешанного с HTML, просто потому, что вам это не нравится, немного глупо - это то, как язык был создан для использования.
Я знаю, что вы не хотите слышать о шаблонных системах, но если вы только смотрели на Smarty, вы упускаете лучший вариант. Попробуйте крошечный, но сильный
Как и вы, я единственный разработчик, но я считаю, что TBS значительно повышает мою производительность и удобство сопровождения моего кода. В отличие от smarty, он не налагает макрос языка в шаблонах и полностью на 100% совместим с Dreamweaver - шаблоны действительно и действительно остаются как wysiwyg, что экономит абсолютную массу времени.
Возможность писать весь мой код в отдельных файлах из шаблона означает, что он может быть отформатирован и упорядочен стандартным образом. Техническое обслуживание - дремучее, поскольку я всегда знаю, как структурирован мой код.
Я использую TBS с библиотеками XAJAX, и это работает, но вы можете смешивать с любыми предпочитаемыми вами библиотеками - у меня, например, довольно хорошо работает с Dojo, и я смотрю на jQuery.
Существует очень мало фреймворков для php, которые делают то, что вы хотите. Попробуйте Прадо или Yii. Они поддерживают полноценные библиотеки тегов, а не только системы шаблонов. Вы также можете проверить phpframeworks.com, вы можете найти другую инфраструктуру, которая делает то, что вам нужно.
Я также разрабатываю свой собственный фреймворк с поддержкой библиотек тегов и манипуляций с dom на стороне сервера, но мне все же нужно немного оптимизировать код, прежде чем что-либо публиковать, этот проект находится на http://players.sourceforge.net/.
Я использую подход xml, xsl для разработки своих форм, используя один шаблон xls для визуализации любой формы, которую я использую на своем портале. В начале было немного сложно найти правильный формат файла xls, но после того, как это было сделано, мне было очень легко визуализировать мои формы. В php мне просто нужно создать объект XML и отобразить его.
Очевидно, что будут "особые" вещи, которые я не хочу рендерить с помощью xls, в этом случае я рендую их как обычно.
Я не люблю много смешивать с php-кодом, поэтому я разработал эти библиотеки...
По многим из тех же причин я разработал облегченный, близкий к металлическому тэгу lib, сохранив тот вкус, который был при использовании lisp для генерации HTML.
Обзор / пример кода здесь xilla_tags