Чем плохи такие "шаблоны"?

regi

Новичок
Чем плохи такие "шаблоны"?

Если, конечно, это вообще можно назвать шаблонами :)

есть файл:
news.php:
PHP:
<?
 for($i=0; $i<5; $i++){
  $ntitle=$i;
  $nbody="body".$i;
  include($_SERVER['DOCUMENT_ROOT']."/html/news.htm");
 };
require_once($_SERVER['DOCUMENT_ROOT']."/html/main.htm");
 echo $page;
?>
файл /html/main.htm:
PHP:
<?
$page='
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Нереальный шаблон</title>
</head>
<body>'.$main.'</body>
</html>';
?>
файл /html/news.htm:
PHP:
<?
$main.='<table width="400px" border="1">
<tr>
 <td>'.$ntitle.'</td>
</tr>
<tr>
 <td>'.$nbody.'</td>
</tr>
</table>
<br>';
?>
все вроде работает :))
Какие минусы этого способа? и, если есть, то плюсы. Только палками не бейте :)
 

Tsatur

Guest
Работа с инклудом отрицательно сказывается на быстродействии...
 

regi

Новичок
разве вставка даже 10 инклудов в цикле заметно снизит быстродействие в данном случае, когда вставляемый файл мал?
 

Tsatur

Guest
А ты поэкспериментируй...
Сначала попробуй с 10 инклудами, а потом содержимое news.htm считай в переменную и замени данные с помощью str_replace...
Мне самому стало интересно :)
 

aad781

Guest
где-то читал про fast template, а это и быстрее и надежнее...
как вспомню где сразу напишу...

Там шаблон файла заносится в массив, где в шаблое присутствует что-то типа %body%

вывод идет такой:

PHP:
$bof = file("файл с базой.dat");
@list($body)=explode("|", $bof[$i]); 
$t_top2 = file("файл шаблона.htm"); 
for ($t2 = 0 ; $t2 < count($t_top2); $t2++) 
{ 
$t_top2[$t2] = str_replace("%body%","$body","$t_top2[$t2]");
}
echo $t_top2[$t2];
В принципе что-то вроде этого...
 

regi

Новичок
да, str_replace быстрее в разы: 0.0015

и хотел, кстати, узнать, правильно ли я его применил, так как столкнулся впервые с этим:
PHP:
$tpl=file_get_contents($_SERVER['DOCUMENT_ROOT']."/html/news.htm");

$tosearch=array("{ntitle}", "{nbody}");

for($i=0; $i<10; $i++){
 $nreplace["title"]=$i;
 $nreplace["body"]="news number $i";
 $main.=str_replace($tosearch, $nreplace, $tpl);
};
сам news.htm выглядит примерно так:
PHP:
<table width="400px" border="1">
<tr>
 <td>{ntitle}</td>
</tr>
<tr>
 <td>{nbody}</td>
</tr>
</table>
<br>
 

Screjet

Новичок
Ребятки, у вас в руках такой мощный инструмент = ПХП. А вы болтаете ерундой.

1) шаблон, например, новости: news.html
Код:
[php]
<table border="1" width="100%">
	<tr><td width="75%"><?=$row['Title']?></td><td width="25%"><?=$row['PostDate']?></td></tr>
	<tr><td colSpan="2"><?=$row['Text']?></td></tr>
</table>
[/php]
2) Код, который выводит список новостей
PHP:
<?
$rc = mysql_query("SELECT * FROM `News` WHERE 1 ORDER BY `PostDate` DESC LIMIT 10");
while( ($row = mysql_fetch_assoc($rc)) ){
	include 'news.html';
}
mysql_free_result($rc);
?>
Все! Лента новостей есть!
 

DimbIch

Новичок
ну можно также использовать Smarty
smarty.php.net
имхо хорошая система для шаблонов если так можно выразиться.....
 

Кром

Новичок
>Все! Лента новостей есть!

Прям как возвращение к истокам. Крастота!
 

svetasmirnova

маленький монстрик
ИМХО

Плюсы описаны здесь: http://spectator.ru/technology/php/easy_templates
Минусы:
1. При увеличении размера файла news.php будет тяжело искать строчки [pre]include[/pre] и [pre]require[/pre]
2. При решении проблемы №1 (например, подключать "шаблоны" в конце файла news.php) могут появиться проблемы видимости переменных [pre]$ntitle[/pre] и [pre]$nbody[/pre] или конфликты имён
3. Такие "шаблоны" не сможет использовать движок на каком-нибудь другом языке (не PHP).
4. Такие "шаблоны" зависимы от версий PHP.
Только палками не бейте
Для некоторых проектов это не важно (они могут иметь запланированный срок жизни менее года: например, web-страничка рекламной акции).
Решения проблемы №2:
1. Шаблонный движок Savant http://phpsavant.com/
2. Инкапсулировать переменыые [pre]$ntitle[/pre] и [pre]$nbody[/pre] в класс. Лучше их использовать как статические переменные статического класса (всё равно больше одного экземпляра не понадобится:) ).
3. Также можно инкапсулировать в класс и методы.
 

Фанат

oncle terrible
Команда форума
svetasmirnova
у димысмирнова описаны совсем другие шаблоны, а не то уродство, которое здесь продемонстрировано.

Броед про быстродевствие из темы удалить бы надо...

Вообще, по количеству бреда эта тема рекордсмен.
Хоть закрывай на ночь форум.

regi
прислушайся к скрежету.
 

regi

Новичок
прислушался :)
но, опять же, про инклуд - первый мой пример таким же в принципе и является, какой предложил Screjet.
И я так и не понял, можно ли пользоваться способом, который я показал последним, то есть со str_replace.
 

Фанат

oncle terrible
Команда форума
<?
$main.='<table width="400px" border="1">
<tr>
<td>'.$ntitle.'</td>
</tr>
<tr>
<td>'.$nbody.'</td>
</tr>
</table>
<br>';
?>
вот это не пример скрежета, а порнография.

И я так и не понял, можно ли пользоваться способом, который я показал последним, то есть со str_replace.
Можно.
У этого метода есть свои минусы.
поскольку РЕАЛЬНО отображение - это та же логика.
Голым шаблоном обойтись все равно нельзя.
Если есть емейл - его надо оформлять ссылкою.
Если нету - не надо. условный переход.
строки надо выводить в цикле. цикл.
Логика.

При методе стр_реплейс. Приходится всю логику вывода класть на скрипт, а в шаблоне все равно кроме имен переменных надо выделять блоки.
Пример работы с таким шаблоном есть тут http://eugene.net.ru/other/php/portal/intro.php

пример работы шаблона скрежета привела по ссылке светасмирнова
 

advocat

developer
Фанат
только чуток дополню тебя :) по поводу логики именно в шаблонах - есть smarty 8)
 
Сверху