У меня есть один технический вопрос, по поводу вывода... РНР генерит код и отсылает его броузеру клиента, как я понял из комментариев пакетно. Мне теперь непонятно, влияет ли вывод html-структуры на страницу броузера на скорость передачи рнр-кода? Т.е. жде:т ли рнр-обработчик в каком-либо случае, пока не будет выведен html-код или ему все: до фени, а что там броузер с html делает, так это его проблемы? (Ну я не беру косвенные варианты, когда броузер в данный момент со второй страницы, но с этого же сервера грузит какую-нибудь большую картинку и по-этому тормозится передача рнр)
Когда пишу для себя, то сочетаю два вида шаблонов: статические и динамические. Статический для глобального шаблона и динамические для разных блоков: меню, модули и т.п. Динамические шаблоны пишу на PHP. По-моему удобно.
народ зацените,написал запару вечеров не спешной работы,пока еще не описана ожна функция но и без нее пока можно обойтись. index.php PHP: <?php // standard hack prevent define('IN_PHPBB', true); $phpbb_root_path = './'; $phpEx="php"; include($phpbb_root_path . 'includes/template.'.$phpEx); $puth="./tpl"; $template->cahge_dir($puth); $puth_file='qwe.tpl'; $template->load_tpl ($puth_file); for($fx=1; $fx <=7; $fx++) { $template->assign_block_vars('blok1', array ( 'per1' => $fx, 'TOTAL_USERS' => '<b>привет</b><b>привет</b><br><b>привет</b> <b>привет</b>', ) ); } $template->assign_block_vars('blok2', array ( 'per1' => "<b>вавапивапва амвам вафмывами dzf sfd вам ва</b>", 'TOTAL_USERS' => '<b>привет</b>', 'per3'=> '<b>привет</b><b>привет</b> <b>привет</b><b>привет</b>', ) ); $template->parse('0'); ?> template.php PHP: <?php $template = new template; class template { var $text; var $bodytag; var $edit_text; var $itog_txt=array(); var $all_block=array(); function cahge_dir ($puth) { chdir($puth); } function load_tpl ($puth_file) { global $text; $this->text = implode ('', file ($puth_file)); //echo $text; return true; } function assign_block_vars ($blockname, $vararray) { preg_match("/((?:<!\-\- BEGIN $blockname \-\->)[^`]*(?:<!\-\- END $blockname \-\->))/", $this->text, $this->bodytag); $string= $this->bodytag[0]; foreach($vararray as $key=>$value) { $pattern="/(?:\{$blockname.){1}(?:$key){1}(?:\}){1}/"; preg_match($pattern,$string,$this->edit_text); //echo $this->edit_text[0].'<br>'; $replacement= $value; $string=preg_replace($pattern, $replacement, $string); } $pattern="/(?:\{$blockname.){1}(?:[A-Za-z0-9])*(?:\}){1}/"; $replacement=''; $string=preg_replace($pattern, $replacement, $string); // echo htmlspecialchars ($string)."<br><br>"; $pattern="/(?:<!\-\- BEGIN $blockname \-\->)/"; $replacement= ""; $string =preg_replace($pattern, $replacement,$string ); $pattern="/(?:<!\-\- END $blockname \-\->)/"; $replacement= ""; $string =preg_replace($pattern, $replacement,$string ); $this->itog_str=$string.$this->bodytag[0]; //echo ( $this->itog_str); $pattern="/((?:<!\-\- BEGIN $blockname \-\->)[^`]*(?:<!\-\- END $blockname \-\->))/"; $replacement= $this->itog_str; $this->text =preg_replace($pattern, $replacement, $this->text); $this->all_block[]=$blockname; } function parse ($puth_file) { //$pattern="/(?:<!\-\- BEGIN )[a-zA-Z0-9]*( \-\->)[^`]*((?:<!\-\- END )[a-zA-Z0-9]*( \-\->))(?!\w)/"; //$replacement= ""; //preg_match($pattern,$this->text,$navis); //$this->text =preg_replace($pattern, $replacement, $this->text); foreach($this->all_block as $ke=>$va) { $pattern="/((?:<!\-\- BEGIN $va \-\->)[^`]*(?:<!\-\- END $va \-\->))/"; $replacement= ""; $this->text =preg_replace($pattern, $replacement, $this->text); } echo $this->text; } } ?> а вот так выглядит шаблон Код (Text): привает ккака <br> <!-- BEGIN blok1 --> ла орапиоиы {blok1.per1} оаиоыаиыолав {blok1.TOTAL_USERS} <br> <!-- END blok1 --> vuvuvu <br> <!-- BEGIN blok2 --> ла орапиоиы {blok2.per1} оаиоыаи{blok2.per3}ыолав {blok2.TOTAL_USERS} <br> <!-- END blok2 --> hvhjvj ggvyuvuyv yvu yuv <br> что скажите? слишком топорно? я впрограмировании не силен, да и опыта большого нету
Vell Я как-то давно делал что-то подобное, но потом выяснилось что это даже не велосипед, это изобретение квадратного-колеса Оффтоп: Петр, я не шаромётчик, просто модератор на форуме шаромётчиков, анимешников и оверклокеров в одном флаконе... (познакомился с пацанами на почве оверклокинга)
а я, как ярый сторонник принципа KISS, предложу вам следующий вариант: PHP: <?php # $name - имя файла скрипта или относительный путь к нему; # без расширения - оно будет добавлено автоматически # $var - выходные данные # выходные данные возвращаются из вызываемого скрипта # функцией returm # пример: # $menu= inc ('menu/all', $current_path); function inc ($name, $var=NULL) { return include ('./inc/'.$name.'.inc'); } # $name - имя файла темплейта или относительный путь к нему; # без расширения - оно будет добавлено автоматически # $var - входные данные # вывод из темплейта записывается в строку, которая и # возвращается функцией # пример: # echo out ('menu/leftblock', $menu); function out ($name, $var=NULL) { ob_start(); include ('./out/'.$name.'.out'); $out= ob_get_contents(); ob_end_clean(); return $out; } # пример использования $goods= inc('goods', $vendor); echo $nav= out('nav', $goods); echo out('goods/list', $goods); echo $nav; ?>
dark-demon, имхо, тут обратный эффект =) Выбирать в буфер то, что можно просто заинклудить при таком раскладе. =) Keep it simple...
А вот такой вопрос: Есть шаблон, я его обрабатываю: PHP: <?php $template = new Buffer(); $template->SendFile("Templates/Index.html"); $template->Parse(); $template->Show(); ?> Допустим. Но у меня есть этот шаблон раньчше состоял из многих файлах внутри этого шаблона, например левый фланг был разбит на блоки и инклудились. Как мне это сделать в шаблоне? Я написал дополнительныцю функцию function FileInclude($filename) { $this->buffer = include $filename; } Но как сделать чтобы файл modules/module.php автоматически вставлялся в {include.module} например.
xak2, можешь попробывать замену, т.е.: PHP: <?php $filename = "template.html"; $handle = fopen($filename, "r"); $contents_template = fread($handle, filesize($filename)); fclose($handle); $seznam = glob('modules/*.php'); foreach($seznam as $v) { $handle = fopen($v, "r"); $contents = fread($handle, filesize($v)); fclose($handle); $contents_template = str_replace('{include.'.basename($v, '.php').'}', $contents, $contents_template); } echo $contents_template; ?>
Я написал движок на ПХП и теперь мучаюсь с тем, что что-то я неправильно написал т.к. делал его в тепличных условиях. Движок с использованием шаблонов написанный на псевдо ООП хранящий данные в mysql. Шаблоны хранятся в таблицы mysql одной строкой со вставками, по типу как тут написали пример. В начале функция загружает инклудом все модули из папки /modules/ которые и создают новые объекты страницы. Далее парсер просматривает шаблон и запускает обработку модулей на выполнение и потом всё это дело собирается и выводится на экран. Вставки по типу <!- news --> заменяются кодом сгенерированным модулем-классом новостей. Этот последний движок я с божьей помощью переделал из не модульного старого движка построенного полностью на функциях. Вообще меня мучает, то что я хотел его сделать на ООП, а вышло то что и было тока взгляд с северо-востока К примеру я не могу понять, то что если сделать страницу объектом то выходит что у каждой страницы должна быть своя таблица в базе т.к. все страницы чуток разные, одна с новостями другая там ещё с чем то? Как загружать информацию в созданный объект страницы из базы? Короче есть ли у кого примеры или идеи движка на ООП с хранением данных в mysql?
Мне кажется следующий ваш пост будет предложить мне Смарту... Но если можно, то помогите более конкретно т.к. мне он не нужен.
на такие вопросы обычно напрашиваются 3 варианта ответа. 1. Выпить йаду. 2. Убиться ап стену. 3. Учить албанский.
Aleksforum Написать хороший шаблонизатор не так-то просто... особенно если вам нужны вкусности типа инклюдов, оберток и пр. Посмотрите, как реализован шаблонизатор в моем движке. Это не смарти, и он достаточно мощный. Движок фришный, так что можете брать что хотите из него для своих разработок.
Согласен с dark-demon... немного глуповато делать допдействие при создании шаблона - его запихивание в БД... кстати зачем он там??? а картинки вы тоже в БД пихаете?
Ganzal А почему бы и нет? Если твой шаблон - не банальный HTML файл с PHP вставками, то в файловой системе ему делать нечего, инклюдить его в движок все равно нельзя. Вроде бы уже обсуждали уже здесь, можно ли хранить шаблоны в базе. Даже пришли к выводу, что можно
Dagdamor тогда я туплю... разве шаблон нельзя прировнять к допустим образцу заполнения заявки на выдачу паспорта? просто тупо размечено что куда пихать. проформ (шаблонов, образцов) может быть множество а логика заполния одна... разве не так? разве суть шаблона не в том чтобы выводить разные данные в одинаковом визуальном представлении дизайна или скажем одни и те же данные в разном представлении если есть набор шаблонов?
Ganzal Все это верно, но это не имеет отношения к реализации шаблонизатора. Шаблон можно хранить в виде файла, если этот файл потом можно использовать напрямую - запросить через браузер (как с изображениями) или подключить в скрипт. Если оба варианта отпадают, то смысла хранить шаблон как файл нет. Операции закачки/скачивания через FTP - не самые удобные, а постоянные операции чтения с файловой системы - не самые быстрые. Вспомни Смарти ака самый тормозной шаблонизатор ever.