На сколько это полная ерунда? SAX для XTML

DarkLordis

Новичок
На сколько это полная ерунда? SAX для XTML

В процессе производства сайтов с динамическим содержимым к программисту поступают результаты работы дизайнера и верстальщика в виде html+css, ну и конечно набор картинок. Типичный способ добавления динамического содержания – html injection. Результирующий файл представляет из себя чередующиеся участки php кода и html. Результат труда программиста выглядит не очень красиво. Визуально работать с такими текстами затруднительно. Одновременная работа программиста с дизайнером и верстальщиком не всегда реальна. В свое время это вынуждало программистов пользоваться «шаблонизаторами».
Однако существует и другой способ. Конечно, наше решение не универсальная панацея и мы не можем украсить нашу статью лозунгом «делай так и никак иначе», но иногда действительно помогает.
В последнее время верстальщики используют XHTML, отличающийся более строгим подходом к синтаксису. Этим мы и воспользуемся.
Итак, исходное положение: руки на клавиатуре, дизайн сайта в виде html+css, лень, головная боль и отсутствие времени по выбору.
1. В доступное место положите parser.php .
2. Создайте новый файл типа *.php с содержимым типа:
PHP:
<?php
require_once("parser.php");

class main extends parser
{
	function main()
	{
		echo $this->parse_file("design.htm");
	}
}

new main;
?>
В результате вывода данного файла вы должны получить страницу неотличимую от design.htm
3. Теперь вы можете изменять выдачу ананализатора по своему усмотрению. Например, надо добавить вызов какой-либо функции как реакцию на событие onload для страницы. Добавим реализацию следующего метода к нашему классу main
PHP:
	function tag_body($text, $args, $path)
	{
		$args["onload"] = "function();";
		return $this->recombine("body", $text, $args);
	}
4. Формат XHTML хорош тем, что в нем для каждого блока div обычно присутствует свойство id. Воспользуемся этим и изменим содержимое какого-нибудь div’а. Добавляем пару функций:
PHP:
	function tag_div($text, $args, $path)
	{
		if(isset($args['id']))
		{
			$element = "id_".$args['id'];
			if(method_exists($this, $element))
				return $this->$element($text, $args, $path);
		}
		return $this->recombine("div", $text, $args);
	}
	function id_menu($text, $args, $path)
	{
		$text = "Hello world!";
		return $this->recombine("div", $text, $args);
	}
Аналогично можно поступить с тегами имеющими уникальное значение параметра name.
5. Все остальное теперь зависит только от вашей фантазии. Все что надо расположить до выдачи html расположите в методе-конструкторе (в данном случае function main) до строки
PHP:
		echo $this->parse_file("design.htm");
О том как это работает…
Класс parser представляет из себя рекурсивный нисходящий анализатор html. Считывание из файла производится посимвольно (существует и версия с буферизированным вводом но преимуществ не выявлено). При получении HTML тега производится поиск функции его обработки вида tag_<имя тега>($text, $args, $path). В качестве параметра $text передается внутренний текст тега, $args содержит ассоциативный массив параметров тега, а $path имена родительских тегов. Функция должна возвратить обработанный текст, в противном случае, его содержимое будет потеряно. Для простоты конструирования возвращаемого текста используется метод recombine класса parser. Метод recombine($tag, $text, $args) возвращает тег $tag c параметрами $args и внутренним текстом $text.
Варианты данного класса могут быть использованы (и используются) для анализа XML файлов.
Главные особенности метода – несомненная простота и отсутствие изменений, вносимых в html файлы.
 

С.

Продвинутый новичок
ДОМоподобные шаблонизаторы не новинка. Но популярности не получили.
 

DarkLordis

Новичок
простите, а где вы увидели шаблоны? нет и не надо никаких. в этом прелесть и простота. все стандартно
 

С.

Продвинутый новичок
Не заблуждайтесь.

<div id="block">
</div>

точно такой же шаблон, как и

{start block}
{end block}

только с синтаксисом, замаскированным под ХТМЛ.
 

DarkLordis

Новичок
ну не шаблон это... это xhtml. Tot hfp gjdnjh.cm
я вижу существенные отличия:
1. не надо преобразовывать html файлы в невразумительный tpl. а значит верстальшик может спокойно работать практически одновременно с программистом
2. некоторая "универсальность" базового класса.
3. интуитивная понятность технологии и сокращение времени разработки.
3. весит все это "добро" чрезвычайно мало и делает то что надо и без лишних телодвижений.
4. не известно надо ли это людям, может уже есть аналогичное и более продвинутое решение
Но собственно говоря пост был создан только для того что бы узнать интересует ли вопрос "легковесного" построения сайта с применением ООП и XML. Большое спасибо С. за дискуссию. Насколько я понимаю все предпочитают средства работы с XML которые остались со времени PHP4? Или разработка "легких" CMS неактуальна? Выскажите мнение пожалуйста! А то я тут в сомнениях стоит мне быть менеджером данного проекта или нет.
 

С.

Продвинутый новичок
Ну не шаблон, так не шаблон. Остаются факты:

- Это уже было и не прижилось
- Потому что не хрена это не легковесно, а очень даже ресурсохавно. Одно дело выцепить из файла определенные метки и разобрать их. А другое дело парсить весь ХТМЛ и строить свой ДОМ. Разница даже не в один порядок.
 

kirill538

Новичок
Сомневаюсь, что подобный подход кому-то нужен.
tpl безусловно невразумительно. Но с чего вы взяли, что мешанина XHTML + невнятные соглашения типа "id у каждого div" сильно лучше ?

Есть вполне стандартное решение - xml+xslt. Которое и позволяет работать верстальщику без связи с программистом.
Как вы правильно заметили, xhtml это вариант xml. Уверяю, что пропустить его через xslt трансформ будет несколько удобнее, чем через кучу методов, хакающих DOM вручную.

Не говоря о том, что идеология шаблонизаторов придумана не для абстрагирования вертальщика от программера, а содержания от представления :)
 

DarkLordis

Новичок
To С.: посмотри сначала код. А если не хочется смотреть, то для кнкретной критики можно посмотреть SAX в документации по PHP.
To kirill538 on "Но с чего вы взяли, что мешанина XHTML + невнятные соглашения типа "id у каждого div" сильно лучше ?"
- ну это вроде стандарт... а что вы думаете у элементов отображаемой странички могут быть одинаковые id?
on "Уверяю, что пропустить его через xslt трансформ будет несколько удобнее, чем через кучу методов, хакающих DOM вручную." тут 2 момента: xml+xslt вероятно прекрасное решение, но врядли столь простое... для меня вот точно не простое (слишком долго я программировал на C++), второй момент - DOM не строится. при разборе строится путь.
А в последнем верно. Исправлюсь. Буду писать научно "содержание от представления"... :)
А вообще - отвлекитесь на минуту от любви к шаблонам и описаниям преобразований... объектный код на php - это ж красиво! или я не на том сайте?
 
Сверху