PHP

Однотипные странички

Сразу замечу, что все нижесказанное адресовано прежде всего тем, кто либо слабо, либо вовсе не знаком с PHP.

Представим, что у нас есть разработанный дизайн web-странички без контента и, к примеру, 30 текстов (статей, интервью, рассказов, стихотворений, листингов и пр.). Наша задача заключается в том, чтобы создавать для текстов свои странички, которые будут отличаться друг от друга лишь содержанием.

Первый способ - очевидный - сделать 30 копий шаблона и вставлять в каждый текст. На этом методе я подробнее останавливаться не буду, потому что итак все понятно. Но у него есть несколько недостатков:
- скучно
- необходимость html-форматирования каждого текста внутри своей странички
- а если текстов 200?!!

Второй способ интересней. Он заключается в том, что мы будем "вытаскивать" содержимое файлов с текстами и переносить его в HTML. При этом никакое копирование не понадобится. Вот на этом методе я остановлюсь.

Для начала возьмем наш шаблон и переименуем его в index.php. Далее, открываем его в блокноте (или другом текстовом редакторе, не сохраняющем форматирование). В том месте, где должны оказаться тексты, будем писать скрипт. Т.е должно получится что-то вроде:
...

...
(Далее буду приводить только текст скрипта.)

В каталоге с index.php создадим папку text и переместим в нее все тексты. Для удобства переименуем эти файлы в text1.txt, text2.txt,...,text30.txt. Пусть заголовком каждой странички будет первая строка соответствующего файла. Пример:

Про медведя <- заголовок
...
Зимой бурый медведь ложится в спячку. Не дай бог его разбудить!!!
...

Скорее всего, странички должны будут ссылаться друг на друга. Т.е в index.php нужно создать 30 ссылок. Мы делать этого не будем (т.к это удел первого метода), а поступим по-умному:). В том месте html-кода, где должны быть ссылки вставляем еще один скрипт (к первому еще вернемся):
<?php 
for($i=1;$i<=30;$i++){ 
//простейший цикл, который повторится 30 раз и заглохнет 
//при этом на первом "обороте" цикла переменная $i равна 1 
//на втором - 2 
//на последнем - 30 
$txt=file("text/text".$i.".txt"); 
//file читает файл в массив. 
//"text/text" - часть пути к файлу, т.е папка и кусок имени файла 
//точка складывает (соединяет) строки 
//.$i - присоединяем к "куску" значение переменной $i 
//.".txt" - добавляем еще расширение 
//на пятом витке цикла путь к файлу - "text/text5.txt" 
//на каждом витке цикла $txt присваивается новое значение 
//в $txt[0] у нас находится заголовок 
//далее выводим на экран ссылки (здесь без стилей - их сами подбирайте) 
echo<<<a 
<a href="index.php?page=$i">$txt[0]</a><br/> 
a; 
//в этом примере получится 30 ссылок, расположенных в столбик 
} 
?>

Жмем на вторую ссылку, в адресной строке видим что-то типа:
http://localhost/dir/index.php?page=2
Теперь в скрипт index.php передана переменная $page со значением 2. Таким образом мы сможем осуществить вывод на экран содержимого второго текста.

Пора переходить к первому скрипту.
<?php 
if(!$page)$page=1; 
//если переменная $page не определена, ей будет присвоено значение 1 
$txt=file("text/text".$page.".txt'); 
for($i=0;$i<count($txt);$i++)$txt[$i]=trim($txt[$i]); 
//вырезаем все пробелы и newline в начале и конце каждой строки 
echo<<<a 
<center style="font:20pt 'arial'">$txt[0]</center> 
a; 
//выводим заголовок 
//если нужно, чтобы заголовок оказался в <TITLE> страницы, то: 
echo<<<a 
<script> 
document.title='$txt[0]'; 
</script> 
a; 
//а теперь выведем на экран основной текст файла 
for($i=1;$i<count($txt);$i++) 
echo<<<a 
<p style="font:10pt 'arial';text-align:justify"> 
$txt[$i] 
</p> 
a; 
//операторные скобки { } можно опустить, т.к в цикле выполняется 
//только один оператор echo. 
?>

Получилось? Да!
А теперь попробуйте вставить в файл HTML-код (<font color="red">часть текста</font>) и перезагрузите страницу. Его не видно, но но он отразился на содержании? А если статья о HTML и без тегов не обойтись? Тогда нам нужно немного изменить скрипт.
<?php 
if(!$page)$page=1; 
$txt=file("text/text".$page.".txt"); 
for($i=0;$i<count($txt);$i++){ 
$txt[$i]=trim($txt[$i]); 

$txt[$i]=str_replace("<","<",$txt[$i]); 
$txt[$i]=str_replace(">",">",$txt[$i]); 
//заменяет > и < на соответствующие мнемоники 

} 
echo<<<a 
<center style="font:20pt 'arial'">$txt[0]</center> 
<script> 
document.title='$txt[0]'; 
</script> 
a; 
for($i=1;$i<count($txt);$i++) 
echo<<<a 
<p style="font:10pt 'arial';text-align:justify"> 
$txt[$i] 
</p> 
a; 
?>


Теперь весь HTML-код, находящийся в файле, не будет восприниматься браузером как код - это просто текст. Таким образом можно организовать online-листинги интересных кодов.

В заключении скажу, что не стоит в качестве переменной $page передавать имя файла целиком. Это создаст огромную дыру в защите сайта. Например, какой-нибудь злой человек введет в строку адреса
index.php?page=../index.php
и увидит PHP-код файла index.php. В нашем примере это не так уж и важно (хотя обидно), но если у вас в файле file.dat хранятся какие-либо важные сведения (пароли зарегистрированных пользователей), то это проблема. Запрос
index.php?page=../file.dat
сведет конфиденциальность к нулю.

Попробуйте изменить скрипты таким образом:
<?php 
for($i=1;$i<=30;$i++){ 
$txt=file("text/text".$i.".txt"); 
echo<<<a 
<a href="index.php?page=text$i.txt">$txt[0]</a><br/> 
a; 
} 
?> 

и
<?php 
if(!$page)$page="text1.txt"; 
$txt=file("text/".$page); 
for($i=0;$i<strlen($txt);$i++){ 
$txt[$i]=trim($txt[$i]); 
$txt[$i]=str_replace("<","<",$txt[$i]); 
$txt[$i]=str_replace(">",">",$txt[$i]); 
echo<<<a 
<center style="font:20pt 'arial'">$txt[0]</center> 
<script> 
document.title='$txt[0]'; 
</script> 
a; 
for($i=1;$i<count($txt);$i++) 
echo<<<a 
<p style="font:10pt 'arial';text-align:justify"> 
$txt[$i] 
</p> 
a; 
?> 

С другой стороны, вряд ли кому придет в голову хранить в текстовом файле пароли, для этих целей создаются базы данных... Но это уже совсем другая история...
Добавлено: 11 Сентября 2013 06:56:38 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...